Arduino so sánh các module thời gian năm 2024

Bài này, chúng ta sẽ sử dụng module RTC DS1307 dựa trên giao thức I2C. Module cung cấp chi tiết cách điều chỉnh thời gian như thứ, phút, giờ, ngày trong tuần, ngày trong tháng, tháng và năm bao gồm cả sự điều chỉnh cho năm nhuận. Nó có thể hoạt động ở định dạng 12 giờ hoặc 24 giờ. Dòng tiêu thụ của module này rất nhỏ [vài nA]. Chính vì vậy một nguồn Pin 3V cũng có thể cung cấp năng lượng cho nó trong 10 năm để duy trì đồng hồ chính xác và không có bất kỳ nguồn điện bên ngoài nào. DS1307 có bộ nhớ 64 byte trong đó 8 byte đầu tiên được dành làm vùng dữ liệu RTC và 56 byte còn lại là RAM sử dụng cho mục đích chung. Các chi tiết về ngày và thời gian hiện tại được lưu trữ trong RTC dưới dạng số thập phân mã hóa nhị phân. Module giao tiếp với vi điều khiển bằng giao thức giao tiếp nối tiếp I2C. Bus I2C bao gồm 2 dây là SDA và SCL. SDA là dòng dữ liệu nối tiếp và SCL là dòng nối tiếp. Mỗi thiết bị được kết nối với bus đều có địa chỉ thiết bị duy nhất của riêng nó, bất kể đó là module MCU hay RTC. Mỗi chip này có thể hoạt động như một máy thu hoặc máy phát, tùy thuộc vào chức năng.

DS1307 làm việc trong mạng truyền thông và bộ điều khiển chỉ có thể truy cập bằng cách khởi tạo một điều kiện bắt đầu cùng với địa chỉ thiết bị. I2C với các chân SDA và SCL được kết nối với các chân tương ứng của arduino. Về phần mềm, chúng ta sẽ sử dụng thư viện arduino có tên là Wire cho giao tiếp I2C. Thư viện này cho phép bạn giao tiếp với các thiết bị I2C / TWI.

Sơ đồ mạch

Chương trình

include

include

define DS1307_ADDRESS 0x68

LiquidCrystal lcd[13,12,11,10,9,8];

boolean MODE = false;

byte Dec_To_BCD[byte dec]{

return[ [dec/10*16] + [dec%10] ];

}

byte BCD_To_Dec[byte BCD]{

return[ [BCD/16*10] + [BCD%16] ];

}

void Mode12[]{

MODE=true;

}

void Mode24[]{

MODE=false;

}

void setTime[byte SEC, byte MIN, byte HOUR, byte DOW, byte DOM, byte MONTH, byte YEAR]

{

Wire.beginTransmission[DS1307_ADDRESS];

Wire.write[0];

Wire.write[Dec_To_BCD[SEC]];

Wire.write[Dec_To_BCD[MIN]];

Wire.write[Dec_To_BCD[HOUR]];

Wire.write[Dec_To_BCD[DOW]];

Wire.write[Dec_To_BCD[DOM]];

Wire.write[Dec_To_BCD[MONTH]];

Wire.write[Dec_To_BCD[YEAR]];

Wire.endTransmission[];

}

void getTime[byte *SEC, byte *MIN, byte *HOUR]

{

Wire.beginTransmission[DS1307_ADDRESS];

Wire.write[0];

Wire.endTransmission[];

Wire.requestFrom[DS1307_ADDRESS, 7];

*SEC = BCD_To_Dec[Wire.read[]&0x7f];

*MIN = BCD_To_Dec[Wire.read[]];

*HOUR = BCD_To_Dec[Wire.read[]&0x3f];

}

void getDate[byte *DOM, byte *MONTH, byte *YEAR]

{

Wire.beginTransmission[DS1307_ADDRESS];

Wire.write[4];

Wire.endTransmission[];

Wire.requestFrom[DS1307_ADDRESS, 7];

*DOM = BCD_To_Dec[Wire.read[]];

*MONTH = BCD_To_Dec[Wire.read[]];

*YEAR = BCD_To_Dec[Wire.read[]];

}

byte getWeek[]

{

Wire.beginTransmission[DS1307_ADDRESS];

Wire.write[3];

Wire.endTransmission[];

Wire.requestFrom[DS1307_ADDRESS, 7];

return[BCD_To_Dec[Wire.read[]]];

}

String getTimeStr[]

{

String ALL;

byte SEC, MIN, HOUR,AM_PM;

getTime[&SEC, &MIN, &HOUR];

if[!MODE]

{

if [HOUR

Chủ Đề