ใช้แผงวงจร arduino uno r3 เขียนโปรแกรม แสดงเวลา ที่ 7-SEGMENT 4 หลัก โดยผ่าน TM1637 อ่านเวลาจาก โมดูลเวลา DS3231 ตัวอย่างโปรเจค Arduino นาฬิกา ง่ายๆ
ส่วนประกอบที่จำเป็นต้องใช้ สำหรับนาฬิกาดิจิตอล
- บอร์ด Arduino (Arduino Uno)
- โมดูล DS3231 RTC
- โมดูล TM1637 แสดงผล 7 ส่วน 4 หลัก แบบนาฬิกา 7-SEGMENT 0.56″ DISPLAY 4-DIGIT TM1637 MODULE with case (รายละเอียดเพิ่มเติม)
- โมดูลสวิตช์
- สายจัมเปอร์
การเชื่อมต่อสายไฟ
- เชื่อมต่อพิน VCC ของโมดูล DS3231 เข้ากับพิน 5V บน Arduino
- เชื่อมต่อพิน GND ของโมดูล DS3231 เข้ากับพิน GND บน Arduino
- เชื่อมต่อพิน SDA ของโมดูล DS3231 เข้ากับพิน A4 หรือ SDA บน Arduino
- เชื่อมต่อพิน SCL ของโมดูล DS3231 เข้ากับพิน A5 หรือ SCL บน Arduino
- เชื่อมต่อพิน VCC ของโมดูล TM1637 เข้ากับพิน 5V บน Arduino (ใช้สายแพรที่มากับโมดูลเสียบตามรูป)
- เชื่อมต่อพิน GND ของโมดูล TM1637 เข้ากับพิน GND บน Arduino (ใช้สายแพรที่มากับโมดูลเสียบตามรูป)
- เชื่อมต่อพิน CLK ของโมดูล TM1637 เข้ากับพินดิจิทัลใดๆ (เช่น พิน 2) บน Arduino (ใช้สายแพรที่มากับโมดูลเสียบตามรูป)
- เชื่อมต่อพิน DIO ของโมดูล TM1637 เข้ากับพินดิจิทัลใดๆ (เช่น พิน 3) บน Arduino (ใช้สายแพรที่มากับโมดูลเสียบตามรูป)
- เชื่อมต่อพิน สวิตช์ Mode ของโมดูลสวิตช์ เข้ากับพิน 2 บน Arduino
- เชื่อมต่อพิน สวิตช์ Up ของโมดูลสวิตช์ เข้ากับพิน 3 บน Arduino
- เชื่อมต่อพิน สวิตช์ Down ของโมดูลสวิตช์ เข้ากับพิน 4 บน Arduino
- เชื่อมต่อพิน GND ของโมดูลสวิตช์ เข้ากับพิน GND บน Arduino
โมดูลรุ่นตัวเล็ก DS3231
Pin 1 = 5V
Pin 2 = SDA “D” is data
Pin 3 = SCL “C” is clock
Pin 4 = not connected “NC” is Not Connected
Pin 5 = GND “-” is GND

นาฬิกา ARDUINO DS3231 7-SEGMENT 0.56″ DISPLAY 4-DIGIT TM1637 MODULE
การทำงานของโปรแกรม
- include ส่วนที่จำเป็นต้องใช้งาน
- ตั้งชื่อขา PIN ที่จะใช้งาน
- กำหนดค่าคงที่ และตั้งชื่อตัวแปร
- เขียน Function ของไอซี TM1637 เพื่อขับ 7-SEGMENT
- เขียน Function ของไอซี DS3231 เพื่ออ่าน เวลาจากไอซี DS3231
- กำหนดค่าใน void setup(){}
- เขียนโปรแกรมการทำงานใน void loop(){
– อ่านค่าจากไอซี DS3231
– นำค่าเวลาที่ได้ส่งไปที่ ไอซี TM1637 เพื่อขับ 7-SEGMENT
– เขียน Function สำหรับแก้ใข เวลา ชั่งโมง นาที และระดับความสว่างของหน้าจอ
}
โค๊ดการทำงาน
#include <Arduino.h> #include <Wire.h> // นำ Wire.h เข้ามา #define CLK 13 // TM1637 CLK #define DIO 12 // TM1637 DIO #define Mode 2 // ปุ่มกด Mode #define Up 3 // ปุ่มกด Up #define Down 4 // ปุ่มกด Down const int RTC_ADDRESS = 0x68; // I2C address of DS3231 /*********** TM1637 ***************/ const byte Seg[] { // DP G F E D C B A ประกาศตัวแปรสำหรับแสดงผลเป็น ARRAY ตาม INDEX 0b00111111, // 0 0b00000110, // 1 0b01011011, // 2 0b01001111, // 3 0b01100110, // 4 0b01101101, // 5 0b01111101, // 6 0b00000111, // 7 0b01111111, // 8 0b01101111, // 9 0b11111111, // All -- 10 ติดทั้งหมดควรหลีกเลี่ยงเพราะกินไฟพร้อมกันเยอะไม่ดี 0b00000000, // Blank ดับ (space) -- 11 }; byte bri = 0x0F; // สว่างสุด bool DP = false; // เก็บสถานะบิตการกระพริบ void Setup_7Seg(){ // Function สำหรับขับตั้งค่าเริ่มต้น 7Segment pinMode(CLK, OUTPUT); // ให้ CLK เป็น OUTPUT pinMode(DIO, OUTPUT); // ให้ DIO เป็น OUTPUT delay(250); // หน่วงเวลา 250mS pinMode(CLK, INPUT); // ให้ CLK เป็น INPUT pinMode(DIO, INPUT); // ให้ DIO เป็น INPUT digitalWrite(CLK, 0); digitalWrite(DIO, 0); } void delayBit(){ // Function หน่วงเวลา 10uS delayMicroseconds(10); } void Start(){ pinMode(DIO, OUTPUT); delayBit(); } void Stop(){ pinMode(DIO, OUTPUT); delayBit(); pinMode(CLK, INPUT); delayBit(); pinMode(DIO, INPUT); delayBit(); } void Send_Bit(byte dataI){ byte data = dataI; for(int i = 0; i < 8; i++){ pinMode(CLK, OUTPUT); delayBit(); if(data & 0x01){ pinMode(DIO, INPUT); } else{ pinMode(DIO, OUTPUT); } delayBit(); pinMode(CLK, INPUT); delayBit(); data = data >> 1; } pinMode(CLK, OUTPUT); pinMode(DIO, INPUT); delayBit(); pinMode(CLK, INPUT); delayBit(); uint8_t ack = digitalRead(DIO); if(ack == 0){ pinMode(DIO, OUTPUT); } delayBit(); pinMode(CLK, OUTPUT); delayBit(); } void Write7Seg(int data, byte Bri, byte Pos, byte DP){ Start(); Send_Bit(0x40 | 0x04); Stop(); Start(); Send_Bit(0xC0 | Pos); Send_Bit(Seg[data] | DP); Stop(); Start(); Send_Bit(0x80 | Bri); Stop(); } void DP_Blink(){ // ควบคุมการกระพริบของ 2 จุด สำหรับนาฬิกา static unsigned long current_time_DP = millis(); if((millis() - current_time_DP) > 400){ DP = !DP; current_time_DP = millis(); } } void updateDisplay(byte hour, byte minute){ // แสดงเวลา Write7Seg(hour / 10, bri, 0x00, 0); if(DP){ Write7Seg(hour % 10, bri, 0x01, 0x80); }else{ Write7Seg(hour % 10, bri, 0x01, 0x00); } Write7Seg(minute / 10, bri, 0x02, 0); Write7Seg(minute % 10, bri, 0x03, 0); } void updateBri(byte bri){ // แสดงเวลา Write7Seg(11, bri, 0x00, 0x80); Write7Seg(11, bri, 0x01, 0x00); Write7Seg(11, bri, 0x02, 0x00); Write7Seg(bri - 7, bri, 0x03, 0x00); //Serial.println("gggggg"); } /*********** DS3231 ***************/ void i2cStart(){ // Function to send a start condition on the I2C bus Wire.beginTransmission(RTC_ADDRESS); Wire.write((byte)0x00); Wire.endTransmission(); } void i2cStop(){ // Function to send a stop condition on the I2C bus Wire.beginTransmission(RTC_ADDRESS); Wire.endTransmission(); } void i2cWrite(byte regAddress, byte data){ // Function to write a byte of data to a specific register address Wire.beginTransmission(RTC_ADDRESS); Wire.write(regAddress); Wire.write(data); Wire.endTransmission(); } byte i2cRead(byte regAddress){ // Function to read a byte of data from a specific register address Wire.beginTransmission(RTC_ADDRESS); Wire.write(regAddress); Wire.endTransmission(); Wire.requestFrom(RTC_ADDRESS, 1); return Wire.read(); } byte bcdToDecimal(byte bcdValue){ // Function to convert BCD to decimal return ((bcdValue >> 4) * 10) + (bcdValue & 0x0F); } byte decimalToBcd(byte decimalValue){ return ((decimalValue / 10) << 4) + (decimalValue % 10); } bool SW_Pressed(uint8_t button){ static unsigned long current_time_sw_press = millis(); if(((!digitalRead(button)) && (millis() - current_time_sw_press) > 200)){ current_time_sw_press = millis(); return true; }else{ return false; } } void setup(){ pinMode(Mode, INPUT_PULLUP); pinMode(Up, INPUT_PULLUP); pinMode(Down, INPUT_PULLUP); //Serial.begin(9600); Wire.begin(); Setup_7Seg(); } void loop(){ i2cStart(); byte minute = bcdToDecimal(i2cRead(0x01)); byte hour = bcdToDecimal(i2cRead(0x02) & 0b111111); // 24-hour format i2cStop(); DP_Blink(); updateDisplay(hour, minute); //Serial.print(hour); //Serial.print(":"); //Serial.println(minute); if(SW_Pressed(Mode)){ // ตั้งค่า uint8_t mode_setting = 0; bri = 0x0F; mode_setting++; bool status_setting = true; while(status_setting){ bool Set_Time_Hour_status = true; bool Set_Time_Minute_status = true; bool Set_Bri_status = true; switch (mode_setting){ case 1: i2cStart(); hour = bcdToDecimal(i2cRead(0x02) & 0b111111); // 24-hour format i2cStop(); do{ updateDisplay(hour, minute); delay(200); DP = true; Write7Seg(11, bri, 0x00, 0x80); Write7Seg(11, bri, 0x01, 0x80); delay(100); if(SW_Pressed(Mode)){ i2cStart(); i2cWrite(0x02, decimalToBcd(hour)); i2cStop(); mode_setting++; Set_Time_Hour_status = false; } if(SW_Pressed(Up)){ if(hour != 23){hour++;} } if(SW_Pressed(Down)){ if(hour != 0){hour--;} } }while(Set_Time_Hour_status); break; case 2: i2cStart(); minute = bcdToDecimal(i2cRead(0x01)); i2cStop(); do{ updateDisplay(hour, minute); delay(200); Write7Seg(11, bri, 0x02, 0x00); Write7Seg(11, bri, 0x03, 0x00); delay(100); if(SW_Pressed(Mode)){ i2cStart(); i2cWrite(0x01, decimalToBcd(minute)); i2cStop(); mode_setting++; Set_Time_Minute_status = false; } if(SW_Pressed(Up)){ if(minute != 59){minute++;} } if(SW_Pressed(Down)){ if(minute != 0){minute--;} } }while(Set_Time_Minute_status); break; case 3: do{ updateBri(bri); delay(200); Write7Seg(11, bri, 0x03, 0x00); delay(100); if(SW_Pressed(Mode)){ mode_setting++; Set_Bri_status = false; } if(SW_Pressed(Up)){ if(bri != 15){bri++;} } if(SW_Pressed(Down)){ if(bri != 8){bri--;} } }while(Set_Bri_status); break; default: mode_setting = 0; //Serial.println("default"); status_setting = false; Set_Time_Hour_status = true; Set_Time_Minute_status = true; Set_Bri_status = true; delay(500); break; } } } }
ดาวโหลดโค๊ด code ARDUINO_DS3231_7-SEGMENT_0.56_DISPLAY_4-DIGIT_TM1637_MODULE

ARDUINO_DS3231_7-SEGMENT_0.56_DISPLAY_4-DIGIT_TM1637_MODULE
วีดีโอ ARDUINO DS3231 7-SEGMENT 0.56″ DISPLAY 4-DIGIT TM1637 MODULE