Проект общежития на 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.
Но зачем такие сложности, если есть уже совмещенная плата?
Вместо слоеного пирога из двух плат:
Заказал вот эту плату:
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 не увенчались успехом (да и не старался особо):
Ведь библиотеки 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;
}
Источник: