Управление светодиодом с использованием Lolin NodeMCU и Elbear ace-uno. Пошаговое руководство

Результат работы

Результат работы

Здравствуйте, в этой статье мы рассмотрим, как создать простой веб-сервер на основе Lolin NodeMCU с использованием микроконтроллера ESP8266. Этот проект позволит вам управлять светодиодом и отправлять команды через веб-интерфейс.

Основные компоненты проекта

  1. Lolin NodeMCU — это плата на основе ESP8266, которая поддерживает Wi-Fi и проста в использовании.

  2. Светодиод — для управления.

  3. Библиотеки — для работы с Wi-Fi и веб-сервером необходимо подключить библиотеки ESP8266WiFi.h и ESP8266WebServer.h.

Подключение:

  1. Lolin NodeMCU RX — TX Elbear ace-uno

  2. Lolin NodeMCU TX — RX Elbear ace-uno

Настройка сети

Первым шагом является настройка сети. В нашем коде мы задаем параметры Wi-Fi, такие как SSID и пароль, а также статический IP-адрес для устройства. Это позволит избежать проблем с изменением IP-адреса при перезагрузке устройства.

const char* ssid = "имя";
const char* password = "пароль";
IPAddress local_IP(192, 168, 1, 3);  // Установите желаемый статический IP
IPAddress gateway(192, 168, 1, 1);      // Шлюз (обычно IP вашего маршрутизатора)
IPAddress subnet(255, 255, 255, 0);     // Подсеть

Настройка веб-сервера

После настройки сети мы создаем веб-сервер, который будет слушать запросы на порту 80. Мы регистрируем маршруты для обработки команд, отправленных через веб-интерфейс.

ESP8266WebServer server(80);
void setup() {
    Serial.begin(9600); // Настройка последовательного порта для связи
    WiFi.mode(WIFI_AP_STA); // Установка режима AP и станции
    WiFi.config(local_IP, gateway, subnet); // Настройка статического IP
    WiFi.begin(ssid, password); // Подключение к Wi-Fi сети
    // Проверка подключения к Wi-Fi
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
    }
    // Создание точки доступа
    WiFi.softAP("ESP8266_AP", "password"); // Создание точки доступа с SSID и паролем
    // Регистрация маршрутов
    server.on("/", handleRoot);
    server.on("/sendCommand", handleSendCommand);
    server.on("/sendSerialInput", handleSendSerialInput);
    server.begin();
}

Обработка команд

Веб-интерфейс позволяет пользователю отправлять команды для управления устройством. Например, команды `LED_ON` и `LED_OFF` включают и выключают встроенный светодиод. Каждая команда обрабатывается в функции `processCommand`, где также ведется журнал последних команд.

void processCommand(String command) {
    Serial.println("Processing command: " + command); // Отладочное сообщение
    Serial.print(command); // Отправка команды на другое устройство
    if (command == "LED_ON") {
        digitalWrite(LED_BUILTIN, HIGH); // Включение светодиода
        Serial.println("LED is ON"); // Сообщение о подтверждении
        storeCommand("LED ON");
    } else if (command == "LED_OFF") {
        digitalWrite(LED_BUILTIN, LOW); // Выключение светодиода
        Serial.println("LED is OFF"); // Сообщение о подтверждении
        storeCommand("LED OFF");
    } else {
        Serial.println("Unknown command received: " + command); // Сообщение о неизвестной команде
    }
}

Веб-интерфейс

В функции `handleRoot` мы создаем HTML-страницу, на которой пользователи могут вводить команды и видеть последние действия. Это делает управление устройством интуитивно понятным и доступным.

void handleRoot() {
    String html = "

Отправка команды на Elbear ACE-UNO

";     html += "
";     html += "";     html += "";     html += "
";     // Отображение последних 5 команд     html += "

Последние команды:

    ";     for (int i = 0; i < 5; i++) {         if (lastCommands[i] != "") {             html += "
  • " + lastCommands[i] + "
  • ";         }     }     html += "
";     // Отправка HTML-кода обратно клиенту     server.send(200, "text/html", html); }

Заключение

Полный код Lolin NodeMCU

#include 
#include 

const char* ssid = "имя";
const char* password = "пароль";

// Static IP and network settings
IPAddress local_IP(192, 168, 1, 3);  // Set your desired static IP
IPAddress gateway(192, 168, 1, 1);      // Gateway (usually the IP of your router)
IPAddress subnet(255, 255, 255, 0);     // Subnet

ESP8266WebServer server(80);
String lastCommands[5]; // Array to store the last 5 commands
int commandIndex = 0;   // Index for adding new commands
String serialOutput;     // String to store serial output

void setup() {
  Serial.begin(9600);   // Set up the serial port for communication with Elbear ACE-UNO

  // Set up Wi-Fi in client mode
  WiFi.mode(WIFI_AP_STA); // Set to AP and station mode
  WiFi.config(local_IP, gateway, subnet); // Set static IP
  WiFi.begin(ssid, password); // Connect to Wi-Fi network

  // Check for Wi-Fi connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
  }

  // Set up access point
  WiFi.softAP("ESP8266_AP", "password"); // Create access point with SSID and password

  // Register routes
  server.on("/", handleRoot);
  server.on("/sendCommand", handleSendCommand); // Route to send custom command
  server.on("/sendSerialInput", handleSendSerialInput); // Route to send serial input
  server.begin();
}

void loop() {
server.handleClient();
}

void processCommand(String command) {
  Serial.println("Processing command: " + command); // Debug message for command processing

  // Send command to the other device via Serial
  Serial.print(command); // Send the command to the other device
  Serial.println(); // Add newline to separate commands

  if (command == "LED_ON") {
    digitalWrite(LED_BUILTIN, HIGH); // Turn on LED
    Serial.println("LED is ON"); // Confirmation message
    storeCommand("LED ON");
  } else if (command == "LED_OFF") {
    digitalWrite(LED_BUILTIN, LOW); // Turn off LED
    Serial.println("LED is OFF"); // Confirmation message
    storeCommand("LED OFF");
  } else {
    Serial.println("Unknown command received: " + command); // Unknown command message
  }
}

void handleRoot() {
  String html = "

Send Custom Command to Elbear ACE-UNO

"; // Form to send custom command html += "
"; html += ""; html += ""; html += "
"; // Input for serialInput html += "

Serial Input:

"; html += "
"; html += ""; html += ""; html += "
"; // Display the last 5 commands html += "

Last Commands:

    "; for (int i = 0; i < 5; i++) { if (lastCommands[i] != "") { // Check if there is a command html += "
  • " + lastCommands[i] + "
  • "; } } html += "
"; // Display serial output html += "

Serial Output:

" + serialOutput + "
"; // Display connected devices html += "

Connected Devices:

    "; int numDevices = WiFi.softAPgetStationNum(); // Get the number of connected devices html += "
  • Number of connected devices: " + String(numDevices) + "
  • "; // Get information about connected devices struct station_info *stationList = wifi_softap_get_station_info(); while (stationList != NULL) { html += "
  • Device MAC: " + String(macToString(stationList->bssid)) + "
  • "; stationList = STAILQ_NEXT(stationList, next); } html += "
"; server.send(200, "text/html", html); } void handleSendCommand() { if (server.hasArg("command")) { String command = server.arg("command"); // Get the command from the form command.trim(); // Remove extra spaces Serial.println("Command from web: " + command); // Debug message serialOutput += "Command from web: " + command + "
"; // Add to serial output for display processCommand(command); // Process the command server.send(200, "text/html", "

Command sent: " + command + "

Go back"); } else { server.send(400, "text/plain", "No command provided"); } } void handleSendSerialInput() { if (server.hasArg("serialInput")) { String serialInput = server.arg("serialInput"); // Get the serial input from the form serialInput.trim(); // Remove extra spaces Serial.println("Serial Input from web: " + serialInput); // Send serial input to Serial processCommand(serialInput); // Process the command server.send(200, "text/html", "

Serial command sent: " + serialInput + "

Go back"); } else { server.send(400, "text/plain", "No serial command provided"); } } void storeCommand(String command) { lastCommands[commandIndex] = command; // Store command in array commandIndex = (commandIndex + 1) % 5; // Increment index, reset at 5 } // Function to convert MAC address to string String macToString(uint8_t *mac) { String macStr = ""; for (int i = 0; i < 6; i++) { macStr += String(mac[i], HEX); if (i < 5) macStr += ":"; } return macStr; }

Полный код Elbear Ace-uno

void setup() {
  pinMode(LED_BUILTIN, OUTPUT); // Настройка пина как выход
  Serial.begin(9600); // Настройка последовательного порта
  Serial.println("Ready to receive commands..."); // Сообщение о готовности
}

void loop() {
  if (Serial.available()) {
    String command = Serial.readStringUntil('\n'); // Чтение команды
    command.trim(); // Удаление лишних пробелов
    Serial.println("Received command: " + command); // Отладочное сообщение
    if (command == "LED_ON") {
      digitalWrite(LED_BUILTIN, HIGH); // Включение светодиода
      Serial.println("LED is ON"); // Подтверждение включения
    } else if (command == "LED_OFF") {
      digitalWrite(LED_BUILTIN, LOW); // Выключение светодиода
      Serial.println("LED is OFF"); // Подтверждение выключения
    } else {
      Serial.println("Unknown command"); // Сообщение о неизвестной команде
    }
  }
}

Если интересно, подписывайтесь на мой ТГ

© Habrahabr.ru