Phần 8: Demo lập trình điều khiển thiết bị qua Internet

Wearable

Xin chào, chúng ta sẽ tiếp tục chủ đề sử dụng ESP8266 trong các ứng dụng Internet Of Things. Với các bài trước, chúng ta đã thảo luận khá đầy đủ các kiến thức nền tảng khi lập trình với ESP8266 như kiến trúc phần cứng, các mô hình lập trình và quá trình nạp firmware cho ESP8266. Với những kiến thức trên, các bạn có thể ứng dụng để lập trình 1 ứng dụng hoàn chỉnh sử dụng ESP8266 cho riêng mình rồi. Để minh họa cho ứng dụng, bài viết này sẽ demo lập trình điều khiển thiết bị qua ESP8266 sử dụng mạng Wifi và Internet với mục đích để điều khiển thiết bị mọi lúc, mọi nơi.

Yêu cầu của demo

Lập trình 1 web server đơn giản trên ESP8266 để hiện thị 2 nút nhấn ON và OFF trên nền web, khi user truy cập vào website này thì có thể ấn nút để thực hiện việc bật/tắt LED. Ngoài ra, yêu cầu phải thiết lập để có thể truy cập trang web này từ bất cứ nơi nào/thiết bị nàomiễn là có kết nối Internet.

Hardware cần chuẩn bị

Để thực hiện demo này, chúng ta sẽ sử dụng module ESP-01 và module FT232 USB-UART vì tính đơn giản và dễ dàng.

Kết nối phần cứng khi nạp như hình bên dưới:

load_fw

Ở đây chúng ta sẽ sử dụng BLUE LED ngay trên board ESP01 nên không cần gắn thêm LED bên ngoài. Lưu ý là BLUE LED mặc định dùng cho chức năng TX của UART0 để output các thông tin debug info; do đó trong code sẽ thay đổi thành chức năng GPIO và sử dụng để blink LED khi user ấn nút trên web server.

Software cần chuẩn bị

Demo ứng dụng sẽ được code trên Arduino IDE vì chúng ta có thể sử dụng các thư viện network 1 cách dễ dàng. Do đó, các bạn cần cài đặt:

  • Phần mềm Arduino IDE
  • Bộ thư viện và tool cho ESP8266 trên Arduino (xem lại bài 7 để tìm hiểu cách cài bộ thư viện trên Arduino)

Sketch cho ESP8266 trên Arduino

Với demo này, chúng ta sẽ sử dụng thư viện ESPWiFi hỗ trợ các chức năng Wifi và web server.

  • Tạo 1 web server và cấu hình port để listen
WiFiServer server(PORT);   //PORT = 301 (có thể dùng giá trị bất kỳ)
  • Hàm setup()
    Cơ bản thì hàm setup() sẽ có chức năng kết nối vào mạng Wifi và khởi động web server

Kết nối mạng Wifi

WiFi.begin(“<tên mạng Wifi>”, “<password>”);
while (WiFi.status() != WL_CONNECTED) {         //đợi kết nối Wifi thành công
delay(500);
Serial.print(“.”);
}

Khởi động Web server

server.begin();
Serial.println(WiFi.localIP());

Cấu hình lại GPIO1 để điều khiển BLUE LED trên board

pinMode(LED_PIN, OUTPUT);      //LED_PIN = 1
digitalWrite(LED_PIN, HIGH);

Các bạn thay thế thông tin mạng Wifi của mình vào hàm WiFi.begin(). Sau khi kết nối thành công, ESP sẽ output địa chỉ IP của nó qua UART0, chúng ta cần ghi nhớ địa chỉ IP này để thiết lập mở port trên modem Wifi ở bước tiếp theo.

Lưu ý trong hàm setup() không có viết nội dung hiện thị của trang web, phần hiện thị nội dung sẽ được thực hiện trong hàm loop() vì chúng ta cần update nội dung trang web theo thao tác của user.

  • Hàm loop()
    Trong hàm loop(), chúng ta sẽ đợi user ấn nút trên trang web rồi đọc dữ liệu từ web client để biết được user đã ấn nút nào trên trang web và thực hiện action tương ứng

Đợi user mở trang web hoặc ấn nút trên trang web

while (!client.available()) {
delay(1);
}

Đọc dữ liệu từ web client để biết user có ấn nút hay không

String req = client.readStringUntil(‘\r’);            //đọc thông tin từ web client
client.flush();
if (req.indexOf(“”) != -10) {
if (req.indexOf(“/OFF”) != -1) {      //khi user ấn nút OFF
digitalWrite(LED_PIN, HIGH);
led_status = false;
}
if (req.indexOf(“/ON”) != -1) {        //khi user ấn nút ON
digitalWrite(LED_PIN, LOW);
led_status = true;
}
}

Gửi nội dung để hiện thi trên trang web

// Prepare the response
String s = “HTTP/1.1 200 OK\r\n”;
s += “Content-Type: text/html\r\n\r\n”;
s += “<!DOCTYPE HTML>\r\n<html>\r\n”;
s += “<br><input type=\”button\” name=\”bl\” value=\”Turn LED ON \” onclick=\”location.href=’/ON’\”>”;
s += “<br><br><br>”;
s += “<br><input type=\”button\” name=\”bl\” value=\”Turn LED OFF\” onclick=\”location.href=’/OFF’\”>”;
s += “<label>LED Status:</label>”;
s += “<br>”;
if(led_status) {
s += “<textarea>Da mo LED</textarea>”;
}
else
{
s += “<textarea>Da tat LED</textarea>”;
}
s += “</html>\n”;
client.flush();

Tùy vào trạng thái LED mà nội dung của trang web sẽ được thay đổi tương ứng để thông báo user là LED đã được ON/OFF theo yêu cầu

File sketch của demo có thể download ở đây

Để nạp firmware sau khi biên dịch trên Arduino, chúng ta cấu hình như hình bên dưới:

arduion_download

Kết nối USB tới module FT232 và chọn Port tương ứng để tiến hành quá trình nạp firmware xuống module ESP8266

Test demo

Chúng ta có thể test demo trong mạng Wifi local trước như hình bên dưới:

LED_web_srv

demo

Trước khi chân GPIO1 bị đổi thành IO để điều khiển LED, ESP sẽ output các log ra cửa sổ COM trên Arduino với thông tin local IP của module (trong ví dụ là 192.168.1.106). Chúng ta sẽ kết nối tới địa chỉ IP này trên 1 web browser trên máy tính kết nối cùng mạng Wifi với module ESP01 để load trang web server (chú ý là phải chọn port tương ứng đã lập trình trong code).

Từ trang web này, khi ấn nút ON/OFF tương ứng, chúng ta sẽ thấy BLUE LED trên board ESP01 sẽ tắt/mở tương ứng và trạng thái của LED cũng được cập nhật trên trang web. Thế là demo đã work OK!

Điều khiển qua mạng Internet

Hiện tại chúng ta chỉ có thể điều khiển LED từ máy tính hoặc smartphone kết nối chung mạng Wifi với module ESP01. Để có thể gửi lệnh tới ESP8266 từ mạng Internet bên ngoài, chúng ta cần thiết lập Open Port trên modem Wifi của mình.

Sau đây là ví dụ thực hiện Open Port trên modem H640W của mạng Viettel

  • Kết nối dây cáp LAN vào modem
  • Mở browser trên máy tính và nhập vào địa chỉ IP của modem (mặc định modem H640W của Viettel có địa chỉ IP là 192.168.1.100) và điền thông tin username, password để login
  • Vào mục Advance Settings, thiết lập Open Port như sau:
    Rule Name = Tên rule bất kỳ
    Target IP = địa chỉ IP của module ESP01 khi chạy (đã được in ra khi ESP01 chạy code)
    Netmask chọn 32
    Tất cả port đều là giá trị PORT đã lập trình trong code (ví dụ ở đây là 301)

Untitled

Với các modem và mạng internet khác thì việc Open Port cũng tương tự

Bước tiếp theo là cần tìm địa chỉ internet IP của mạng Wifi mà ESP01 đang kết nối vào. Chúng ta có thể vào website ping.eu để lấy thông tin này. Ví dụ như hình sau:

ip_adr1

Thế là xong, từ giờ chúng ta có thể vào 1 mạng internet bất kỳ, đánh địa chỉ “<địa chỉ internet IP>:<port>” là có thể kết nối vào web server và gửi lệnh tới ESP8266 để điều khiển thiết bị từ xa được rồi.

<địa chỉ internet IP> là địa chỉ internet IP của mạng Wifi mà ESP8266 đang kết nối
<port> là port được lập trình trong code để web server đọc dữ liệu

Các bạn có thể test dễ dàng bằng cách tắt Wifi trên smartphone, bật 3G và truy cập vào địa chỉ trên để điều khiển LED ngay từ mạng 3G trên smartphone.

Enjoy!

Bài viết đến đây là hết rồi. Hy vọng các bạn đã tìm hiểu được cách đơn giản để điều khiển thiết bị trong nhà (quạt, đèn, v.v…) qua Internet sử dụng chip ESP8266. Lưu ý là với các mạng Wifi sử dụng địa chỉ IP động thì địa chỉ internet IP của mạng Wifi có thể bị thay đổi, chúng ta có thể đăng ký 1 địa chỉ IP tĩnh hoặc nghiên cứu thêm cơ chế lấy được địa chỉ IP động mới khi có thay đổi để có thể kết nối trang web server của ESP8266 thành công.

Nguồn : htelectronics.vn