Научиться подключаться к WiFi сети с микроконтроллера Arduino и передавать данные по WiFi.
Плата NodeMCU построена на базе модуля WiFi ESP8266.
Распиновка платы:
Для работы с этой платой была добавлена поддержка среды разработки Arduino IDE. Практически все библиотеки для обычной Arduino так же работают и для этой платы, однако ее распиновка отличается от распиновки плат Arduino. Так, на плате есть один аналоговый вход (A0), на котором работает 10-битный АЦП. Цифровым пинам 0-15 Arduino соответствуют выходы, обозначенные GPIO1-GPIO16. Например, если в Arduino IDE используется пин 12, ему будет соответствовать контакт, обозначенный на плате как D6 (GPIO12). Пины GPIO1 — GPIO5, GPIO10, GPIO12-GPIO15 поддерживают ШИМ.
Характеристики платы:
поддержка WiFi протоколов 802.11 b/g/n
Wi-Fi Direct (P2P), soft-AP
встроенный стек TCP/IP
SDIO 2.0, SPI, UART
встроенный PLL, регуляторы, и система управления питанием
Номинальное напряжение: 3,3 В
Входное напряжение: 3,7–20 В
Максимальный потребляемый ток: 220 мА
D9, D10 — UART
D1, D2 — I²C (D1 - SCL(SCK), D2 - SDA)
D5–D8 — SPI
Для добавления поддержки NodeMCU в среду Arduino IDE нужно выполнить следующие шаги:



Скетч для работы с WiFi используем библиотеки, аналогичные стандартной библиотеке WiFi для обычных Arduino. При работе с обычной Arduino и каким-либо WiFi шилдом будут подключаться аналогичные заголовочные файлы, только без префикса "ESP8266".
Подключаем заголовочные файлы
Указываем параметры WiFi сети
WIFI_ESSID и WIFI_KEY заменяем на имя и пароль используемой WiFi сети.
В функции setup() запускаем Serial и подключаемся к WiFi
В функции loop выполняем GET запрос на WEB-страницу удаленного сервера. Для этого подключаемся к серверу
Отправляем сгенерированный вручную GET запрос
Ждем ответа от сервера
Выводим ответ и спим 10 секунд
Загружаем скетч на плату и открываем менеджер порта. Там раз в десять секунд должен появляться код веб-страницы, пришедший в ответ от сервера wl.unn.ru.
|
#include <ARpc.h>
#include <ARpcBase.h> #include <ARpcSrvReady.h> const char *deviceName="led_blink_test";//имя устройства const char *deviceId="{9c7ea7a4-5276-476a-914c-e95736ee304e}";//идентификатор устройства int ledPin=13;//пин светодиода unsigned long blinksCount=0;//число миганий const char *interfaceStr="<controls><group title=\"Device controls\"><control sync=\"0\" title=\"Blink\" command=\"blink\"/></group></controls>"; //для получения данных с устройства необходимо подготовить описание датчиков const char *sensorsDef="<sensors>" "<sensor name=\"blinks_count\" type=\"single\"/>"//датчик blinks_count "<sensor name=\"sin_x\" type=\"single\"><constraints dims=\"2\"/></sensor>"//датчик sin_x (двумерный) "</sensors>"; //Определяем функцию обработки команд, передаваемых устройству. //Библиотека будет вызывать эту функцию, когда на устройство будут //приходить команды, например, введенные нами в мониторе порта. //Эта функция принимает команду, аргументы команды, количество аргументов //и указатель на объект класса ARpc, от которого пришла команда void processCommand(const char *cmd,const char *args[],int argsCount,ARpc *parser) { if(strcmp(cmd,"blink")==0)//проверяем, что cmd == "blink" { //мигаем digitalWrite(13,HIGH); delay(200); digitalWrite(13,LOW); delay(200); ++blinksCount; //генерируем "измерение" parser->writeMeasurement("blinks_count",String(blinksCount).c_str()); //сообщаем библиотеке что команда обработана parser->writeOk(); } else parser->writeErr("Unknown cmd");//неизвестная команда } //Определяем функцию для передачи сообщений к ПК через последовательный пор void arpcWriteCallback(const char *str) { Serial.print(str); } //объявляем объект класса ARpc и передаем ему ссылки на созданные //выше переменные и функции ARpc parser(300,&processCommand,&arpcWriteCallback,deviceId,deviceName); int t=0; void writeSinVal() { String sinVal; sinVal+=String(sin(0.1*t)); sinVal+="|"; sinVal+=String(cos(0.1*t)); parser.writeMeasurement("sin_x",sinVal.c_str()); ++t; } //Проихводим инициальзацию пина и последовательного порта в функции setup() //и установить описание датчиков и интерфейса управления void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(13,OUTPUT); parser.setControlsInterface(interfaceStr); parser.setSensorsDescription(sensorsDef); } //необходимо проверять последовательный порт на наличие новых данных, передавать их объекту parser, сгенерировать новый отсчет sin, после чего сделать //задержку на пол-секунды, чтобы отсчеты не генерировались слишком часто void loop() { // put your main code here, to run repeatedly: while(Serial.available()) parser.putChar(Serial.read()); writeSinVal(); delay(500); } |