Trong bài hướng dẫn này, chúng ta sẽ học cách điều khiển bảng hiệu ma trận LED thông qua giao diện web bằng ESP8266. Cụ thể, chúng ta sẽ lập trình ESP8266 để trở thành một máy chủ web thực hiện những điều sau:
Trả về giao diện web cho người dùng khi nhận được yêu cầu từ trình duyệt web.
Cung cấp giao diện web để người dùng có thể gửi tin nhắn đến ESP8266.
Hiển thị các tin nhắn trên ma trận LED ngay khi nhận được tin nhắn.
Tiết lộ: Một số liên kết trong bài viết này là liên kết tiếp thị Amazon và có thể nhận hoa hồng theo chính sách của chương trình.
Giới thiệu về ma trận LED và máy chủ Web
Chúng ta có thể dùng HTTP thuần để gửi một chuỗi văn bản từ giao diện web đến ESP8266. Tuy nhiên, việc sử dụng WebSocket sẽ làm cho nó có vẻ phản hồi nhanh hơn và không làm tăng quá nhiều độ khó, vì vậy trong hướng dẫn này, chúng ta sẽ sử dụng WebSocket.
Bạn chưa quen với ma trận LED, máy chủ Web và WebSocket, bao gồm sơ đồ chân, chức năng và lập trình của chúng? Hãy khám phá các hướng dẫn toàn diện về những chủ đề này dưới đây:
Nội dung của trang web (HTML, CSS, JavaScript) được lưu riêng trong một tệp index.h. Vì vậy, chúng ta sẽ có hai tệp mã nguồn trên Arduino IDE:
Một file .ino chứa mã ESP8266, tạo máy chủ web và máy chủ WebSocket
Một file .h chứa nội dung của trang web
Hướng dẫn từng bước
Để bắt đầu với ESP8266 trên Arduino IDE, hãy làm theo các bước sau:
Xem hướng dẫn thiết lập môi trường cho ESP8266 trên Arduino IDE nếu đây là lần đầu tiên bạn sử dụng ESP8266.
Nối các thành phần như được thể hiện trong sơ đồ.
Kết nối bo mạch ESP8266 với máy tính của bạn bằng cáp USB.
Mở Arduino IDE trên máy tính của bạn.
Chọn bo mạch ESP8266 đúng, ví dụ NodeMCU 1.0 (ESP-12E Module), và cổng COM tương ứng.
Mở Library Manager bằng cách nhấp vào biểu tượng Library Manager trên thanh điều hướng bên trái của Arduino IDE.
Tìm kiếm “WebSockets”, rồi tìm WebSockets do Markus Sattler phát triển.
Nhấp nút Install để cài đặt thư viện WebSockets.
Tìm kiếm “MD_Parola”, sau đó tìm thư viện MD_Parola
Nhấn nút Cài đặt.
Bạn sẽ được yêu cầu cài đặt thư viện “MD_MAX72XX”
Nhấn nút Cài đặt Tất cả để cài đặt phụ thuộc.
Trong Arduino IDE, tạo một sketch mới, gán tên cho nó, ví dụ, newbiely.com.ino
Sao chép mã dưới đây và mở bằng Arduino IDE
/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp8266/esp8266-led-matrix-via-web */#include <ESP8266WiFi.h>#include <ESP8266WebServer.h>#include"index.h"#include <MD_Parola.h>#include <MD_MAX72xx.h>#define HARDWARE_TYPE MD_MAX72XX::FC16_HW#define MAX_DEVICES 4 // 4 blocks#define CS_PIN D8 // The ESP8266 pinconst char* ssid = "YOUR_WIFI_SSID"; // CHANGE ITconst char* password = "YOUR_WIFI_PASSWORD"; // CHANGE ITESP8266WebServer server(80); // Web server on port 80DIYables_ESP32_WebSocket* webSocket;// create an instance of the MD_Parola classMD_Parola ledMatrix = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) {switch (type) {case WStype_DISCONNECTED:Serial.printf("[%u] Disconnected!\n", num);break;case WStype_CONNECTED: {IPAddress ip = webSocket.remoteIP(num);Serial.printf("[%u] Connected from %d.%d.%d.%d\n", num, ip[0], ip[1], ip[2], ip[3]); }break;case WStype_TEXT:String text = String((char*)payload);Serial.println("Received: " + text); ledMatrix.displayClear(); // clear led matrix display ledMatrix.displayScroll(text.c_str(), PA_CENTER, PA_SCROLL_LEFT, 100);String echoMessage = "Displayed: " + String((char*)payload) + " on LED Matrix"; webSocket.sendTXT(num, echoMessage));break; }}voidsetup() {Serial.begin(9600); ledMatrix.begin(); // initialize the object ledMatrix.setIntensity(15); // set the brightness of the LED matrix display (from 0 to 15) ledMatrix.displayClear(); // clear led matrix display ledMatrix.displayScroll("newbiely.com", PA_CENTER, PA_SCROLL_LEFT, 100);delay(1000);// Connect to Wi-FiWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("Connecting to WiFi..."); }Serial.println("Connected to WiFi");// Initialize WebSocket server webSocket.begin(); webSocket.onEvent(webSocketEvent);// Serve a basic HTML page with JavaScript to create the WebSocket connection server.on("/", HTTP_GET, []() {Serial.println("Web Server: received a web page request");String html = HTML_CONTENT; // Use the HTML content from the index.h file server.send(200, "text/html", html); }); server.begin(); Serial.print("ESP8266 Web Server's IP address: "); Serial.println(WiFi.localIP());}void loop() {// Handle client requests server.handleClient();// Handle WebSocket events webSocket.loop();if (ledMatrix.displayAnimate()) { ledMatrix.displayReset(); }}
Tạo file index.h trên Arduino IDE bằng:
Hoặc nhấp vào nút ngay bên dưới biểu tượng Serial Monitor và chọn Tab Mới, hoặc sử dụng tổ hợp phím Ctrl+Shift+N.
Đặt tên cho tệp tin index.h và nhấn nút OK
Sao chép mã dưới đây và dán vào index.h.
/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp8266/esp8266-led-matrix-via-web */constchar *HTML_CONTENT = R"=====(<!DOCTYPE html><!-- saved from url=(0019)http://192.168.0.2/ --><html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"><title>ESP8266 WebSocket</title><meta name="viewport" content="width=device-width, initial-scale=0.7"><link rel="icon" href="https://diyables.io/images/page/diyables.svg"><style>/* Add some basic styling for the chat window */body { font-size: 16px;}.chat-container { width: 400px; margin: 0 auto; padding: 10px;}.chat-messages { height: 250px; overflow-y: auto; border: 1px solid #444; padding: 5px; margin-bottom: 5px;}.user-input {display: flex; margin-bottom: 20px;}.user-input input { flex: 1; border: 1px solid #444; padding: 5px;}.user-input button { margin-left: 5px; background-color: #007bff; color: #fff; border: none; padding: 5px 10px;cursor: pointer;}.websocket {display: flex; align-items: center; margin-bottom: 5px;}.websocket button { background-color: #007bff; color: #fff; border: none; padding: 5px 10px;cursor: pointer;}.websocket .label { margin-left: auto;}</style><script>var ws;var wsm_max_len = 4096; /* bigger length causes uart0 buffer overflow with low speed smart device */function update_text(text) { var chat_messages = document.getElementById("chat-messages"); chat_messages.innerHTML += text + '<br>'; chat_messages.scrollTop = chat_messages.scrollHeight;}function send_onclick() {if(ws != null) { var message = document.getElementById("message").value;if (message) { document.getElementById("message").value = ""; ws.send(message + "\n"); update_text('<span style="color:navy">' + message + '</span>');// You can send the message to the server or process it as needed } }}function connect_onclick() { if(ws == null) { ws = new WebSocket("ws://" + window.location.host + ":81"); document.getElementById("ws_state").innerHTML = "CONNECTING"; ws.onopen = ws_onopen; ws.onclose = ws_onclose; ws.onmessage = ws_onmessage; } else ws.close();}function ws_onopen() { document.getElementById("ws_state").innerHTML = "<span style='color:blue'>CONNECTED</span>"; document.getElementById("bt_connect").innerHTML = "Disconnect"; document.getElementById("chat-messages").innerHTML = "";}function ws_onclose() { document.getElementById("ws_state").innerHTML = "<span style='color:gray'>CLOSED</span>"; document.getElementById("bt_connect").innerHTML = "Connect"; ws.onopen = null; ws.onclose = null; ws.onmessage = null; ws = null;}function ws_onmessage(e_msg) { e_msg = e_msg || window.event; // MessageEvent console.log(e_msg.data); update_text('<span style="color:blue">' + e_msg.data + '</span>');}</script></head><body> <div class="chat-container"> <h2>ESP8266 WebSocket</h2> <div class="websocket"> <buttonclass="connect-button" id="bt_connect" onclick="connect_onclick()">Connect</button> <span class="label">WebSocket: <span id="ws_state"><span style="color:blue">CLOSED</span></span></span> </div> <div class="chat-messages" id="chat-messages"></div> <div class="user-input"> <input type="text" id="message" placeholder="Type your message..."> <button onclick="send_onclick()">Send</button> </div> <div class="sponsor">Sponsored by <a href="https://amazon.com/diyables">DIYables</a></div></div></body></html>)=====";
Bây giờ bạn có mã nguồn trong hai tệp: newbiely.com.ino và index.h
Nhấn Upload nút trên Arduino IDE để tải mã lên ESP8266.
Mở Serial Monitor
Kiểm tra kết quả trên Serial Monitor.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
Connecting to WiFi...
Connected to WiFi
ESP8266 Web Server's IP address IP address: 192.168.0.2
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2
Ghi chú địa chỉ IP được hiển thị và nhập địa chỉ này vào thanh địa chỉ của trình duyệt web trên điện thoại thông minh hoặc máy tính của bạn.
Bạn sẽ thấy trang web như dưới đây:
Nhấn nút CONNECT để kết nối trang web với ESP8266 qua WebSocket.
Nhập một vài từ và gửi chúng đến ESP8266.
Bạn sẽ thấy phản hồi từ ESP8266.
※ Lưu ý:
Nếu bạn chỉnh sửa nội dung HTML trong index.h và không chạm vào bất kỳ điều gì trong tệp newbiely.com.ino, khi bạn biên dịch và tải mã lên ESP8266, Arduino IDE sẽ không cập nhật nội dung HTML.
Để Arduino IDE cập nhật nội dung HTML trong trường hợp này, thực hiện một thay đổi trong tệp newbiely.com.ino (ví dụ: thêm một dòng trống, thêm một chú thích...)
Giải thích mã theo từng dòng
Đoạn mã ESP8266 ở trên chứa lời giải thích theo từng dòng. Vui lòng đọc các chú thích trong mã!