Mục lục:

Đồng hồ thời gian thực với Arduino: 3 bước
Đồng hồ thời gian thực với Arduino: 3 bước

Video: Đồng hồ thời gian thực với Arduino: 3 bước

Video: Đồng hồ thời gian thực với Arduino: 3 bước
Video: 🔴 Arduino #28 | Đồng Hồ Thời Gian Thực DS1302 | DS1302 Real Time Clock 2024, Tháng mười một
Anonim
Đồng hồ thời gian thực với Arduino
Đồng hồ thời gian thực với Arduino

Trong dự án này, chúng tôi sẽ tạo một đồng hồ với sự trợ giúp của mô-đun Arduino và RTC. Như chúng ta đã biết Arduino không thể hiển thị thời gian thực vì vậy chúng ta sẽ sử dụng mô-đun RTC để hiển thị thời gian phù hợp trên màn hình LCD. Đọc kỹ tất cả các bước nó sẽ giúp bạn rất nhiều trong việc chế tạo đồng hồ.

Mã DS3231 Arduino giống như mã DS1307 và nó hoạt động với cả chip RTC.

Mã Arduino bên dưới không sử dụng bất kỳ thư viện nào cho DS3231 RTC, thư viện Wire dành cho sự tương ứng giữa Arduino và DS3231 sử dụng quy ước I2C.

Vâng! Nhiều kỹ sư điện tử phụ thuộc vào nó cho các dự án dựa trên thời gian của họ nhưng RTC không hoàn toàn đáng tin cậy. Nó hoạt động bằng pin và sớm muộn gì cũng phải thay thế. Đến với các dự án IoT, nó chiếm các chân SPI (Giao diện ngoại vi nối tiếp) có giá trị và trở nên lộn xộn với các dây quấn xung quanh. Giải pháp…. Đây là anh hùng của chúng ta NTP (Giao thức thời gian mạng). NTP rất chính xác vì nó có thời gian từ internet. Chúng tôi sẽ vận hành giao thức này bằng cách sử dụng chế độ máy khách-máy chủ. quá trình này đơn giản đến mức Nodemcu của chúng tôi hoạt động như một máy khách và yêu cầu một gói NTP từ máy chủ bằng cách sử dụng UDP. Đổi lại, máy chủ gửi một gói đến máy khách để phân tích dữ liệu. NTP là giao thức đồng bộ hóa thời gian phổ quát. Bây giờ hãy để chúng tôi thắp sáng trạm làm việc trong phòng thí nghiệm của chúng tôi

Bước 1: Các thành phần bắt buộc

  • Bảng Arduino
  • Bảng mạch DS3231 RTC
  • Màn hình LCD 16x2
  • 2 x nút nhấn
  • Biến trở 10K ohm (hoặc chiết áp)
  • Điện trở 330 ohm
  • Pin đồng xu 3V
  • Breadboard
  • Dây nhảy

RTC phân tử DS3231

Thời gian là một ý thức thiết yếu cần thiết trong thế giới có nhịp độ nhanh này của con người. Trong dự án thời gian thực

Chúng tôi sử dụng RTC (A. K. A đồng hồ thời gian thực)

RTC Real-time-clock (RTC) là một mạch tích hợp (IC) theo dõi thời gian hiện tại. RTC xử lý thời gian ở chế độ thực. RTC thường được tìm thấy trong bo mạch chủ máy tính và hệ thống nhúng để yêu cầu truy cập kịp thời.

Bước 2: Kết nối Đồng hồ Arduino

Kết nối của Đồng hồ Arduino
Kết nối của Đồng hồ Arduino
  • Kết nối chân SCL với mô-đun RTC với Arduino A5
  • Kết nối chân SDA với mô-đun RTC với Arduino A4
  • Kết nối VCC TO 5v và GND TO GND
  • Kết nối nút bấm với chốt 8
  • Kết nối một nút bấm khác với chốt 9
  • Kết nối RS của LCD với chân 2 của Arduino
  • Kết nối E của LCD với chân 3 của Arduino
  • Kết nối D7 của LCD với chân 7 của Arduino
  • Kết nối D6 của LCD với chân 6 của Arduino
  • Kết nối D5 của LCD với chân 5 của Arduino
  • Kết nối D4 của LCD với chân 4 của Arduino
  • Kết nối VSS & K với GND
  • Kết nối VDD & A với 5v
  • Kết nối vo với chân đầu ra chiết áp

Bước 3: Mã cho Đồng hồ Arduino với RTC

Mã cho đồng hồ Arduino với RTC
Mã cho đồng hồ Arduino với RTC

DS3231 chỉ hoạt động với định dạng BCD và để chuyển đổi BCD sang thập phân và ngược lại, tôi đã sử dụng 2 dòng bên dưới (ví dụ cho phút): // Chuyển đổi BCD thành decimalminute = (phút >> 4) * 10 + (phút & 0x0F);

// Chuyển số thập phân thành BCDminute = ((phút / 10) << 4) + (phút% 10); void DS3231_display (): hiển thị thời gian và lịch, trước khi hiển thị thời gian và dữ liệu lịch được chuyển đổi từ BCD sang định dạng thập phân.

// Đồng hồ và lịch thời gian thực với các nút đặt sử dụng DS3231 và Arduino // bao gồm mã thư viện LCD #include // bao gồm mã thư viện Wire (cần thiết cho các thiết bị giao thức I2C) #include // Kết nối mô-đun LCD (RS, E, D4, D5, D6, D7) Màn hình LCD LiquidCrystal (2, 3, 4, 5, 6, 7); void setup () {pinMode (8, INPUT_PULLUP); // button1 được kết nối với pin 8 pinMode (9, INPUT_PULLUP); // button2 được kết nối với chân 9 // thiết lập số cột và số hàng của LCD lcd.begin (16, 2); Wire.begin (); // Tham gia i2c bus} char Time = "TIME:::"; char Lịch = "DATE: / / 20"; byte i, giây, phút, giờ, ngày, tháng, năm; void DS3231_display () {// Chuyển BCD sang giây thập phân = (giây >> 4) * 10 + (giây & 0x0F); phút = (phút >> 4) * 10 + (phút & 0x0F); giờ = (giờ >> 4) * 10 + (giờ & 0x0F); date = (date >> 4) * 10 + (date & 0x0F); tháng = (tháng >> 4) * 10 + (tháng & 0x0F); năm = (năm >> 4) * 10 + (năm & 0x0F); // Thời gian kết thúc chuyển đổi [12] = second% 10 + 48; Thời gian [11] = giây / 10 + 48; Thời gian [9] = phút% 10 + 48; Thời gian [8] = phút / 10 + 48; Thời gian [6] = giờ% 10 + 48; Thời gian [5] = giờ / 10 + 48; Lịch [14] = năm% 10 + 48; Lịch [13] = năm / 10 + 48; Lịch [9] = tháng% 10 + 48; Lịch [8] = tháng / 10 + 48; Lịch [6] = date% 10 + 48; Lịch [5] = ngày / 10 + 48; lcd.setCursor (0, 0); lcd.print (Thời gian); // Hiển thị thời gian lcd.setCursor (0, 1); lcd.print (Lịch); // Hiển thị lịch} void flash_parameter () {byte j = 0; while (j 23) // Nếu giờ> 23 ==> giờ = 0 tham số = 0; if (i == 1 && tham số> 59) // Nếu phút> 59 ==> phút = 0 tham số = 0; if (i == 2 && tham số> 31) // Nếu ngày> 31 ==> date = 1 tham số = 1; if (i == 3 && tham số> 12) // Nếu tháng> 12 ==> tháng = 1 tham số = 1; if (i == 4 && tham số> 99) // Nếu năm> 99 ==> năm = 0 tham số = 0; sprintf (text, "% 02u", tham số); lcd.setCursor (x, y); lcd.print (văn bản); chậm trễ (200); // Chờ 200ms} lcd.setCursor (x, y); lcd.print (""); // Hiển thị hai dấu cách nháy_parameter (); sprintf (text, "% 02u", tham số); lcd.setCursor (x, y); lcd.print (văn bản); flash_parameter (); if (! digitalRead (8)) {// Nhấn nút If (pin # 8) i ++; // Tăng 'i' cho tham số trả về tham số tiếp theo; // Trả về giá trị tham số và thoát}}} void loop () {if (! DigitalRead (8)) {// Nút if (pin # 8) được nhấn i = 0; giờ = sửa (5, 0, giờ); phút = sửa (8, 0, phút); date = chỉnh sửa (5, 1, date); tháng = sửa (8, 1, tháng); năm = sửa (13, 1, năm); // Chuyển số thập phân sang BCD phút = ((phút / 10) << 4) + (phút% 10); giờ = ((giờ / 10) << 4) + (giờ% 10); date = ((date / 10) << 4) + (date% 10); tháng = ((tháng / 10) << 4) + (tháng% 10); năm = ((năm / 10) << 4) + (năm% 10); // Kết thúc chuyển đổi // Ghi dữ liệu vào DS3231 RTC Wire.beginTransmission (0x68); // Khởi động giao thức I2C với địa chỉ DS3231 Wire.write (0); // Gửi địa chỉ thanh ghi Wire.write (0); // Đặt lại giây và khởi động bộ dao động Wire.write (phút); // Ghi phút Wire.write (giờ); // Ghi giờ Wire.write (1); // Ghi ngày (không sử dụng) Wire.write (date); // Ghi ngày tháng Wire.write (tháng); // Ghi tháng Wire.write (year); // Ghi năm Wire.endTransmission (); // Dừng truyền và giải phóng độ trễ bus I2C (200); // Chờ 200ms} Wire.beginTransmission (0x68); // Khởi động giao thức I2C với địa chỉ DS3231 Wire.write (0); // Gửi địa chỉ đăng ký Wire.endTransmission (false); // Khởi động lại I2C Wire.requestFrom (0x68, 7); // Yêu cầu 7 byte từ DS3231 và giải phóng bus I2C khi kết thúc lần đọc thứ hai = Wire.read (); // Đọc giây từ thanh ghi 0 phút = Wire.read (); // Đọc minuts từ đăng ký 1 giờ = Wire.read (); // Đọc giờ từ thanh ghi 2 Wire.read (); // Đọc ngày từ thanh ghi 3 (không sử dụng) date = Wire.read (); // Đọc ngày từ thanh ghi 4 tháng = Wire.read (); // Đọc tháng từ đăng ký 5 năm = Wire.read (); // Đọc năm từ thanh ghi 6 DS3231_display (); // Thời gian diaplay & độ trễ lịch (50); // Chờ 50ms}

Đề xuất: