Dùng hẹn giờ ESP32 RTC điều khiển Relay – Kèm code mẫu chi tiết
Trong chủ đề ESP32 RTC lần này, IoTZone sẽ hướng dẫn bạn cách dùng hẹn giờ RTC được tích hợp trên mạch để điều khiển Relay. Hệ thống của chúng ta chỉ có 2 thiết bị này và không cần dùng thêm module bên ngoài nào khác.
Giới thiệu dự án ESP32 RTC
Ban đầu, ESP32 sẽ lấy thời gian từ máy chủ NTP, sau đó sử dụng RTC bên trong để tính toán thời gian và dựa trên đó để điều khiển Relay, theo sơ đồ sau:
ESP32 RTC là gì?
RTC (Real Time Clock) trong ESP32 là một tính năng được tích hợp sẵn trên mạch, giúp thiết bị có thể theo dõi thời gian kể cả khi không có Internet hoặc khi thiết bị đang tắt nguồn. Bạn có thể hiểu chúng như một chiếc đồng hồ nhỏ chạy độc lập bên trong ESP32.
Các đặc điểm nổi bật của ESP32 RTC:
- Theo dõi thời gian: RTC giúp theo dõi thời gian hiện tại, gồm giờ, phút giây hoặc thậm chí là ngày tháng.
- Tiêu thụ ít điện năng: RTC có thể hoạt động ngay cả khi ESP32 ở chế độ Deep Sleep hoặc ngay cả khi tắt nguồn, hệ thống này tiêu thụ khá ít điện năng.
- Độ chính xác: RTC tương đối chính xác và có thể duy trì việc theo dõi thời gian khá lâu. Tuy nhiên chúng ta thỉnh thoảng cần phải điều chỉnh RTC để duy trì độ chính xác của chúng.
- Mục đích sử dụng: ESP32 RTC có thể được dùng để phục vụ nhiều mục đích khác nhau, chẳng hạn như lên lịch thực hiện một tác vụ nào đó, đánh dấu mốc thời gian cho các sự kiện hoặc kích hoạt một hoạt động vào thời điểm cụ thể.
Nhìn chung, RTC trong ESP32 giống như một chiếc đồng hồ mini, cho phép thiết bị của bạn biết bây giờ là mấy giờ, ngay cả khi thiết bị không hoạt động.
Trong dự án này, chúng ta sẽ điều khiển Relay bằng RTC được tích hợp trong mạch, nên hệ thống không cần phải kết nối WiFi 24/24.
Chuẩn bị
- Mạch ESP32
- Relay 1 kênh 5V SPDT
- Màn hình OLED
- Switches
Kết nối phần cứng
Trong sơ đồ trên, mình đang dùng chân GPIO D33 của mạch ESP32 để điều khiển Relay.
Màn hình OLED là một lựa chọn thêm của mình cho dự án đặc sắc hơn, bạn có thể dùng hoặc không đều được. Như hình trên, mình đang nói với GPIO D22 & D21.
Bạn có thể dùng nguồn cấp điện 5V để cấp cho mạch, thay vì dùng converter AC to DC.
Để điều khiển thủ công, bạn có thể kết nối thêm công tắc có chốt 5A qua terminal COM & NO của Relay. Nếu bạn kết nối với các thiết bị AC chạy bằng dòng điện xoay chiều 220V, bạn cần cẩn thận và dùng các biện pháp an toàn điện thích hợp (Không khuyến nghị sử dụng trong bài hướng dẫn này).
Truy cập vào máy chủ NTP
Đầu tiên, bạn cần truy cập vào máy chủ NTP, bằng các bước sau:
1. Truy cập vào Website: www.ntppool.org và chọn châu lục là Asia >> Chọn quốc gia là Việt Nam.
Khi chọn xong, trên màn hình sẽ hiển thị địa chỉ Server, bạn hãy lưu lại nó nhé:
Chương trình lập trình ESP32
Đầu tiên, bạn cần cài đặt ESP32 trên Arduino để làm việc với mạch này. Nếu chưa cài đặt, bạn vui lòng làm theo hướng dẫn tại bài viết sau: Cách lập trình ESP32 bằng Arduino IDE (Windows, Linux, Mac OS X)
Sau đó, bạn cài đặt các thư viện sau để phục vụ cho dự án ESP32 RTC này:
- Adafruit_SSD1306
- Adafruit_GFX
- NTPClient
Sau khi cài thư viện, bạn copy đoạn code sau và thay đổi các thông tin sau trước khi nạp code vào mạch ESP32: (phía dưới có hướng dẫn chi tiết)
- Thông tin mạng WiFi (tên WiFi, mật khẩu)
- Địa chỉ NTP Server (nếu bạn ở quốc gia khác, không phải tại Việt Nam). Nếu bạn ở Việt Nam thì bỏ qua bước này.
- Cấu hình thời gian BẬT / TẮT cho Relay trong định dạng 24h
#include <WiFi.h> #include <NTPClient.h> #include <WiFiUdp.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // Thay đổi thành mạng WiFi của bạn const char* ssid = ""; //Tên WiFi const char* password = ""; //Mật khẩu WiFi // Khai báo địa chỉ NTP Server const char* ntpServer = "in.pool.ntp.org"; //Đổi theo quốc gia là Việt Nam const long gmtOffset_sec = 25200; // Bù trừ UTC (GMT Việt Nam 7 // 7*60*60 = 25200) Đổi theo quốc gia là Việt Nam const int daylightOffset_sec = 0; // Daylight offset (giây) // Khai báo chân cắm Relay const int relayPin = 33; // Thay đổi tùy vào chân mà bạn kết nối với Relay // Khai báo màn hình OLED #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 32 #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Khai báo đối tượng WiFi và NTP WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, ntpServer, gmtOffset_sec, daylightOffset_sec); // Khai báo biến để điều khiển Relay const int relayOnHour = 21; // Thời gian BẬT Relay trong 24 giờ ON const int relayOnMinute = 39; // Thời gian BẬT Relay theo phút const int relayOffHour = 21; // Thời gian TẮT Relay trong 24 giờ ON const int relayOffMinute = 40; // Thời gian TẮT Relay theo phút bool relayState = false; void setup() { Serial.begin(115200); // Khởi tạo màn hình OLED if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for(;;); } display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.setTextSize(1); display.setCursor(0, 0); display.println("Initializing..."); display.display(); delay(1000); // Kết nối WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); // Khởi tạo chân cắm Relay thành Output pinMode(relayPin, OUTPUT); //digitalWrite(relayPin, HIGH); //uncomment for Active LOW relay digitalWrite(relayPin, LOW); //comment for Active LOW relay // Start NTP time sync timeClient.begin(); timeClient.update(); } void loop() { // Cập nhật thời gian NTP timeClient.update(); // Nhận thời gian thực từ NTP time_t currentTime = timeClient.getEpochTime(); struct tm * timeinfo; timeinfo = localtime(¤tTime); // Hiển thị thời gian lên màn hình OLED display.clearDisplay(); display.setCursor(0, 0); display.print("Time: "); display.println(timeClient.getFormattedTime()); display.println("--------------"); display.print("On Time: "); display.print(relayOnHour); display.print(":"); display.println(relayOnMinute); display.print("Off Time: "); display.print(relayOffHour); display.print(":"); display.println(relayOffMinute); display.display(); // Kiểm tra xem đã đến giờ thay đổi trạng thái Relay chưa if (timeinfo->tm_hour == relayOnHour && timeinfo->tm_min == relayOnMinute) { // Bật Relay //digitalWrite(relayPin, LOW); //uncomment for Active LOW relay digitalWrite(relayPin, HIGH); // comment for Active LOW relay relayState = true; Serial.println("Relay ON"); } else if (timeinfo->tm_hour == relayOffHour && timeinfo->tm_min == relayOffMinute){ // Tắt Relay //digitalWrite(relayPin, HIGH); //uncomment for Active LOW relay digitalWrite(relayPin, LOW); // comment for Active LOW relay relayState = false; Serial.println("Relay OFF"); } // Chờ 1 giây trước khi kiểm tra lại lần nữa delay(1000); }
Bạn có thể đổi thông tin mạng WiFi tại đoạn code sau:
const char* ssid = ""; //mention WiFi name const char* password = ""; //mention WiFi password
Đổi thông tin địa chỉ NTP Server:
// Khai báo địa chỉ NTP Server const char* ntpServer = "in.pool.ntp.org"; //Đổi theo quốc gia là Việt Nam const long gmtOffset_sec = 25200; // Bù trừ UTC (GMT Việt Nam 7 // 7*60*60 = 25200) Đổi theo quốc gia là Việt Nam const int daylightOffset_sec = 0; // Daylight offset (giây)
Cấu hình thời gian bật / tắt Relay theo định dạng 24 giờ:
// Khai báo biến để điều khiển Relay const int relayOnHour = 21; // Thời gian BẬT Relay trong 24 giờ ON const int relayOnMinute = 39; // Thời gian BẬT Relay theo phút const int relayOffHour = 21; // Thời gian TẮT Relay trong 24 giờ ON const int relayOffMinute = 40; // Thời gian TẮT Relay theo phút
Bây giờ, bạn hãy upload code vào mạch để hoàn tất dự án ESP32 RTC này nhé!
Ban đầu, mạch ESP32 sẽ nhận thông tin từ máy chủ NTP, sau đó, chúng sẽ dùng thông tin từ bộ RTC tích hợp trong mạch để điều khiển Relay.
Demo dự án ESP32 RTC
Đến đây, ESP32 sẽ điều khiển bật / tắt Relay tại đúng thời gian mà bạn đã cấu hình trong code!
IoTZone hy vọng bạn thích dự án này! Chúng ta có thể sử dụng ý tưởng này để điều khiển tự động các thiết bị trong Smart home, đây sẽ là một chủ đề khá thú vị.
Bạn cần tìm hiểu thêm nhiều dự án ESP32 khác? IoTZone đã có khá nhiều bài hướng dẫn thú vị khác về dự án ESP32, bạn có thể click vào để tham khảo!
IoTZone – Chuyên cung cấp thiết bị điện tử & tài liệu cho Makers
- Website: https://www.iotzone.vn/
- Fanpage: https://www.facebook.com/Iotzonemaker
- SDT: 0364174499
- Zalo: https://zalo.me/0364174499