Создание веб-сервера с помощью ESP8266
В этом проекте мы сначала рассмотрим, как установить надстройку ESP8266 в среде разработки Arduino, а затем создать настраиваемый веб-сервер с ESP8266.
ESP8266 популярен во многом потому, что он обладает отличным соотношением производительности и стоимости. Он также может подключить интернет через Wi-Fi к микропроцессору.
Его основным недостатком является его энергопотребление. ESP8266 - это не очень эффективный чип, поскольку он предназначен для соблюдения протокола IEEE 802.1 (который мы знаем как Wi-Fi), который доступен в большинстве домов и предприятий. Эта повестка дня протокола гарантирует хорошую скорость и надежность для создания беспроводных локальных сетей. Более высокая скорость приводит к более высокой потребляемой мощности, что делает ESP8266 неэффективным для маломощных конструкций.
Однако ESP8266 очень полезен в тех случаях, когда потребляемая мощность не важна, например, устройства, которые постоянно питаются и не требуют батареи. ESP8266 может подключаться к любой сети Wi-Fi и отправлять или получать данные через различные протоколы, такие как TCP и UDP. Кроме того, он может построить точку доступа Wi-Fi и управлять другими устройствами.
Вопросы проектирования схем
Для передачи данных ESP8266 может потребоваться ток 250 мА. Поэтому нам может понадобиться не менее 500 мА для питания ESP8266, если мы хотим иметь хороший запас. Включение ESP8266 с помощью USB-кабелей, которые получают питание от компьютера, может привести к нестабильности.
В этом проекте мы используем источник питания 5 В, который гарантирует ток 1А и LM1086-3.3V в качестве регулятора для питания ESP8266. На рисунке 1 показана конфигурация контактов для использования ESP8266 как в загрузчике, так и в режиме использования.

Рисунок 1. Использование ESP8266 в загрузчике и режиме использования. Источник изображения: //github.com/adafruit/ESP8266-Arduino
Дополнение Arduino
Установка надстройки ESP8266 описана во многих статьях в Интернете, но для ясности мы кратко расскажем об установке. Чтобы установить дополнение ESP8266, нам необходимо обновить диспетчер платы в среде разработки Arduino. Дополнительный URL-адрес менеджера плат может быть добавлен из URL-адресов «Файл-> Настройки-> Дополнительные платы». В разделе URL-адреса нужно ввести следующий URL-адрес, как показано на рисунке 2.

Рисунок 2. Дополнительные URL-адреса диспетчера плат
Обновляя URL-адреса, надстройку ESP8266 можно получить, перейдя в меню «Инструменты» -> «Платы ->». Плата ESP8266 доступна и должна быть установлена. После установки в разделе плат будут доступны модули ESP8266. Различные типы модулей могут быть выбраны, и для целей этого проекта (поскольку мы построили плату, которую мы используем), мы будем использовать общий модуль ESP8266.
Загрузка эскиза в ESP8266
Для программирования ESP8266 мы используем загрузчик UART, который уже содержит ESP8266. В этом проекте я сделал простую плату разработки для ESP8266 со схемой, подобной рис. 3, и следующим списком деталей:
1. ESP8266-12 (E или F не имеет значения в области следа и единственной разницей является память)
2. 3.3K резистор x 2
3. 470R резистор для светодиодного индикатора питания
4. Один светодиод, который определяет, питается ли плата или нет
5. AMS1117-3.3: Регулятор напряжения
6. Электролитный конденсатор 10uF-25v
7. Электролитный конденсатор 22uF-25v
8. 100nF конденсатор
9. Один 3-контактный разъем для последовательной связи
10. Один 2-контактный разъем для входа в загрузчик
Для входа в режим загрузки GPIO0 должен быть заземлен для запуска ESP8266. Затем, установив соответствующий COM-порт в Arduino IDE, эскиз можно загрузить, нажав кнопку загрузки. После программирования GPIO0 должен быть плавающим, поскольку ESP8266 должен запускаться в обычном режиме и запускать программу.

Рисунок 3. Схема разработки ESP8266-12E
Подключение к точке доступа
ESP8266 имеет встроенную EEPROM, которая может использоваться для приложений, таких как хранение данных, чтобы создать безопасную страницу входа в систему. Использование EEPROM очень похоже на другие платы Arduino с небольшими отличиями.
Во-первых, вам нужно позвонить EEPROM.begin (размер), прежде чем начать чтение или запись. Размер - это количество байтов, которое вы хотите использовать, где-то между 4 и 4096 байтами. Обратите внимание, что EEPROM.write () не записывает в flash немедленно. Вы должны позвонить EEPROM.commit () в любое время, когда вы хотите сохранить изменения во flash.
В этом проекте мы хотим создать настраиваемый веб-сервер, который может быть размещен в каждой сети (т. Е. В новой сети, у которой нет SSID и пароль для подключения к точке доступа) для подключения к предыдущим настройкам. Когда он не сможет подключиться, ESP8266 перейдет в режим точки доступа и дождитесь получения настроек конфигурации (SSID и пароль).
Вначале мы получаем 512 байт EEPROM и проверяем, доступно ли имя пользователя или пароль. Мы также можем выбрать конкретный IP-адрес для нашего устройства и установить его вручную, который необходимо сохранить в EEPROM. Настройка IP-адреса устройства вручную полезна, когда нам нужно создать базу данных наших устройств, чтобы узнать их местоположение и определение.
В следующем фрагменте полного кода мы резервируем 512 байт из EEPROM, а затем, после сбора информации, мы пытаемся подключиться к точке доступа. В полном коде код будет обходить этап соединения, если EEPROM пуст.
EEPROM.begin(512); IPAddress ipad(192, 168, 1, eip.toInt()); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0); WiFi.begin(esid.c_str(), epass.c_str()); WiFi.config(ipad, gateway, subnet);
Вышеприведенный код пытается подключиться к сети с определенным IP-адресом, который хранится в EEPROM. Одна вещь, которую следует помнить при использовании конкретного IP-адреса, это то, что нам нужно знать IP-адрес шлюза, а также маску подсети сети. С другой стороны, указанные пункты не нужны для автоматической IP-адресации, для которой требуется сервер DHCP.
Проверка статуса Wi-Fi возможна с использованием функции WiFi.status (). Согласно веб-сайту Arduino, эта функция возвращает следующее:
- WL_CONNECTED: назначается при подключении к сети Wi-Fi
- WL_NO_SHIELD: назначается, если нет экрана Wi-Fi
- WL_IDLE_STATUS: временный статус, назначенный, когда вызывается WiFi.begin (), и остается активным до тех пор, пока не истечет количество попыток (в результате получается WL_CONNECT_FAILED) или соединение установлено (в результате WL_CONNECTED)
- WL_NO_SSID_AVAIL: назначается, когда нет SSID
- WL_SCAN_COMPLETED: назначается, когда сети сканирования завершены
- WL_CONNECT_FAILED: назначается при сбое соединения для всех попыток
- WL_CONNECTION_LOST: назначается, когда соединение потеряно
- WL_DISCONNECTED: назначается при отключении от сети
Используя функцию WiFi.status (), мы можем проверить статус подключения и, если ее там нет, ESP8266 должен перейти к точке доступа.
Переход к конфигурации точки доступа может быть выполнен с помощью WiFi.mode (WIFI_AP), для которого потребуется имя пользователя и пароль. Установка имени пользователя и пароля может быть выполнена с помощью функции WiFi.softAP. Описание каждой функции Wi-Fi сделает эту статью невероятно длинной и выходит за рамки этого проекта. Тем не менее, желающий может найти очень полную документацию о функциях Wi-Fi и других библиотеках для ESP6288 на GitHub и веб-сайте Arduino.
В этом проекте мы хотим подключить наше устройство к существующей сети. Сначала, когда у нашего устройства нет SSID и пароля для подключения к сети, он переходит в режим точки доступа, а затем мы можем его настроить. После настройки устройство может подключиться к требуемой сети. С другой стороны, кто-то может захотеть использовать ESP8266 только в режиме точки доступа. В этом случае нам нужно подключиться к устройству всякий раз, когда мы хотим передать данные.
Поэтому в режиме точки доступа ESP8266 будет ожидать новый набор конфигураций. Сканирование доступных точек беспроводного доступа в этой области может осуществляться с помощью WiFi.scanNetworks, которая возвращает целые числа, определяя существующие точки доступа. После сбора количества доступных сетей следующие функции могут предоставить вам всю необходимую информацию:
- WiFi. SSID: получает SSID текущей сети
- WiFi. RSSI: получает мощность сигнала от соединения с маршрутизатором
- WiFi.encryptionType: получает тип шифрования текущей сети
На рисунке 4 показаны выходы WiFi.scanNetworks. Данные записываются через RS232-связь и программу TeraTerm.

Рисунок 4. Сканированные сети
MDNS
Создание веб-сервера на ESP8266 легко с помощью встроенных библиотек. Кроме того, создание простой многоадресной системы доменных имен (mDNS), которая связывает имя с нашим сервером IP в сети, возможно с использованием библиотеки ESP8266mDNS. MDNS разрешает имена хостов IP-адресам в небольших сетях с отсутствием локального сервера имен. Он использует одни и те же программные интерфейсы, форматы пакетов и операционную семантику как одноадресный DNS.
Затем «mdns.begin ('esp8266')« определяет сервер mDNS для определения с именем ESP8266. Если все работает нормально, функция mdns.begin возвращает true, и мы можем запустить сервер server.begin ().
Чтение запроса GET
Мы можем обновлять запросы mDNS с помощью mdns.update (), а затем читать запросы как клиент. Приведенный ниже код сначала обновляет запросы mDNS, а затем, если пакет доступен, читает его.
mdns.update(); WiFiClient client = server.available(); if (!client) { return(20); } String req = client.readStringUntil('\r'); // Wait for data from client to become available if(client.connected() & !client.available()){ return(20); }
В приведенном выше коде ESP8266 проверяет, доступен ли какой-либо клиент или нет. Если клиент доступен, он будет считывать свои данные, пока не получит «\ r», что означает конец пакета. С этого момента наш веб-сервер может получать запросы GET, но не может их интерпретировать или отправлять ответ.
Отправка ответа клиента может быть выполнена с помощью функции client.print (). Для клиента, чтобы увидеть его как веб-контент (т. Е. Увидеть ответ в браузере, таком как Firefox), ответ должен быть в формате HTML. Таким образом, мы можем создать графический веб-сервер HTML с нашим ESP8266.
В приведенном выше коде мы читаем запрос GET клиента и сохраняем его в переменной «req». Теперь переменная «req» имеет данные GET, и мы можем просто интерпретировать ее. В соответствии с запросом клиента GET мы должны создать String и с помощью функции client.print () получить ответ клиента. Нижеприведенный фрагмент генерирует простую HTML-страницу для ответа клиенту.
s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n\r\nALL ABOUT CIRCUITS!"; s += "
"; s + =" \ r \ n \ r \ n "; client.print (s);
В фрагменте команда «200» была отправлена клиенту.
Вывод
В этом проекте были изучены библиотеки ESP8266 для создания простого веб-сервера. Затем был создан настраиваемый веб-сервер, который принимает SSID и пароль требуемой беспроводной сети. Наконец, после подключения к локальной сети, GET-запросы были переданы между устройством и клиентом.
Скачать код
Попробуйте этот проект сами! Получить спецификацию.