Что получится, если на arduino uno вместо микроконтроллера atmega установить esp8266? Представляю вашему вниманию… WeMos D1R2!
Форма печатной платы WeMos D1R2, расположение выводов,usb-порта и разъема питания, выводов UART ,SPI, I2C и аналогового входа абсолютно идентичны расположению выводов платы arduino UNO. Но на этом совпадения заканчиваются, поскольку в основе WeMos лежит микроконтроллер ESP8266EX, а в роли преобразователя USB-UART микросхема CH340G.
Работа с платами на основе микроконтроллера ESP8266 на примере платы NodeMCU была рассмотрена в статье, почти всё о чем написано в той статье применимо и к WeMos, кроме распиновки платы. Но обо всем по порядку.
Официальный сайт производителя плат WeMos располагается по адресу https://www.wemos.cc, страница продукта под маркировкой D1R2 по адресу https://www.wemos.cc/product/d1.html. Обратите внимание на внешний вид оригинальной платы D1R2 (фото взято на официальном сайте). Данная плата покупалась на AliExpress за 3.5$
На плате установлен модуль ESP-12E (на модуле видно дополнительные 6 выводов, которых нет на ESP-12). Также на плате имеются дополнительные отверстия дублирующие все выводы.
А теперь взгляните на “клон” WeMos, который достался мне в рамках проекта “ЖелеЗона”. Микроконтроллер установлен непосредственно на плату (минус - если вдруг микроконтроллер сгорит, то заменить его будет сложнее, чем модуль), а не в виде модуля; имеется гнездо для внешней антенны (несомненный плюс) и так же имеются дополнительные выводы, но они не дублируют все выводы (только D0-D8, А0, RX/TX и питание). Из минусов я заметил странность с питанием платы: при подключении платы к ПК через USB-кабель плата не заработала и я не смог её прошить. Оказалось что питание платы осуществляется только через гнездо питания, и даже прошить без питания через это гнездо не получится.
Таким образом, у WeMos D1R2 перед NodeMCU есть ряд преимуществ:
-
совместимость с “шилдами”
-
разъем для антенны
-
удобное расположение и дублирование всех выводов
А недостаток пожалуй один - размер WeMos D1R2 раза в 3 больше NodeMCU (но недостаток ли это?).
При этом стоимость обоих плат одинаковая, и на данный момент составляет около 250 рублей (у китайских продавцов).
Рассмотрим распиновку WeMos D1R2 (данные взяты с официального сайта).
Pin |
Function |
ESP-8266 Pin |
TX |
TXD |
TXD GPIO1 |
RX |
RXD |
RXD GPIO3 |
A0 |
Analog input, max 3.3V input |
A0 |
D0 |
IO |
GPIO16 |
D1 |
IO, SCL |
GPIO5 |
D2 |
IO, SDA |
GPIO4 |
D3 |
IO, 10k Pull-up |
GPIO0 |
D4 |
IO, 10k Pull-up, BUILTIN_LED |
GPIO2 |
D5 |
IO, SCK |
GPIO14 |
D6 |
IO, MISO |
GPIO12 |
D7 |
IO, MOSI |
GPIO13 |
D8 |
IO, 10k Pull-down, SS |
GPIO15 |
G |
Ground |
GND |
5V |
5V |
- |
3V3 |
3.3V |
3.3V |
RST |
Reset |
RST |
Все выводы GPIO (кроме D0/GPIO16) поддерживают прерывания, ШИМ, I2C, 1-Wire.
Так же на сайте приведена принципиальная схема платы (PDF-файл по ссылке https://www.wemos.cc/sites/default/files/2016-09/D1_r2.pdf). Так же на www.wemos.cc можно найти ссылку на драйвера CH340 и, пожалуй, этот сайт больше ничем не может нам помочь.
Характеристики микроконтроллера
Параметры |
Значения |
|
WiFi параметры |
WiFi протоколы |
802.11 b/g/n |
Частотный диапазон |
2,4ГГц–2,5ГГц (2400М–2483,5М) |
|
Характеристики аппаратной части |
Периферийные шины |
UART/HSPI/I2C/I2S/инфракрасный интерфейс удаленного управления |
Рабочее напряжение |
3,0 – 3,6 В |
|
Рабочий ток |
среднее 80 мА максимальное 200 мА |
|
Диапазон рабочих температур |
-40 – 125 ºC |
|
Характеристики программного обеспечения |
WiFi режим |
STA, AP, STA+AP |
Безопасность |
WPA/WPA2 |
|
Шифрование |
WEP/TKIP/AES |
|
Обновление прошивки |
загрузка через UART / OTA (через сеть) / загрузка и запись прошивки через хост |
|
Сетевые протоколы |
IPv4, TCP/UDP/HTTP/FTP |
WeMos и ArduinoIDE
По большому счету работа с WeMos в ArduinoIDE ничем не отличается от работы NodeMCU в ArduinoIDE, кроме наименования выводов.
Но все же напомню, как добавить в ArduinoIDE файлы для работы с платами, основанными на ESP8266EX:
-
запустить ArduinoIDE;
-
перейти в пункт «Файл – Настройки»;
-
в поле «Дополнительные ссылки для Менеджера плат» ввести адрес http://arduino.esp8266.com/stable/package_esp8266com_index.json и нажать кнопку «ОК» (на скриншоте устаревшая и уже не рабочая ссылка);
-
перейти в пункт меню «Инструменты – Плата:… - Менеджер плат», откроется окно Менеджера плат;
-
в самом низу списка появится новый пункт «esp8266…», нажать на него и затем на кнопку «Установка»;
-
дождаться завершения загрузки и установки необходимых файлов (будут загружены несколько пакетов объемом не менее 160 мегабайт) и перезапустить ArduinoIDE.
-
Не забудьте в меню “Инструменты – Плата:…” выбрать плату “WeMos D1R2 & mini”.
Напомню, что вместе с “ядром” для программирования esp8266 в ArduinoIDE идут файлы, в которых указана распиновка платы. В нашем случае для D1R2 необходим файл, расположеный по адресу https://github.com/esp8266/Arduino/blob/master/variants/d1_mini/pins_arduino.h
#ifndef Pins_Arduino_h #define Pins_Arduino_h #include "../generic/common.h" #define PIN_WIRE_SDA (4) #define PIN_WIRE_SCL (5) static const uint8_t SDA = PIN_WIRE_SDA; static const uint8_t SCL = PIN_WIRE_SCL; static const uint8_t LED_BUILTIN = 2; static const uint8_t BUILTIN_LED = 2; static const uint8_t D0 = 16; static const uint8_t D1 = 5; static const uint8_t D2 = 4; static const uint8_t D3 = 0; static const uint8_t D4 = 2; static const uint8_t D5 = 14; static const uint8_t D6 = 12; static const uint8_t D7 = 13; static const uint8_t D8 = 15; static const uint8_t RX = 3; static const uint8_t TX = 1; #endif /* Pins_Arduino_h */
А так же файл https://github.com/esp8266/Arduino/blob/master/variants/generic/common.h в котором описаны остальные выводы (я же приведу часть файла, только с необходимыми для нас данными).
#define PIN_SPI_SS (15) #define PIN_SPI_MOSI (13) #define PIN_SPI_MISO (12) #define PIN_SPI_SCK (14) static const uint8_t SS = PIN_SPI_SS; static const uint8_t MOSI = PIN_SPI_MOSI; static const uint8_t MISO = PIN_SPI_MISO; static const uint8_t SCK = PIN_SPI_SCK; #define PIN_A0 (17) static const uint8_t A0 = PIN_A0;
Как видите, используемая распиновка совпадает с распиновкой на официальном сайте.
В предыдущей статье я показывал, как можно получить доступ к устройству по глобальной сети при помощи облачного сервиса RemoteXY. На этот раз я рассмотрю стандартные библиотеки для работы с сетью.
Для того чтобы получить список всех команд заглянем в файл ..\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\keywords.txt (краткое описание в скобках добавлено мной).
####################################### # Syntax Coloring Map For ESP8266WiFi ####################################### ####################################### # Library (KEYWORD3) ####################################### ESP8266WiFi KEYWORD3 ####################################### # Datatypes (KEYWORD1) ####################################### WiFi KEYWORD1 WiFiClient KEYWORD1 WiFiServer KEYWORD1 WiFiUDP KEYWORD1 WiFiClientSecure KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) ####################################### status KEYWORD2 (возвращает статус подключения, список статусов смотрите на http://wikihandbk.com/wiki/Arduino:Библиотеки/WiFi/Класс_WiFi/status() (список актуален для Wi-Fi-шилда)) mode KEYWORD2 (режим подключения, "NULL", "STA", "AP", "STA+AP") connect KEYWORD2 (подключение к указанному IP/URL, порту) write KEYWORD2 (отправка данных на сервер, к которому подключен клиент) available KEYWORD2 (возвращает количество не прочитанных байт, полученных сервером от клиента) config KEYWORD2 (позволяет задать IP, DNS, шлюз и маску подсети) setDNS KEYWORD2 (настройка DNS-сервера) read KEYWORD2 (считывает байт из данных, пришедших серверу от клиента) flush KEYWORD2 (очищает буфер) stop KEYWORD2 (отключает клиент от сервера) connected KEYWORD2 (проверяет, подключен ли клиент) begin KEYWORD2 (подключение к указанной Wi-Fi сети, либо создание сервера (в зависимости от настроек)) beginMulticast KEYWORD2 disconnect KEYWORD2 (отключает модуль от текущей сети) macAddress KEYWORD2 (возвращает MAC-адрес модуля) localIP KEYWORD2 (возвращает IP-адрес модуля) subnetMask KEYWORD2 (возвращает информацию о маске подсети WiFi-модуля) gatewayIP KEYWORD2 (возвращает информацию о сетевом шлюзе WiFi-модуля) SSID KEYWORD2 (возвращает имя сети, к которой подключен модуль) psk KEYWORD2 BSSID KEYWORD2 (возвращает MAC-адрес роутера, к которому подключен модуль) RSSI KEYWORD2 (информация о мощности сигнала сети, к которой подключен модуль) encryptionType KEYWORD2 (возвращает тип шифрования сети, к которой подключен модуль: «2» – TKIP (WPA), «5» – WEP, «4» – CCMP (WPA), «7» – никакого, «8» – автоматическое (согласно описанию функции на http://wikihandbk.com/wiki/Arduino:Библиотеки/WiFi/Класс_WiFi/encryptionType() ) beginPacket KEYWORD2 (запуск соединения для отправки UDP-пакетов) beginPacketMulticast KEYWORD2 (то же самое для multicast-пакетов) endPacket KEYWORD2 (завершает формирование пакета данных и отправляет его) parsePacket KEYWORD2 (проверяет наличие входящего UDP-пакета и возвращает его размер) destinationIP KEYWORD2 (проверяет, был ли отправлен мультикаст пакет данному устройству) remoteIP KEYWORD2 (возвращает IP-адрес удаленного устройства) remotePort KEYWORD2 (возвращает номер порта на удаленном устройстве) softAP KEYWORD2 (создает точку доступа) softAPIP KEYWORD2 (возвращает IP-адрес устройства в режиме точки доступа) softAPmacAddress KEYWORD2 (возвращает MAC-адрес устройства в режиме точки доступа) softAPConfig KEYWORD2 printDiag KEYWORD2 (выводит диагностическую информацию) hostByName KEYWORD2 scanNetworks KEYWORD2 (сканирует доступные сети и возвращает их количество) ####################################### # Constants (LITERAL1) ####################################### WIFI_AP LITERAL1 WIFI_STA LITERAL1 WIFI_AP_STA LITERAL1
Первым делом рассмотрим случай подключения WeMos к точке доступа Wi-Fi, получения данных с датчика bme280 и вывод полученных данных в виде html-страницы в любом браузере. При этом доступ к WeMos будет осуществляться только из локальной сети. Все пояснения в комментариях.
#include <ESP8266WiFi.h> #include <BME280.h> #include <Wire.h> //подключаем необходимые библиотеки const char* ssid = "J3"; //задаем имя точки доступа, к которой будем подключаться const char* password = "12345678"; //и пароль от этой точки доступа WiFiServer server(80); //создаем сервер на 80 порту BME280 bme; //настраиваем работу с bme280 void setup() { Serial.begin(115200); //отладочную информацию будем выводить в терминал delay(10); WiFi.begin(ssid, password); //подключаемся к точке доступа с заданными именем и паролем while (WiFi.status() != WL_CONNECTED) { //ожидаем подключение, статус WL_CONNECTED означает что соединение установлено delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); //оповещение в терминал, что соединение с точкой доступа установлено server.begin(); //запускаем сервер //далее идет дополнительная информация Serial.println("Server started"); Serial.println(WiFi.localIP()); //получаем IP WeMos, этот IP необходимо ввести в адресной строке браузера, чтобы получить доступ к WeMos Serial.println(WiFi.macAddress()); //получаем MAC-адрес WeMos Serial.println(WiFi.subnetMask()); //маску подсети Serial.println(WiFi.gatewayIP()); //IP- шлюза Serial.println(WiFi.SSID());// имя сети, к которой подключен WeMos Serial.println(WiFi.RSSI()); //и уровень сигнала bme.begin(); //запускаем датчик bme280 } void loop() { WiFiClient client = server.available(); //создаем клиент if (client) { //если доступен клиент, то генерируем html страницу //генерировать страницу можно двумя способами, отправлять данные клиенту частями по мере их доступности, либо сгенерировать строку с данными и отправлять эту строку целиком //первый пример отправляет данные частями. У этого метода замечен недостаток, страница формируется довольно долго, к тому же может вообще зависнуть на этапе формирования страницы. /* client.print("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n"); client.print("<h3>MeteoStation v0.1</h3>\r\n"); client.print("<p> Temp C: "); client.print(bme.ReadTemperature(HIGH)); client.print("</p><p> Press Pa: "); client.print(bme.ReadPressure()); client.print("</p><p> Press mm: "); client.print(bme.ReadPressure()/133.3); client.print("</p><p> Hum %: "); client.print(bme.ReadHumidity()); client.print("</p><p> Altitude m: "); client.print(bme.CalculateAltitude()); client.print("</p><p> Dew Point C: "); client.print(bme.CalculateDewPoint(HIGH)); client.print("</p></html>\n"); */ //Во втором способе создается строка, в которую последовательно записываются все данные сформированной страницы. Такой способ формирования страницы намного быстрее, можно сказать моментальный. String s="HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html><h3>MeteoStation v0.1</h3>\r\n"; s+="<p>Temp C: "; s+=bme.ReadTemperature(HIGH); s+="</p><p> Press Pa: "; s+=bme.ReadPressure(); s+="</p><p> Press mm: "; s+=bme.ReadPressure()/133.3; s+="</p><p> Hum %: "; s+=bme.ReadHumidity(); s+="</p><p> Altitude m: "; s+=bme.CalculateAltitude(); s+="</p><p> Dew Point C: "; s+=bme.CalculateDewPoint(HIGH); s+="</p></html>\n"; client.print(s); delay(1); client.flush(); //очищаем данные client.stop(); //разрываем соединение с клиентом } }
Обратите внимание на скриншот терминала. В терминал выведена дополнительная информация, и самое главное в ней - IP-адрес WeMos в локальной сети.
Так выглядят данные в браузере, просто и без излишеств. Обратите внимание на адресную строку, доступ осуществляется по тому IP-адресу, который был получен через терминал.
А теперь то же самое, но WeMos будет выступать в качестве точки доступа.
#include <ESP8266WiFi.h> #include <BME280.h> #include <Wire.h> //подключаем необходимые библиотеки const char *ssid = "ESPap"; //задаем имя создаваемой сети const char *password = ""; //пароль не указан, сеть будет открыта WiFiServer server(80); //сервер на 80 порту BME280 bme; //настраиваем датчик BME280 void setup() { Serial.begin(115200); //будем выводить отладочную информацию в терминал WiFi.softAP(ssid, password); //создаем точку доступа, с указанными ранее именем и паролем. IPAddress myIP = WiFi.softAPIP(); //получаем IP-адрес WeMos (по умолчанию 192.168.4.1) Serial.print("AP IP address: "); //выводим полученный IP-адрес в терминал Serial.println(myIP); server.begin(); //запускаем сервер Serial.println("Server started"); bme.begin(); //запускаем работу с BME280 } void loop() { WiFiClient client = server.available(); if (client) {//если клиент подключен Serial.println("Client connected"); //выводим сообщение об этом в терминал String s="HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html><h3>MeteoStation v0.1</h3>\r\n"; s+="<p>Temp C: "; s+=bme.ReadTemperature(HIGH); s+="</p><p> Press Pa: "; s+=bme.ReadPressure(); s+="</p><p> Press mm: "; s+=bme.ReadPressure()/133.3; s+="</p><p> Hum %: "; s+=bme.ReadHumidity(); s+="</p><p> Altitude m: "; s+=bme.CalculateAltitude(); s+="</p><p> Dew Point C: "; s+=bme.CalculateDewPoint(HIGH); s+="</p></html>\n"; //формируем страницу client.print(s); //и отправляем её клиенту delay(1); client.flush(); client.stop(); //разрываем соединение с клиентом Serial.println("Client disconnected"); //выводим сообщение в терминал что клиент отключен } }
И скриншоты терминала
и браузера при способе подключения "точка доступа".
Приведенные примеры показывают, как получить данные от WeMos и подключенных к нему датчиков, но вопрос управления WeMos через браузер остался в стороне. Об этом в следующих статьях. Продолжение не за горами.
Прикрепленные файлы:
- WeMos.zip (2 Кб)
Комментарии (2) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация