Đồng hồ kỹ thuật số Arduino sử dụng mô-đun RTC

Hãy Thử Công Cụ CủA Chúng Tôi Để LoạI Bỏ Các VấN Đề





Trong bài đăng này, chúng ta sẽ xây dựng một đồng hồ kỹ thuật số bằng cách sử dụng mô-đun RTC hoặc Real Time Clock. Chúng ta sẽ hiểu mô-đun “RTC” là gì, cách giao tiếp với Arduino và chức năng của nó.

Bởi:



Mô-đun RTC là một mạch theo dõi thời gian hiện tại một cách chính xác. Nó thực hiện hai chức năng, giao tiếp với bộ vi điều khiển và bộ vi xử lý để cung cấp thời gian hiện tại và hoạt động như mạch dự phòng để duy trì thời gian trong trường hợp mất điện, vì nó có hệ thống dự phòng pin tích hợp.

Chúng ta có thể tìm thấy RTC trong bất kỳ thiết bị điện tử nào mà thời gian là một chức năng quan trọng của thiết bị.



Ví dụ: máy tính hoặc máy tính xách tay của chúng tôi duy trì thời gian hoạt động ngay cả khi đã cắm nguồn hoặc tháo pin. Trên bo mạch chủ của bất kỳ máy tính nào, chúng ta có thể tìm thấy một pin CMOS, cung cấp năng lượng cho mạch RTC.

Loại mạch tương tự mà chúng tôi sẽ sử dụng trong dự án này.

Mô-đun RTC là một thiết bị rẻ tiền có thể được tìm thấy trên bất kỳ trang thương mại điện tử nào và cửa hàng dự án điện tử tại địa phương của bạn.

Hình minh họa mô-đun RTC điển hình DS1307:

Hầu hết các mô-đun RTC đi kèm với pin (CR2032) tại thời điểm mua. Có khác nhau về kích thước và mô hình, minh họa ở trên có thể không giống nhau cho bạn. Nhưng hãy đảm bảo rằng số kiểu máy là DS1307. Mã được viết trong bài đăng này chỉ tương thích với DS1307.

Bây giờ bạn đã biết vài điều về RTC. Bây giờ, hãy chuyển sang thiết kế đồng hồ kỹ thuật số. Trước khi tiếp tục với dự án này, bạn cần tải xuống thư viện từ các liên kết sau và cài đặt trên IDE của bạn:

• DS1307RTC.h

Liên kết: github.com/PaulStoffregen/DS1307RTC

• TimeLib.h

Liên kết: github.com/PaulStoffregen/Time

Hai thư viện khác sẽ được cài đặt sẵn trên Arduino IDE, nếu bạn đang sử dụng phiên bản mới nhất.

• LiquidCrystal.h

• Wire.h

Mạch:

Kết nối mạch giữa arduino và màn hình LCD là tiêu chuẩn, chúng ta có thể tìm thấy kết nối tương tự trên các dự án dựa trên màn hình LCD khác. Thành phần bổ sung duy nhất là RTC.

Để giảm tắc nghẽn dây trong quá trình thử nghiệm, RTC có thể được lắp trực tiếp vào các chân analog của arduino. Hàn SCl, SDA, Vcc và GND với các chân tiêu đề nam và lắp vào các chân A2 đến A5 như thể hiện trong nguyên mẫu.

Nguyên mẫu của tác giả:

Cách chèn RTC đúng cách trên Arduino:

Nếu RTC của bạn có các vị trí chân khác nhau và không thể sao chép như minh họa ở trên, bạn luôn có thể sử dụng dây để kết nối. Bây giờ thiết lập phần cứng của bạn đã hoàn tất, hãy chuyển sang phần phần mềm của dự án.

Cách đặt thời gian:

Một khi mô-đun RTC được lập trình, nó sẽ duy trì thời gian ngay cả khi nó bị xóa khỏi arduino. Pin sẽ kéo dài ít nhất vài năm.

Không có nút để điều chỉnh thời gian, chương trình sau sẽ đặt thời gian trong RTC. Thời gian tự động được đồng bộ hóa với thời gian trên máy tính của bạn, trong khi biên dịch mã, vì vậy hãy đảm bảo máy tính của bạn được đặt thành thời gian chính xác, trước khi tải lên chương trình.
Tải lên mã “SetTime” này để đặt thời gian khi cắm RTC:

#include  #include  #include  int P=A3 //Assign power pins for RTC int N=A2 const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } 

Sau khi mã này được tải lên, hãy mở màn hình nối tiếp và một thông báo thành công sẽ bật lên cho biết thời gian đã được đặt.

Điều này có nghĩa là kết nối của bạn giữa RTC và arduino là chính xác và thời gian đã được thiết lập.

Bây giờ tải lên đoạn mã sau để hiển thị thời gian trên màn hình LCD.

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  LiquidCrystal lcd(12, 11, 5, 4, 3, 2) int P=A3 int N=A2 void setup() { lcd.begin(16,2) pinMode(P,OUTPUT) pinMode(N,OUTPUT) digitalWrite(P,HIGH) digitalWrite(N,LOW) } void loop() { tmElements_t tm lcd.clear() if (RTC.read(tm)) { if(tm.Hour>=12) { lcd.setCursor(14,0) lcd.print('PM') } if(tm.Hour<12) { lcd.setCursor(14,0) lcd.print('AM') } lcd.setCursor(0,0) lcd.print('TIME:') if(tm.Hour>12) //24Hrs to 12 Hrs conversion// { if(tm.Hour==13) lcd.print('01') if(tm.Hour==14) lcd.print('02') if(tm.Hour==15) lcd.print('03') if(tm.Hour==16) lcd.print('04') if(tm.Hour==17) lcd.print('05') if(tm.Hour==18) lcd.print('06') if(tm.Hour==19) lcd.print('07') if(tm.Hour==20) lcd.print('08') if(tm.Hour==21) lcd.print('09') if(tm.Hour==22) lcd.print('10') if(tm.Hour==23) lcd.print('11') } else { lcd.print(tm.Hour) } lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0,1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0,0) lcd.print('RTC stopped!!!') lcd.setCursor(0,1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0,0) lcd.print('Read error!') lcd.setCursor(0,1) lcd.print('Check circuitry!') } delay(500) } delay(500) } //------------Program Developed by R.Girish-------// 

Khi điều này được thực hiện, bạn sẽ thấy ngày và giờ được hiển thị trên màn hình LCD và đang chạy.

Ghi chú: Mã “SetTime” được sửa đổi từ mã ví dụ của DS1307RTC để tối ưu hóa kết nối dây cho mô-đun RTC, tải lên mã gốc sẽ không đặt thời gian.

Đồng hồ báo thức kỹ thuật số sử dụng Arduino

Ở phần trên, chúng ta đã học cách xây dựng đồng hồ Arduino cơ bản bằng cách sử dụng mô-đun RTC, trong phần sau, chúng ta tìm hiểu cách nâng cấp điều này thành mạch đồng hồ báo thức kỹ thuật số bằng Arduino.

Có một số người không cần đồng hồ báo thức, họ thức dậy một cách tự nhiên và có một số người thức dậy sau khi đồng hồ báo thức đổ chuông vài lần và có một số người nhấn nút báo lại hàng loạt lần và đi học đại học / đi làm muộn với một số lời bào chữa.

Dự án đồng hồ báo thức nhỏ vui nhộn được đề xuất có thể đối mặt với vấn đề lười biếng khi thức dậy vào buổi sáng. Hầu hết các đồng hồ báo thức đều có nút báo lại và xác định trước thời gian ngắt để báo thức nếu người dùng không phản hồi.

Chúng tôi đã thiết kế đồng hồ báo thức này không có nút lười (nút báo lại) và báo thức sẽ không tắt cho đến khi người dùng nhấn một nút.

Đồng hồ này có thể hiển thị thời gian ở định dạng 12 giờ và ngày ở định dạng DD / MM / YYYY.

Ngày và giờ sẽ được hiển thị trên màn hình LCD 16 x 2. Mô-đun thời gian RTC hoặc đồng hồ thời gian thực sẽ đảm nhiệm việc theo dõi thời gian và có thể giữ lại thời gian chính xác ngay cả sau khi cắt điện lâu.

Có 5 nút được cung cấp chức năng của ai sẽ được giải thích ngay sau đây. Bộ não của dự án Arduino có thể bất kỳ mô hình nào mà bạn lựa chọn, chúng tôi khuyên bạn nên sử dụng Arduino pro mini hoặc Arduino nano vì kích thước nhỏ gọn của nó.

Bây giờ chúng ta hãy đi sâu vào sơ đồ.

Trên đây là sơ đồ cho Arduino kết nối hiển thị, điều chỉnh độ tương phản hiển thị bằng cách xoay chiết áp 10K.

Dưới đây là phần còn lại của mạch:

Mạch có thể được cấp nguồn cho bộ chuyển đổi âm tường 9V 500mA.

Chức năng của 5 nút:

S1 - Điều này được sử dụng để dừng cảnh báo (nó cũng là nút đặt lại).
S2 - Được sử dụng để cài đặt cảnh báo. Bằng cách nhấn và giữ S2, bạn sẽ đến menu cài đặt báo thức.
S3 - Nó được sử dụng để tăng giờ.
S4 - nó được sử dụng để tăng phút.
S5 - Được sử dụng để chuyển đổi trạng thái cảnh báo. Nếu “*” tồn tại trên màn hình LCD ở góc dưới bên phải, cảnh báo đang BẬT, nếu “*” không tồn tại, thống kê cảnh báo sẽ TẮT.

Chi tiết hơn về cách đặt báo thức được giải thích ở cuối bài viết.

Tải xuống các tệp thư viện bên dưới:

Liên kết1: github.com/PaulStoffregen/DS1307RTC
Link2: github.com/PaulStoffregen/Time

Bây giờ, chúng ta phải đặt thời gian cho mô-đun RTC, thời gian sẽ được đồng bộ hóa từ PC của bạn sang mô-đun RTC.

Tải lên mã dưới đây để đặt thời gian và mở Màn hình nối tiếp:

//------------------------------------------------// #include  #include  #include  const char *monthName[12] = { 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' } tmElements_t tm void setup() { bool parse=false bool config=false // get the date and time the compiler was run if (getDate(__DATE__) && getTime(__TIME__)) { parse = true // and configure the RTC with this info if (RTC.write(tm)) { config = true } } Serial.begin(9600) while (!Serial)  // wait for Arduino Serial Monitor delay(200) if (parse && config) { Serial.print('DS1307 configured Time=') Serial.print(__TIME__) Serial.print(', Date=') Serial.println(__DATE__) } else if (parse) { Serial.println('DS1307 Communication Error :-{') Serial.println('Please check your circuitry') } else { Serial.print('Could not parse info from the compiler, Time='') Serial.print(__TIME__) Serial.print('', Date='') Serial.print(__DATE__) Serial.println(''') } } void loop() { } bool getTime(const char *str) { int Hour, Min, Sec if (sscanf(str, '%d:%d:%d', &Hour, &Min, &Sec) != 3) return false tm.Hour = Hour tm.Minute = Min tm.Second = Sec return true } bool getDate(const char *str) { char Month[12] int Day, Year uint8_t monthIndex if (sscanf(str, '%s %d %d', Month, &Day, &Year) != 3) return false for (monthIndex = 0 monthIndex < 12 monthIndex++) { if (strcmp(Month, monthName[monthIndex]) == 0) break } if (monthIndex >= 12) return false tm.Day = Day tm.Month = monthIndex + 1 tm.Year = CalendarYrToTm(Year) return true } //----------------------------------------// 

Bây giờ bạn đã đặt thành công thời gian thành RTC
Tiếp theo, bạn cần tải lên mã chính sau:

//------------Program Developed by R.Girish-------// #include  #include  #include  #include  #include  const int rs = 7 const int en = 6 const int d4 = 5 const int d5 = 4 const int d6 = 3 const int d7 = 2 const int buzzer = 8 boolean alarm = false boolean outloop = true const int setAlarm = A0 const int Hrs = A1 const int Min = A2 const int ok = A3 const int HrsADD = 0 const int MinADD = 1 const int ALsave = 2 int HrsVal = 0 int MinVal = 0 int H = 0 int M = 0 int S = 0 int i = 0 int j = 0 int k = 0 LiquidCrystal lcd(rs, en, d4, d5, d6, d7) void setup() { Serial.begin(9600) lcd.begin(16, 2) pinMode(buzzer, OUTPUT) pinMode(setAlarm, INPUT) pinMode(Hrs, INPUT) pinMode(Min, INPUT) pinMode(ok, INPUT) digitalWrite(setAlarm, HIGH) digitalWrite(Hrs, HIGH) digitalWrite(Min, HIGH) digitalWrite(ok, HIGH) } void loop() { tmElements_t tm lcd.clear() if (EEPROM.read(ALsave) == false) { lcd.setCursor(15, 1) lcd.print('') } if (EEPROM.read(ALsave) == true) { lcd.setCursor(15, 1) lcd.print(F('*')) } if (RTC.read(tm)) { if (tm.Hour >= 12) { lcd.setCursor(14, 0) lcd.print('PM') } if (tm.Hour < 12) { lcd.setCursor(14, 0) lcd.print('AM') } lcd.setCursor(0, 0) lcd.print('TIME:') H = tm.Hour if (tm.Hour > 12) { if (tm.Hour == 13) { lcd.print('01') } if (tm.Hour == 14) { lcd.print('02') } if (tm.Hour == 15) { lcd.print('03') } if (tm.Hour == 16) { lcd.print('04') } if (tm.Hour == 17) { lcd.print('05') } if (tm.Hour == 18) { lcd.print('06') } if (tm.Hour == 19) { lcd.print('07') } if (tm.Hour == 20) { lcd.print('08') } if (tm.Hour == 21) { lcd.print('09') } if (tm.Hour == 22) { lcd.print('10') } if (tm.Hour == 23) { lcd.print('11') } } else { lcd.print(tm.Hour) } M = tm.Minute S = tm.Second lcd.print(':') lcd.print(tm.Minute) lcd.print(':') lcd.print(tm.Second) lcd.setCursor(0, 1) lcd.print('DATE:') lcd.print(tm.Day) lcd.print('/') lcd.print(tm.Month) lcd.print('/') lcd.print(tmYearToCalendar(tm.Year)) } else { if (RTC.chipPresent()) { lcd.setCursor(0, 0) lcd.print('RTC stopped!!!') lcd.setCursor(0, 1) lcd.print('Run SetTime code') } else { lcd.clear() lcd.setCursor(0, 0) lcd.print('Read error!') lcd.setCursor(0, 1) lcd.print('Check circuitry!') } } if (digitalRead(setAlarm) == LOW) { setALARM() } if (H == EEPROM.read(HrsADD) && M == EEPROM.read(MinADD) && S == 0) { if (EEPROM.read(ALsave) == true) { sound() } } if (digitalRead(ok) == LOW) { if (EEPROM.read(ALsave) == true) { EEPROM.write(ALsave, 0) alarm = false delay(1000) return } if (EEPROM.read(ALsave) == false) { EEPROM.write(ALsave, 1) alarm = true delay(1000) return } } delay(1000) } void setALARM() { HrsVal = EEPROM.read(HrsADD) MinVal = EEPROM.read(MinADD) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(' Min:')) lcd.print(EEPROM.read(MinADD)) delay(600) while (outloop) { if (HrsVal > 23) { HrsVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (MinVal > 59) { MinVal = 0 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) } if (digitalRead(Hrs) == LOW) { HrsVal = HrsVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(Min) == LOW) { MinVal = MinVal + 1 lcd.clear() lcd.setCursor(0, 0) lcd.print(F('>>>>SET ALARM<<<')) lcd.setCursor(0, 1) lcd.print(F('Hrs:')) lcd.print(HrsVal) lcd.print(F(' Min:')) lcd.print(MinVal) delay(250) } if (digitalRead(setAlarm) == LOW) { EEPROM.write(HrsADD, HrsVal) EEPROM.write(MinADD, MinVal) lcd.clear() lcd.setCursor(0, 0) lcd.print(F('Alarm is Set for')) lcd.setCursor(0, 1) lcd.print(EEPROM.read(HrsADD)) lcd.print(F(':')) lcd.print(EEPROM.read(MinADD)) lcd.print(F(' Hrs')) delay(1000) outloop = false } } outloop = true } void sound() { lcd.clear() lcd.setCursor(0, 0) lcd.print('Wakey Wakey !!!') lcd.setCursor(0, 1) lcd.print('Its Time now.....') for (j = 0 j < 10 j++) { for (i = 0 i < 2  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(400) } for (k = 0 k < 10 k++) { for (i = 0 i < 4  i++) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } delay(250) } while (true) { digitalWrite(buzzer, HIGH) delay(150) digitalWrite(buzzer, LOW) delay(150) } } //------------Program Developed by R.Girish-------// 

Sau khi tải lên đoạn mã trên, bạn phải xem ngày và giờ chính xác chạy trên màn hình.

Bây giờ, hãy xem cách đặt báo thức:
• Nhấn và giữ S2 cho đến khi bạn có thể nhìn thấy menu Báo thức.
• Nhấn S3 và S4 để điều chỉnh giờ và phút tương ứng.
• Sau khi đặt thời gian mong muốn, nhấn S2 một lần nữa. Nó sẽ cho biết “Báo thức được đặt cho xx: xx giờ”.
• Nếu báo thức BẬT, bạn có thể thấy biểu tượng “*” trên màn hình, nếu báo thức TẮT sẽ không có biểu tượng “*”.
• Bạn có thể bật / tắt báo thức bằng cách nhấn S5 trong nửa giây. Đừng nhấn và giữ cho đến khi “*” biến mất (nó xuất hiện trở lại), chỉ cần nhấn lâu nửa giây để chuyển đổi trạng thái báo thức.

LƯU Ý QUAN TRỌNG:

Sai lầm phổ biến nhất trong khi đặt báo thức trên bất kỳ đồng hồ nào là vô tình chuyển đổi AM / PM, dẫn đến không đổ chuông báo thức vào thời gian mong muốn của chúng ta.

Để giải quyết vấn đề này, cài đặt đồng hồ báo thức được đề xuất được thiết kế trên định dạng đồng hồ 24 giờ.

Thời gian hiển thị trên màn hình LCD sẽ là 12 giờ với định dạng AM / PM nhưng khi bạn đặt báo thức với dự án này, bạn phải đặt ở định dạng 24 giờ từ 0 đến 23 giờ.

Ví dụ: nếu bạn muốn đặt báo thức lúc 9:00 tối, bạn phải đặt 21 giờ 0 phút. Đối với, 5 giờ sáng: 5 giờ 0 phút, v.v.

Nguyên mẫu của tác giả:

Bạn có thích dự án này không? Có bất kỳ câu hỏi nào liên quan đến dự án này, hãy bày tỏ trong phần bình luận, bạn có thể nhận được câu trả lời nhanh chóng.

Đoạn ghi hình:




Một cặp: Mạch chỉ báo mức Beacon cho các thùng chứa ngũ cốc kết hợp máy gặt Tiếp theo: 3 Mạch Biến Tần Sóng Sinewave Công Suất Cao SG3525