Что получится, если на 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. На этот раз я рассмотрю стандартные библиотеки для работы с сетью.
Для того чтобы получить список всех команд заглянем в файл ..AppDataLocalArduino15packagesesp8266hardwareesp82662.3.0librariesESP8266WiFikeywords.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 OKrnContent-Type: text/htmlrnrn<!DOCTYPE HTML>rn<html>rn»);
client.print(«<h3>MeteoStation v0.1</h3>rn»);
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 OKrnContent-Type: text/htmlrnrn<!DOCTYPE HTML>rn<html><h3>MeteoStation v0.1</h3>rn»;
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 OKrnContent-Type: text/htmlrnrn<!DOCTYPE HTML>rn<html><h3>MeteoStation v0.1</h3>rn»;
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 Кб)