Trước đây, ứng dụng gửi thông báo từ một cảm biến đến điện thoại thông qua SMS rất được ưa chuộng. Thời gian sau đó, với sự phát triển của internet và điện thoại thông minh, cách gửi thông báo cũng trở nên rất đa dạng như qua email, facebook status, vv… Tuy nhiên, các ứng dụng này thường thông qua một bên thứ ba đó là IFTTT (IF THIS THEN THAT) , quá trình xử lý qua trung gian khiến chúng ta cảm thấy có độ trễ. Và theo xu hướng “do it yourself”, chúng ta không dựa vào IFTTT nữa. Ứng dụng kĩ thuật Web vào Internet of things, chúng ta sẽ tự viết một đoạn script bằng PHP để ESP8266 giao tiếp và gửi thông báo đến điện thoại bằng email.
Các bước tiến hành:
- Tạo một webserver miễn phí, để có thể viết PHP và MySql ( sử dụng cho nhiều project khác)
- Viết mã nguồn PHP cho việc nhận request từ ESP8266, gửi thông báo đến gmail
- Viết mã nguồn cho ESP8266 gửi các bản tin request kèm theo giá trị cảm biến hoặc các sự kiện phát hiện được.
Trong bài viết này tôi hướng dẫn các bạn đăng kí sử dụng free web hosting của https://www.000webhost.com
Sơ đồ hoạt động của hệ thống như sau:
Truy cập vào website, đăng kí tài khoản free
Sau khi hoàn tất, thực hiện tạo website
Sau khi hoàn tất tạo website, chúng ta sẽ có giao diện quản lý cpanel như sau:
Trước khi vào viết mã nguồn PHP, hãy chọn cho phép chức năng host gửi email trong mục Website Settings/General
Chúng ta hãy chọn File manager để thực hiện viết mã nguồn PHP
Chọn vào New File để thực hiện tạo file PHP mới
Chúng ta sẽ tạo ra một file PhP mới có tên email-notification.php
II. Viết mã nguồn PHP cho việc nhận request từ ESP8266
Thêm đoạn script php sau vào file vừa tạo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<span style="font-size: 12pt;"> <?php // địa chỉ mail sẽ nhận thông báo $email_address = "xxxstonline@gmail.com"; // api_key_esp là key dùng cho cả esp và trên server, cần trùng nhau $api_key=$PIN12=null; $api_key_value = "tPmAT5Ab3j7F9"; $msg = "Xin chào\nĐây là thông báo được kích hoạt từ ESP8266\n"; if(isset($_GET['api_key_esp'])) { $api_key = test_input($_GET["api_key_esp"]); if($api_key == $api_key_value) { $PIN12 = test_input($_GET["PIN12"]); // Email message $email_msg = "PIN 12: " . $PIN12; // Use wordwrap() if lines are longer than 70 characters //$email_msg = wordwrap($email_msg, 70); // Uncomment the next if statement to set a threshold // ($value1 = temperature, $value2 = humidity, $value3 = pressure) /*if($value1 < 24.0){ echo "Temperature below threshold, don't send email"; exit; }*/ // send email with mail(receiver email address, email subject, email message) if(mail($email_address, "[Thông báo] ESP8266 đã gửi bản tin mới", $msg)) echo "Đã gửi email thành công!"; else echo " Chú ý: gửi email không thành công!"; } else { echo "Sai mã API_KEY_ESP"; } } else echo "Xin chào, hãy gửi request của bạn gồm api_key_esp và giá trị Pin 14"; function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?></span> |
Sau khi lưu file, chúng ta hãy truy cập đường dẫn sau để kiểm tra hoạt động của file vừa tạo (Do địa chỉ 000webhost đã hết hạn, tôi thay bằng link host cố định để mọi người test) http://iot.luuvachiase.net/email-notification.php
Chúng ta sẽ nhận được kết quả : “Xin chào, hãy gửi request của bạn gồm api_key_esp và giá trị Pin 14”
Tiếp tục test với đường dẫn chưa api_key và giá trị của PIN12
http://iot.luuvachiase.net/email-notification.php?api_key=tPmAT5Ab3j7F9&PIN12=0
Chúng ta chọn vào “Không phải là spam” để có thể nhận email thông báo
Làm lại, ta thấy email đã được thực hiện gưi và thông báo trong hộp thư đến. Successs!
III. Viết mã nguồn cho ESP8266 gửi request đến Webserver.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
<span style="font-family: tahoma, arial, helvetica, sans-serif; font-size: 12pt;"> #include <ESP8266WiFi.h> #include <ArduinoJson.h> const char* ssid = "Your-SSID"; const char* password = "Your-Password"; const char* host = "luuvachiase.000webhostapp.com"; // Your domain String path = "/email-notification.php?api_key_esp=xxxxxxxxx"; // Cái này tự đặt String path_value = "&PIN12=0"; void setup() { // pinMode(14, OUTPUT); // pinMode(13, OUTPUT); // pinMode(12, OUTPUT); pinMode(12, INPUT_PULLUP); Serial.begin(115200); delay(10); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); int wifi_ctr = 0; while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("WiFi connected"); // Serial.println("IP address: " + WiFi.localIP()); } void loop() { Serial.print("connecting to "); Serial.println(host); WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } count=0; while(1) { if(count==lost) { Serial.println("OOPS-Connetion FAIL"); Serial.println("Retry connect HOST"); err++; break; } // Nếu lần kết nối trước không thành công thì kết nối lại count=lost; while(digitalRead(12)==HIGH) { delay(500); Serial.println("wait..."); } delay(1000); Serial.println("SEND GET...update data "); client.print(String("GET ")+ path + path_value + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection:keep-alive\r\n\r\n"); delay(1000); // wait for server to respond // read response String section="header"; while(client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); count++; } }// while }// loop</span> |
Sau đó chúng ta chạy thử để xem kết quả
Kết quả khi chúng ta nhấn nút GPIO12
Đến đây chúng ta đã bước đầu thành công việc gửi thông báo từ ESP8266 bằng email đến điện thoại. Việc còn lại tùy thuộc vào ứng dụng của các bạn, dùng cho từng loại cảm biến khác nhau thì chúng ta dùng các hàm đọc và so sánh ngưỡng để làm điều kiện gửi thông báo.
Video kết quả:
Nếu có vấn đề gì trong quá trình làm các bạn có thể comment xuống phía dưới. Và ủng hộ tác giả bằng cách rate hoặc like nhé. Thanks.
Bài viết tham khảo từ nguồn: https://randomnerdtutorials.com
api key lấy từ đâu ra bạn ạ
api key mình tự đặt bất kì nhé, do mình tự qui định để server xác thực thôi.
bạn giúp mình ngay bước mà test để được dòng chữ No data posted with HTTP POST..
của mình hiện ra là: Notice: Undefined index: api_key_esp in /storage/ssd4/025/11331025/public_html/email-notification.php on line 8
Sai mã API Key
nếu có thể bạn cho mình xin zalo để mình được học hỏi với ạ. tks bạn nhiều
Bạn kiểm tra lại mã nguồn PHP nhé, mình mới cập nhật để khắc phục lỗi rồi, chúc bạn thành công!
mình đã sửa mã nguồn PHP nhưng mình test nhiều lần với đường link chứa api-key của mình và pin12 thì kết quả vẫn ra giống bước 1. trong mail mình không có gì. ngoài ra mình thử nhảy bước 3 và code mã nguồn cho ESP8266 gửi request đến Webserver. mình dùng IDE thì bị lỗi biến Count, lost và dòng . bạn giúp đỡ mình với nhé, tks bạn. >3
dòng này bạn nhé: ( dòng đầu tiên)
dòng cspan style=”font-family: tahoma, arial, helvetica, sans-serif;font-size: 12pt”c. là khi post bài mình định dạng cỡ font chữ nó tự chèn vào thêm, cái này bạn bỏ nó đi là dc.
Còn phương án cuối cùng, mình gửi bạn link code php script đang chạy trên host, và code arduino đã check trên phiên bản Arduino IDE 1.8.8 . Bạn tự chạy kiểm tra lại nhé
code arduino: http://www.mediafire.com/file/vir2im0kr37lbmo/ESP8266_request_email.rar/file
code php: http://www.mediafire.com/file/a30z47yctoxqd83/email-notification.php/file
Check:
url check script php: https://luuvachiase.000webhostapp.com/email-notification.php
url này sẽ kích hoạt gửi mail cho mình: https://luuvachiase.000webhostapp.com/email-notification.php?api_key_esp=tPmAT5Ab3j7F9&PIN12=0
Dear bạn, rất cám ơn bạn đã hướng dẫn tận tình. Mong có nhiều ý tưởng hay như vậy.
hi admin,
ad cho em hỏi asp_key _esp mình lấy ở đâu vậy ạ.
em cảm ơn
hi admin,
ad cho em hỏi sao em làm bước đầu mà kích vô link để được như vầy “Xin chào, hãy gửi request của bạn gồm api_key_esp và giá trị Pin 14” mà nó cứ báo là không tìm thấy dữ liệu là sao ạ
em cảm ơn
I’ll right away grab your rss as I can not to find your
e-mail subscription hyperlink or e-newsletter service. Do you’ve any?
Kindly let me realize so that I may subscribe.
Thanks.
Sorry about that, You can find the subscribe form on the main site. On the top right. Thank you.
Rất hữu ích. Cám ơn Ad rất nhiều.