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:

Giới thiệu dự án ESP32 RTC

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:

  1. 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.
  2. 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.
  3. Độ 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.
  4. 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.

Giải thích khái niệm RTC là gì?
Giải thích khái niệm RTC là gì?

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

Kết nối phần cứng cho dự án ESP32 RTC

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.

Truy cập vào máy chủ NTP - Chọn Asia
Truy cập vào máy chủ NTP - Chọn 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é:

Lưu địa chỉ NTP Server

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!

Demo dự án ESP32 RTC
Demo dự án ESP32 RTC

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

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *