นาฬิกา ARDUINO DS3231 7-SEGMENT 0.56″ DISPLAY 4-DIGIT TM1637 MODULE

ใช้แผงวงจร arduino uno r3 เขียนโปรแกรม แสดงเวลา ที่ 7-SEGMENT 4 หลัก โดยผ่าน TM1637 อ่านเวลาจาก โมดูลเวลา DS3231 ตัวอย่างโปรเจค Arduino นาฬิกา ง่ายๆ

ส่วนประกอบที่จำเป็นต้องใช้ สำหรับนาฬิกาดิจิตอล

  1. บอร์ด Arduino (Arduino Uno)
  2. โมดูล DS3231 RTC
  3. โมดูล TM1637 แสดงผล 7 ส่วน 4 หลัก แบบนาฬิกา 7-SEGMENT 0.56″ DISPLAY 4-DIGIT TM1637 MODULE with case (รายละเอียดเพิ่มเติม)
  4. โมดูลสวิตช์
  5. สายจัมเปอร์

 

 

 

การเชื่อมต่อสายไฟ

  1. เชื่อมต่อพิน VCC ของโมดูล DS3231 เข้ากับพิน 5V บน Arduino
  2. เชื่อมต่อพิน GND ของโมดูล DS3231 เข้ากับพิน GND บน Arduino
  3. เชื่อมต่อพิน SDA ของโมดูล DS3231 เข้ากับพิน A4 หรือ SDA บน Arduino
  4. เชื่อมต่อพิน SCL ของโมดูล DS3231 เข้ากับพิน A5 หรือ SCL บน Arduino
  5. เชื่อมต่อพิน VCC ของโมดูล TM1637 เข้ากับพิน 5V บน Arduino (ใช้สายแพรที่มากับโมดูลเสียบตามรูป)
  6. เชื่อมต่อพิน GND ของโมดูล TM1637 เข้ากับพิน GND บน Arduino (ใช้สายแพรที่มากับโมดูลเสียบตามรูป)
  7. เชื่อมต่อพิน CLK ของโมดูล TM1637 เข้ากับพินดิจิทัลใดๆ (เช่น พิน 2) บน Arduino (ใช้สายแพรที่มากับโมดูลเสียบตามรูป)
  8. เชื่อมต่อพิน DIO ของโมดูล TM1637 เข้ากับพินดิจิทัลใดๆ (เช่น พิน 3) บน Arduino (ใช้สายแพรที่มากับโมดูลเสียบตามรูป)
  9. เชื่อมต่อพิน สวิตช์ Mode ของโมดูลสวิตช์ เข้ากับพิน 2 บน Arduino
  10. เชื่อมต่อพิน สวิตช์ Up ของโมดูลสวิตช์ เข้ากับพิน 3 บน Arduino
  11. เชื่อมต่อพิน สวิตช์ Down ของโมดูลสวิตช์ เข้ากับพิน 4 บน Arduino
  12. เชื่อมต่อพิน 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

นาฬิกา ARDUINO DS3231 7-SEGMENT 0.56″ DISPLAY 4-DIGIT TM1637 MODULE

การทำงานของโปรแกรม 

  1. include ส่วนที่จำเป็นต้องใช้งาน
  2. ตั้งชื่อขา PIN ที่จะใช้งาน
  3. กำหนดค่าคงที่ และตั้งชื่อตัวแปร
  4. เขียน Function ของไอซี TM1637  เพื่อขับ 7-SEGMENT
  5. เขียน Function ของไอซี DS3231 เพื่ออ่าน เวลาจากไอซี DS3231
  6. กำหนดค่าใน void setup(){}
  7. เขียนโปรแกรมการทำงานใน 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

วีดีโอ ARDUINO DS3231 7-SEGMENT 0.56″ DISPLAY 4-DIGIT TM1637 MODULE