74hc595 7 segment 8 digit ทดลอง_001

โปรแกรมแสดง ผล LED 7 Segment 8 digit โดยแสดงผลลัพพ์เป็น 0-9 จากนั้นแสดง เป็น เวลา 00:00:00 - 23:59:59


1.หลักการทำงาน

หลักการทำงานของ 7 Segment คือการส่งสัญญาณไฟฟ้ามาประกอบกันเพื่อสร้างรูปแบบตัวเลข ตัว โดยจะมี ส่วนสำหรับแสดงผล ทั้งนี้ส่วนของ 7 Segment มีรูปแบบเดียวกันทุกตัว แต่จะแตกต่างกันตามการเชื่อมต่อกับวงจร ซึ่งส่วนของ 7 Segment จะแสดงผลตัวเลขโดยการประกอบไปด้วย ส่วนหรือเซกเมนต์โดยแต่ละส่วนจะมีชื่อว่า a, b, c, d, e, f, g

2.การต่อวงจร

อุปกรณ์ที่ใช้ในวงจรนี้จะมีอยู่ 2 ตัว และ โปรแกรมสำหรับเขียน Code : Arduino IDE

2.1.WeMos D1 Mini

WeMos D1 mini เป็นบอร์ดพัฒนา ESP8266 บนบอร์ดมีชิปสำหรับ USB to TTL อยู่บนบอร์ดแล้ว ทำให้สามารถเสียบเข้ากับคอมพิวเตอร์ผ่านพอร์ต USB


2.2. 74HC595 7 Segment 8 Digit

74HC595 7 Segment 8 Digit เป็นวงจรที่ใช้ในการแสดงผลตัวเลข 8 หลัก (8 digits) โดยใช้ 7 Segment Display และ IC 74HC595 เพื่อควบคุมการแสดงผล ซึ่งเป็นวงจรที่มักนำมาใช้ในการแสดงผลเวลา หรือข้อมูลต่าง ๆ ที่ต้องแสดงผลในรูปแบบตัวเลข

2.3. Arduino IDE

Arduino IDE เป็นโปรแกรมที่ใช้สำหรับการเขียนโปรแกรมควบคุมและสามารถทำการแปลงไฟล์ดังกล่าวเพื่อนำไปอัพโหลดลงยังบอร์ด Arduino

2.4 ลักษณะการต่อวงจร


ขา Vcc ต่อ 3v3 
ขา GND ต่อ GND 
ขา SCLK ต่อ D5 
ขา RCLK ต่อ D6 
ขา DIO ต่อ D7 


3.โฟลว์ชาร์ตของโปรแกรม



4.วิธีการทดสอบโปรแกรมและCode

ต่อสายจ่ายไฟเลี้ยงเสร็จจากนั้น led 7degmeant จะรันตัวเลข 0 จะไปถึง 9 จากนั้นจะ reset แล้วแสดงผลเป็นนาฬิกาขึ้นมาแทน

Code

#include <TridentTD_7Segs74HC595.h>

#define SCLK D5
#define RCLK D6
#define DIO D7

TridentTD_7Segs74HC595 my7SEGMENT(SCLK, RCLK, DIO);
// ตำแหน่งแสดงตัวเลข

char disp_c[] = { '8', '7', '6', '5', '4', '3', '2', '1' };


int disp[8];

// ค่าเวลาสำหรับวิธีแก้ปัญหาการหน่วงเวลา
unsigned long prev = 0;
unsigned long waitMS = 20;




void setup() {

  pinMode(RCLK, OUTPUT);
  pinMode(DIO, OUTPUT);
  pinMode(SCLK, OUTPUT);

  showDisplay();
}

int n;
int j;
int o;
int m;
int a;
int y;
int unsigned long start = millis();
byte b = 0;
void loop() {
  showDisplay();

  if (b == 0) {
    b++;
    wait(100);  // หน่วงเวลาแสดงข้อความต้อนรับ
  }

  else {
    if (millis() > (prev + waitMS))



    {

      // จุดที่แก้ไข

      disp_c[0] = y % 10;         // แสดงผลหลัก หน่วย
      disp_c[1] = (y / 10) % 10;  // แสดงผลหลัก สิบ
      disp_c[2] = j % 10;         // แสดงผลหลัก ร้อย
      disp_c[3] = (j / 10) % 10;  // แสดงผลหลัก พัน

      disp_c[4] = o % 10;
      disp_c[5] = (o / 10) % 10;
      disp_c[6] = (y / 100000) % 10;
      disp_c[7] = m % 10;
      y++;
      if (a == 1) {
        disp_c[0] = n % 10;         // แสดงผลหลัก หน่วย
        disp_c[1] = (n / 10) % 10;  // แสดงผลหลัก สิบ
        disp_c[2] = j % 10;         // แสดงผลหลัก ร้อย
        disp_c[3] = (j / 10) % 10;  // แสดงผลหลัก พัน

        disp_c[4] = o % 10;
        disp_c[5] = (o / 10) % 10;
        disp_c[6] = (n / 100000) % 10;
        disp_c[7] = m % 10;
        n++;
      }
      if (y == 10) {
        a = 1;
        n = 0;
        y = 10;
        a = 1;
      }
      if (n == 60) {
        j++;
        n = 0;
      }
      if (j == 60) {
        j = 0;
        o++;
      }
      if (o == 24) {
        j = 0;
        n = 0;
        o = 0;
      }

      // หน่วงเวลา
      wait(1000);
    }
  }
}

//ฟังก์ชั่นแสดงผล

void showDisplay() {
  setDisp();
  for (int i = 0; i < 8; i++) {
    setDigit(i, disp[i]);
    for (int a = 0; a < 9; a++) {}
  }
}

void setDigit(int dig, int character) {
  int digits[] = {
    128, 64, 32, 16, 8, 4, 2, 1
  };

  //ตั้งค่าตัวหนังสือ (0-9)0-9
  //            (10-19)0.-9.
  //            (20-45)A-Z
  //            (46-71)a-z
  //            (72)- (73) space
  int characters[] = {
    3, 159, 37, 13, 153, 73, 65, 31, 1, 9,
    2, 158, 36, 12, 152, 72, 64, 30, 0, 8,
    17, 1, 99, 3, 97, 113, 67, 145, 243, 135, 145, 227, 85, 19, 3, 49, 25, 115, 73, 31, 129, 129, 169, 145, 137, 37,
    5, 193, 229, 133, 33, 113, 9, 209, 247, 143, 81, 227, 85, 213, 197, 49, 25, 245, 73, 225, 199, 199, 169, 145, 137, 37,
    253, 255
  };

  digitalWrite(RCLK, LOW);
  shiftOut(DIO, SCLK, LSBFIRST, characters[character]);
  shiftOut(DIO, SCLK, LSBFIRST, digits[dig]);
  digitalWrite(RCLK, HIGH);
}

void setDisp() {
  for (int i = 0; i < 8; i++) {
    int val = disp_c[i];
    if ((val >= 32) && (val <= 47)) {  // ! ถึง / ไม่ให้แสดง
      switch (val) {
        case 45:
          val = 72;
          break;  // เครื่องหมาย -
        default:
          val = 73;
          break;  // ค่าอื่นระหว่างนี้ ไม่ให้แสดง
      }
    } else if ((val >= 48) && (val <= 57))  //0-9
    {
      val -= 48;
    } else if ((val >= 65) && (val <= 90))  //A-Z
    {
      val -= 45;
    } else if ((val >= 97) && (val <= 122))  //a-z
    {
      val -= 51;
    }

    disp[i] = val;
  }
}
void wait(unsigned long milsec) {
  prev = millis();
  waitMS = milsec;
}

5.คลิปทดสอบโปรแกรม


6.แหล่งข้อมูล














ความคิดเห็น