В этой статье мы рассмотрим создание интеллектуальной доски объявлений с веб-управлением на основе технологии Интернета вещей (IoT) с использованием NodeMCU ESP8266 и ЖК-дисплея. Мы создадим локальный веб-сервер для отправки сообщений на доску, а для отображения сообщений мы будем использовать ЖК-дисплей.
Доска объявлений является наиболее распространенным и основным устройством в любом учреждении, организации или общественном месте, таком как автобусная остановка, железнодорожные станции и парки. Но расклеивание различных объявлений в наши дни — сложный процесс, поэтому вместо этого сейчас используют, в основном, электронные доски объявлений. Основная цель данного проекта — разработать беспроводную доску объявлений, которая отображает сообщения, отправленные с веб-сервера. Когда пользователь отправляет сообщение, оно принимается модулем Wi-Fi через локальный веб-сервер .
Микроконтроллер, подключенный к серверной системе, должен непрерывно прослушивать входящие сообщения от пользователя, обрабатывать их и отображать на ЖК-экране. Отображаемое сообщение должно обновляться каждый раз, когда пользователь отправляет новую информацию. Только аутентифицированные пользователи должны обновлять данные, которые будут отображаться на ЖК-экране.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- ЖК дисплей 16x2 (купить на AliExpress).
- Потенциометр 10 кОм (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема умной доски объявлений на NodeMCU ESP8266 с веб-управлением представлена на следующем рисунке.
В представленной нам нужны следующие соединения между NodeMCU и ЖК-дисплеем:
RS-контакт ЖК-дисплея — D0-контакт NodeMCU
EN-контакт ЖК-дисплея — D1-контакт NodeMCU
D4-контакт ЖК-дисплея — D2-контакт NodeMCU
D5-контакт ЖК-дисплея — D3-контакт NodeMCU
D6-контакт ЖК-дисплея — D4-контакт NodeMCU
D7-контакт ЖК-дисплея — D5-контакт NodeMCU
Аналогично подключите контакты 1, 5, 16 ЖК-дисплея к GND, а контакты 2, 15 — к 5 В VCC. Для регулировки контрастности на контакте 3 ЖК-дисплея следует использовать потенциометр 10 кОм. Все устройство работает при напряжении 5 В.
Исходный код программы
Скопируйте код, указанный ниже, и загрузите его на плату Nodemcu. Но перед этим вам нужно установить две библиотеки, чтобы сделать локальный веб-сервер. Загрузите эти библиотеки по указанным ссылкам:
1. Библиотека ESPAsyncTCP: скачать
2. Библиотека ESPAsycnWebServer: скачать
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 |
#include <ESP8266WiFi.h> #include <ESPAsyncTCP.h> #include <ESPAsyncWebServer.h> #include <LiquidCrystal.h> LiquidCrystal lcd(D0, D1, D2, D3, D4, D5); AsyncWebServer server(80); const char* ssid = "Sri Krishna 2."; //wifi ssid const char* password = "subbu@123"; //wifi password const char* PARAM_INPUT_1 = "input1"; const char index_html[] PROGMEM = R"rawliteral( <!DOCTYPE HTML><html><head> <title>Smart Notice Board</title> <meta name="viewport" content="width=device-width, initial-scale=5"> <p> <font size="9" face="sans-serif"> <marquee> Smart Notice Board </marquee> </font> </p> </head><body><center> <form action="/get"> Enter Text to Display: <input type="text" name="input1"> <input type="submit" value="Send"> </form><br> </center></body></html>)rawliteral"; void notFound(AsyncWebServerRequest *request) { request->send(404, "text/plain", "Not found"); } void setup() { Serial.begin(115200); lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Smart Notice Board"); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); if (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("WiFi Failed!"); return; } Serial.println(); Serial.print("IP Address: "); Serial.println(WiFi.localIP()); server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", index_html); }); server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) { String message; String inputParam; if (request->hasParam(PARAM_INPUT_1)) { message = request->getParam(PARAM_INPUT_1)->value(); inputParam = PARAM_INPUT_1; lcd.clear(); lcd.setCursor(0,0); lcd.print(message); } else { message = "No message sent"; inputParam = "none"; } Serial.println(message); request->send(200, "text/html", index_html); }); server.onNotFound(notFound); server.begin(); } void loop() { for (int positionCounter = 0; positionCounter < 29; positionCounter++) { lcd.scrollDisplayLeft(); delay(500); } } |
Объяснение работы кода
Сначала нам нужно подключить все используемые библиотеки. Библиотека ESP8266Wifi используется для связи по протоколу TCP/IP. ESPAsyncTCP и ESPAsycnWebServer используются для создания локального веб-сервера. LiquidCrystal используется для сопряжения ЖК-дисплея с NodeMCU.
1 2 3 4 |
#include <ESP8266WiFi.h> #include <ESPAsyncTCP.h> #include <ESPAsyncWebServer.h> #include <LiquidCrystal.h> |
Затем мы объявляем все необходимые контакты для ЖК дисплея и создаем его экземпляр для использования в программе. SSID и пароль используются для подключения к сети Wi-Fi.
1 2 3 |
LiquidCrystal lcd(D0, D1, D2, D3, D4, D5); const char* ssid = “*********”; const char* password = “************”; |
Следующие строки используются для создания простой HTML-страницы для ввода. Здесь вы можете ввести сообщение и нажать кнопку отправки, чтобы отправить сообщение на ЖК-дисплей. Отправленное сообщение сохраняется в памяти NodeMCU.
1 2 3 4 5 6 7 8 |
const char index_html[] PROGMEM = R”rawliteral( <!DOCTYPE HTML><html><head> <title>Smart Notice Board</title> …………………………………………………………………………. …………………………………………………………………………. <input type=”submit” value=”Send”> </form><br> </center></body></html>)rawliteral”; |
Следующая команда используется для отправки веб-страницы с полями ввода на клиентский компьютер.
1 2 3 |
server.on(“/”, HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, “text/html”, html_page); }); |
Следующая команда отправит запрос GET и выведет полученное сообщение на ЖК-экран.
1 2 3 4 5 6 7 8 |
<ESP_IP>/get?input1=<Message> server.on(“/get”, HTTP_GET, [] (AsyncWebServerRequest *request) { .. if (request->hasParam(input1)) { message = request->getParam(input1)->value(); inputParam = input1; lcd.print(message); |
В функции цикла мы выводим полученные объявления на экран ЖК дисплея с прокруткой.
1 2 3 4 5 |
void loop() { for (int positionCounter = 0; positionCounter < 29; positionCounter++) { lcd.scrollDisplayLeft(); delay(500); } |
Тестирование работы проекта
После загрузки кода на плату NodeMCU вы можете открыть Serial Monitor (монитор последовательной связи), в котором отобразится локальный IP-адрес платы после подключения к Wi-Fi.
Скопируйте этот IP-адрес, вставьте его в веб-браузер и нажмите Enter. Отобразится веб-страница.
Теперь вы можете ввести сообщение здесь и отправить его, нажав кнопку Send («Отправить»).
После отправки сообщения последовательный монитор отобразит отправленное сообщение.
Теперь вы можете увидеть то же самое сообщение на ЖК-экране.