Используем Arduino UNO с WiFi на одной плате для POST запроса на сервер

Проект общежития на 5 этажей в Visio.Wi-Fi терморегулятор за 1630р в ближайшую Черную Пятницу Используем Arduino UNO с WiFi на одной плате для POST запроса на сервер24 ноября 2019 г.Просмотров: 4470Комментарии: 0
ArduinoМониторингГаджетыAliExpressArduinoESP8266WiFiИнтернет Вещей

В статье «Как у меня заработал WIFI для Arduino ESP8266 ESP-12E» рассказывал как заставить работать платы Arduino UNO с ESP8266 ESP-12E UART Wi-Fi.

Но зачем такие сложности, если есть уже совмещенная плата?

Вместо слоеного пирога из двух плат:

Используем Arduino UNO с WiFi на одной плате для POST запроса на сервер

Заказал вот эту плату:

Используем Arduino UNO с WiFi на одной плате для POST запроса на сервер

UNO R3 + WiFi ATmega328P+ESP8266 (32Mb memory) USB-TTL CH340G For Arduino Uno NodeMCU WeMos ESP8266 One New Arrival

И она заработала безо всяких прошивок и перепрошивок.

Работает только на скорости 115200

Среда Arduino уже была настроена для работы.

Осталось только переключатели перещелкивать, чтобы заливать скетч в UNO.

Таблица положений переключателей есть здесь.

Вот только не упомянуто положение переключателей (1-4 ON), когда во время работы Mega328+ESP8266 CH340 мониторит порт и выводит в консоль передаваемые команды.

Как настроить среду Arduino объясняется здесь или здесь.

Таблица переключателей.

 

1

2

3

4

5

6

7

8

CH340 connect to ESP8266 (upload sketch)

OFF

OFF

OFF

OFF

ON

ON

ON

NoUSE

CH340 connect to ESP8266 (connect)

OFF

OFF

OFF

OFF

ON

ON

OFF

NoUSE

CH340 connect to ATmega328 (upload sketch)

OFF

OFF

ON

ON

OFF

OFF

OFF

NoUSE

Mega328+ESP8266

ON

ON

OFF

OFF

OFF

OFF

OFF

NoUSE

All modules work independent

OFF

OFF

OFF

OFF

OFF

OFF

OFF

NoUSE

Совместная работа и мониторинг команд

ON

ON

ON

ON

OFF

OFF

OFF

NoUSE

Передача информации на серверы Cayenne и RemoteXY.

Протестировал плату на решении задач, скетчи которых заливал в слоеный пирог из двух плат:

Подключаем Arduino UNO при помощи ESP8266-12E к облаку Cayenne.

Мониторинг Arduino UNO + ESP8266 через облачный сервер RemoteXY.

Эти сервисы предоставляют свои библиотеки для работы с ESP8266.

Все заработало сразу без изменений и мучений.

Необходимо в скетчах заменить скорость на 115200.

Передача информации на произвольный сервер.

Решение предыдущей задачи «Отправка данных из ESP8266WiFi на сервер с CMS MaxSite» с этой платой повторить не удалось.

Для отправки данных на произвольный сервис использовалась универсальная библиотека WiFiESP.

И оказалось, что эта библиотека не заработала с этой платой, выдавая

[WiFiEsp] Warning: Unsupported firmware 0.9.5

Действительно, модуль при обращении с соответствующей командой AT+GMR сообщает версию SDK 0.9.5:

AT+GMR
AT version:0.21.0.0
SDK version:0.9.5

В файле README.md библиотеки можно прочитать:

Supports ESP SDK version 1.1.1 and above (AT version 0.25 and above).

Попытки обновить прошивку при помощи flash_download_tools не увенчались успехом (да и не старался особо):

Используем Arduino UNO с WiFi на одной плате для POST запроса на сервер

Ведь библиотеки Cayenne и RemoteXY для этой платы заработали без проблем!

Помогли статьи:

instructables.com/id/Arduino-Esp8266-Post-Data-to-Website и developer.alexanderklimov.ru/arduino/playground/uno_esp8266wifi

В этих статьях описывается способ обращения к ESP8266 обычными командами без библиотек.

Будем обрабатывать POST запрос к серверу при помощи плагина my_esp8266 для MaxSiteCMS, который принимает данные.

Заработал вот такой скетч.

// отсылает данные в плагин http://fil-tec.ru/tag/My_ESP8266 для MaxSite CMS
String ssid =»Router name»;
String password=»**********»;
String server = «my.site.ru»; // сайт, на котором установлен пагин My_esp8266
String uri = «/ajax/**************************»; // скопировать со страницы «Тест» админки плагина My_esp8266 адрес для обращения с запросами
String PORT = «80»;
int countTrueCommand;
int countTimeCommand;
boolean found = false;
int valSensor = 1;
String jsonString; // данные
String PostHeader; // заголовок
String data;
int DHpin = 4; //sensor pin
byte dat [5];
String temp ,hum;
#define PIN_SWITCH_1 12
#define PIN_SWITCH_2 13
void setup()
{
pinMode (DHpin, OUTPUT);
pinMode (PIN_SWITCH_1, OUTPUT);
pinMode (PIN_SWITCH_2, OUTPUT);
Serial.begin(115200);
reset();
connectWifi();
}
void reset()
{
Serial.println(«AT+RST»);
delay(1000);
}
//connect to your wifi network
void connectWifi()
{
Serial.begin(115200);
sendCommand(«AT», 5, «OK»);
sendCommand(«AT+CWMODE=1», 5, «OK»);
sendCommand(«AT+CWJAP=»» + ssid + «»,»» + password + «»», 20, «OK»);
digitalWrite(PIN_SWITCH_2, (found == true)?LOW:HIGH);
}
byte read_data ()
{
byte data;
for (int i = 0; i < 8; i ++)
{
if (digitalRead (DHpin) == LOW)
{
while (digitalRead (DHpin) == LOW); // wait for 50us
delayMicroseconds (30); // determine the duration of the high level to determine the data is ‘0 ‘or ‘1’
if (digitalRead (DHpin) == HIGH)
data |= (1 << (7-i)); // high front and low in the post
while (digitalRead (DHpin) == HIGH); // data ‘1’, wait for the next one receiver
}
}
return data;
}
void start_test ()
{
digitalWrite (DHpin, LOW); // bus down, send start signal
delay (30); // delay greater than 18ms, so DHT11 start signal can be detected
digitalWrite (DHpin, HIGH);
delayMicroseconds (40); // Wait for DHT11 response
pinMode (DHpin, INPUT);
while (digitalRead (DHpin) == HIGH);
delayMicroseconds (80); // DHT11 response, pulled the bus 80us
if (digitalRead (DHpin) == LOW);
delayMicroseconds (80); // DHT11 80us after the bus pulled to start sending data
for (int i = 0; i < 4; i ++) // receive temperature and humidity data, the parity bit is not considered
{
Serial.println(i);
dat[i] = read_data ();
}
pinMode (DHpin, OUTPUT);
digitalWrite (DHpin, HIGH);
// send data once after releasing the bus, wait for the host to open the next Start signal
}
void loop ()
{
start_test (); // convert the bit data to string form
hum = String(dat[0]);
temp= String(dat[2]);
jsonString = «secret=0000&name=ESP_8266WiFi&temp=» + temp + «&hum=» + hum;
httppost();
delay(1000);
}
void httppost ()
{
String postRequest =
«POST » + uri + » HTTP/1.1rn» +
«Host: » + server + «rn» +
«User-Agent: ESP8266WiFirn» +
«Accept: application/xmlrn» +
«X-Requested-With: XMLHttpRequestrn» +
«Referer: http://my.site.rurn» +
«Connection: closern» +
«Content-Length: » + jsonString.length() + «rn» +
«Content-Type: application/x-www-form-urlencodedrn» +
«rn» + jsonString;

sendCommand(«AT+CIPMUX=1», 5, «OK»);
sendCommand(«AT+CIPSTART=0,»TCP»,»» + server + «»,» + PORT, 15, «OK»);
sendCommand(«AT+CIPSEND=0,» + String(postRequest.length() + 2), 4, «>»);
sendCommand(postRequest, 5, «OK»);
delay(1500);
countTrueCommand++;
sendCommand(«AT+CIPCLOSE=0», 5, «OK»);
}
void sendCommand(String command, int maxTime, char readReplay[])
{
while (countTimeCommand < (maxTime * 1))
{
Serial.println(command);//at+cipsend
delay(1500);
if (Serial.find(readReplay)) //ok
{
found = true;
break;
}
countTimeCommand++;
}
if (found == true)
{
// успешно
digitalWrite(PIN_SWITCH_1, LOW);
countTrueCommand++;
countTimeCommand = 0;
}
if (found == false)
{
// неудачно
digitalWrite(PIN_SWITCH_1, HIGH);
countTrueCommand = 0;
countTimeCommand = 0;
}
found = false;
}

Источник: fil-tec.ru