P3 – Đồng hồ vạn niên với RTC DS1307

Chip thời gian thực DS1307 có giá thành rẻ, độ chính xác tương đối.  Hiện nay chip DS1307 thường được gắn sẵn lên mạch có kèm pin nên rất dễ sử dụng.

Chip nguyên gốc (loại gắn trên mạch RTC là chip chân dán)

Kết nối mạch RTC (kèm pin) với vi xử lý rất đơn giản, mạch dùng chuẩn I2C hai dây cơ bản

Sơ đồ chính (màu mạch không quan trọng)

Khi nạp chương trình (Upload) thì mạch RTC sẽ nhận thời gian giống như trên máy tính. Nếu thời gian trên mạch sai, tháo pin ra ít nhất 3s trước khi gắn trở lại.

Chương trình có sử dụng thư viện RTC.

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>

// LCD display
const int rs = 12, en = 11, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
//

RTC_DS1307 rtc;

char daysOfTheWeek[7][7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

void setup () 
{
 // LCD 16x2
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);

Serial.begin(57600);
 if (! rtc.begin()) 
 {
 Serial.println("Couldn't find RTC");
 while (1);
 }

if (! rtc.isrunning()) 
 {
 Serial.println("RTC is NOT running!");
 // following line sets the RTC to the date & time this sketch was compiled
 rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
 // This line sets the RTC with an explicit date & time, for example to set
 // January 21, 2014 at 3am you would call:
 // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
 }
}

void loop () 
{
 DateTime now = rtc.now();

Serial.print(now.year(), DEC);
 Serial.print('/');
 Serial.print(now.month(), DEC);
 Serial.print('/');
 Serial.print(now.day(), DEC);
 Serial.print(" (");
 Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
 Serial.print(")");

Serial.print(now.hour(), DEC);
 Serial.print(':');
 Serial.print(now.minute(), DEC);
 Serial.print(':');
 Serial.print(now.second(), DEC);
 Serial.println();

lcd.setCursor(0, 0);
 lcd.print(now.day(), DEC);
 lcd.print('/');
 lcd.print(now.month(), DEC);
 lcd.print('/');
 lcd.print(now.year(), DEC);
 lcd.print(" (");
 lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
 lcd.println(") ");

lcd.setCursor(0, 1);
 lcd.print(now.hour(), DEC);
 lcd.print(':');
 lcd.print(now.minute(), DEC);
 lcd.print(':');
 lcd.print(now.second(), DEC);
 lcd.print(" ");
 lcd.println();
 
 delay(1000);
}

Hãy subsribe (Đăng ký) theo dõi kênh youtube sau để cập nhật dự án mới

 

Leave a Reply

Your email address will not be published. Required fields are marked *