ESP32 Email – Theo dõi trạng thái cửa qua thông báo trên Email
Trong dự án ESP32 Email lần này, chúng ta sẽ cùng theo dõi trạng thái của một cánh cửa bằng ESP32 và công tắt magnetic reed. Mỗi khi cửa mở hoặc đóng, bạn đều sẽ nhận được email thông báo. Chúng ta sẽ sử dụng IFTTT để phục vụ dự án này. Tuy nhiên, bạn cũng có thể tham khảo sử dụng SMTP Server để thay thế.
Giới thiệu dự án ESP32 Email
Chúng ta sẽ thông báo trạng thái của cánh cửa qua email, đây là một tính năng đặc biệt phù hợp cho các dự án Smart home, giúp bạn bảo mật căn nhà tốt hơn.
Chúng ta sử dụng công tắc magnetic reed để phát hiện sự thay đổi trạng thái của cánh cửa (đóng hoặc mở), sau đó sử dụng IFTTT để gửi email.
Công tắc magnetic reed là một công tắc được bọc trong vỏ nhựa an toàn, chúng hoạt động dựa trên nguyên tắc sau:
- Khi có nam chân ở gần công tắc (cửa đang đóng), mạch điện sẽ đóng.
- Ngược lại, khi nam châm ở xa (cửa mở) thì mạch điện sẽ mở.
Trong dự án ESP32 Email này, chúng ta sẽ sử dụng trạng thái của công tắc trên để phát hiện các thay đổi về trạng thái của chúng.
Gửi email qua IFTTT
IFTTT là một dịch vụ miễn phí, là viết tắt của “If This Then That”. Đây là một nền tảng cho phép bạn sáng tạo đa dạng các sản phẩm và dịch vụ, đồng thời giúp các ứng dụng hoạt động cùng nhau.
Ví dụ: Việc gửi yêu cầu cụ thể tới IFTTT giúp kích hoạt một applet để thực hiện tác vụ nào đó, ví dụ như gửi thông báo qua Email.
Tạo tài khoản IFTTT
Đầu tiên, bạn truy cập vào Website chính thức của IFTTT (tại link https://ifttt.com/) và click vào nút Get Start / Signup để tạo tài khoản mới hoặc đăng nhập.
Tạo một Applet
Chúng ta cần tạo một Applet trong IFTTT. Một Applet này sẽ kết nối với 2 hoặc nhiều ứng dụng hoặc thiết bị với nhau (như với ESP32 và gửi email).
Applet bao gồm:
- Trình kích hoạt: Yêu cầu gửi một Applet để bắt đầu. ESP32 sẽ gửi yêu cầu để kích hoạt Applet.
- Các hành động: Đây là mục tiêu cuối cùng của Applet. Trong dự án ESP32 Email này, hành động chính là việc gửi 1 email.
Hướng dẫn tạo Applet:
- Click vào link sau: https://ifttt.com/create
- Click vào nút Add
- Tìm kiếm “Webhooks” và chọn vào ứng dụng này:
- Click vào yêu cầu “Receive a web request”.
- Nhập tên sự kiện, ví dụ, dự án ESP32 Email này là dùng để thông báo trạng thái cửa, nên mình đặt tên là Door_status. Bạn có thể đặt bất kỳ tên nào bạn thích, tuy nhiên nhớ đồng bộ tên này với tên trong sketch viết trong Arduino IDE nhé!
- Click vào nút Add trên menu “Then that” để chọn điều gì sẽ xảy ra khi event phía trên được kích hoạt
- Tìm kiếm email và chọn vào nó
- Click vào send me an email
- Viết tiêu đề và nội dung email. Bạn có thể chọn dùng email mặc định hoặc thay đổi nội dung thành bất cứ nội dung gì bạn muốn. {{EventName}} là phần giữ chỗ, hệ thống sẽ tự thay thế thành tên của event (trong dự án ESP32 Email này là door_status). {{OccuredAt}} là phần thay thế cho mốc thời gian khi sự kiện được kích hoạt, {{Value1}} là phần thay thế cho trạng thái của cửa. Bạn có thể sử dụng các cú pháp phần giữ chỗ này để cập nhật trạng thái cửa qua email cho bạn.
- Click vào Continue
- Click vào Finish, và bạn sẽ được chuyển sang trang mới như hình dưới:
Lúc này, bạn đã tạo Applet thành công! Hãy kiểm tra Applet của mình qua các bước bên dưới:
Kiểm tra Applet
Mở link bên dưới và chọn vào tab “Documentation”
https://ifttt.com/maker_webhooks
Bạn có thể kích hoạt một sự kiện để kiểm tra hệ thống đã hoạt động ổn định chưa. Ngoài ra, bạn hãy lưu lại API Key (đoạn mã bên dưới), chúng ta sẽ sử dụng chúng trong viết code đấy:
Bây giờ, bạn hãy kích hoạt sự kiện để kiểm tra, bằng cách bên trong phần thay thế {event}, bạn viết sự kiện mà chúng ta đã tạo trước đó (trong trường hợp của mình là door_status). Ngoài ra, tại phần value1, bạn điền một giá trị, ví dụ như open và sau đó click vào nút Test It:
Hệ thống sẽ gửi cho bạn 1 email cho biết rằng cửa đã được mở. Bây giờ, cùng vào chuẩn bị dự án ESP32 Email nhé!
Chuẩn bị phần cứng
- ESP32
- Công tắc Magnetic Reed Switch
- Điện trở 1×10kΩ
- Breadboard
- Dây jumper
Kết nối phần cứng
Chúng ta kết nối công tắc vào cổng GPIO 4:
Code
Bạn nhớ thay đổi tên, mật khẩu WiFi và API Key của riêng bạn vào code bên dưới, rồi chạy thử nhé:
#include <WiFi.h> // Set GPIOs for LED and reedswitch const int reedSwitch = 4; const int led = 2; //optional // Detects whenever the door changed state bool changeState = false; // Holds reedswitch state (1=opened, 0=close) bool state; String doorState; // Auxiliary variables (it will only detect changes that are 1500 milliseconds apart) unsigned long previousMillis = 0; const long interval = 1500; const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; const char* host = "maker.ifttt.com"; const char* apiKey = "REPLACE_WITH_YOUR_IFTTT_API_KEY"; // Runs whenever the reedswitch changes state ICACHE_RAM_ATTR void changeDoorStatus() { Serial.println("State changed"); changeState = true; } void setup() { // Serial port for debugging purposes Serial.begin(115200); // Read the current door state pinMode(reedSwitch, INPUT_PULLUP); state = digitalRead(reedSwitch); // Set LED state to match door state pinMode(led, OUTPUT); digitalWrite(led, !state); // Set the reedswitch pin as interrupt, assign interrupt function and set CHANGE mode attachInterrupt(digitalPinToInterrupt(reedSwitch), changeDoorStatus, CHANGE); // Connect to Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); } void loop() { if (changeState){ unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // If a state has occured, invert the current door state state = !state; if(state) { doorState = "closed"; } else{ doorState = "open"; } digitalWrite(led, !state); changeState = false; Serial.println(state); Serial.println(doorState); //Send email Serial.print("connecting to "); Serial.println(host); WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } String url = "/trigger/door_status/with/key/"; url += apiKey; Serial.print("Requesting URL: "); Serial.println(url); client.print(String("POST ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: 13\r\n\r\n" + "value1=" + doorState + "\r\n"); } } }
Bạn hãy nạp code vào, gắn ESP32 và bộ công tắc lên cửa rồi kiểm tra nhé! Chúc bạn thành công.