Arduino библиотеки esp8266

Jon

Member
ну и до кучи запустил сервер. Вроде нормально реагирует. По своему адресу отвечает: 404 Yes, this is true...
 

anakod

Moderator
Команда форума
Это не нормально но бывает. Либо слишком много подключений, либо не хватает размера буфферов (а еще может и просто еспешка глючит :). Плюс моей библиотеки в том, что ее это не убивает, и даже если EPSP просто подвиснет велика вероятность что Ардуино сама ее перезагрузит.

А Вы мои рекомендации с гитхаба по размерам буферов читали, применяли?
 

Jon

Member
Подключил конфигуратор на прямую к модулю.
Для начала я понизил скорость до 9600. (после прошивки 115200 и через конфигуратор ее уже нельзя изменить, только программно).
Проверил команды:
AT+CIPSTA? +CIPSTA:"192.168.1.228"
AT+CIPAP? +CIPAP:"192.168.4.1"
AT+CIPSTATUS STATUS:4
почему-то выдает 4- дисконект или 5 - вообще не понятный статус.

Размер буфера не проверял. Думаю он не причем. Попробую перейти на 20 версию прошивки...
 

Jon

Member
я в протоколах плохо разбираюсь. Подскажите как правильно сформировать отправку на сайт по протоколу TCP.
Вот попробовал так:
AT+CIPSTART="TCP","94.19.113.221",80
OK
Linked
AT+CIPSEND=POST http://narodmon.ru/post.php HTTP/1.0 type error
OK
Unlink
но ему мой вариант типа не нравится. Как это разрулить?
На сайте предлагают так оформлять:
Пример передачи показаний TCP на PHP
$fp = @fsockopen("tcp://narodmon.ru", 8283, $errno, $errstr);
if(!$fp) exit("ERROR(".$errno."): ".$errstr);
fwrite($fp, "#00-1C-C0-7A-B0-18\n#P1#760\n#T1#13.54\n##");
fclose($fp);
но эти буковки мне не под силу разгадать.
 

Jon

Member
Все! разрулил:
Код:
void loop()
{
   String content ="#ESP8266009f3c80\r\n";    //МАК устройства
   content +="#82669f3c800011#29.9\r\n";      //1 -датчик
   content +="#82669f3c800012#757.8\r\n";     //2- датчик
   content +="##\r\n";
 
// Send request
  ESP8266proClient con(wifi, printResponse);
   con.connectTcp("94.19.113.221", 8283);//norodmon.ru
   con.send(content);
  con.waitResponse();
  con.close();

  delay(600000);//600000 10 минут, было 5000
}

// Optional method to process remote response
void printResponse(ESP8266proConnection* connection,
          char* buffer, int length, boolean completed)
{
  Serial.print(buffer);
}
В таком виде данные передаются на НародныйМонитор.
Но почему то не в бесконечном цикле, а только один раз. Для повторной отправки нужно Ардуину перезагружать..
 
Последнее редактирование:

anakod

Moderator
Команда форума
1. https://github.com/anakod/ESP8266pro - посмотрите рекомендации по размеру буфера в конце страницы, это очень важный момент, из-за него вероятно все основные Ваши проблемы.
Если используете HardwareSerial для коммуникации с ESP, то менять надо SERIAL_BUFFER_SIZE

2. В printResponse Вы делаете Serial.print(buffer); если он подключен к ESP, то это не правильно, этот оутпут был предназначен для пользователя а никак не для обратной отправки в UART модуля.
Вообще же, если Вы не обрабатываете ответ веб сервера, то всю эту функцию и ссылку на нее можно полностью удалить. Она не обязательна, так даже будет лучше если Вы все равно ее не используете.

3. Я не совсем уверен что конструкция вида delay(600000); допустима. Скорее тогда лучше сделать 600 слипов по 1000 мс в цикле. Вообще специально для таких целей есть специальные режимы пониженного энергопотребления, но это уже отдельная тема.
 
  • Like
Реакции: Jon

Jon

Member
Спасибо. Я все понял.
Понизив скорость ESP8266через конфигуратор до 9600, я смог подключить модуль к программному порту.
Загрузку и контроль веду через стандартный порт.
Основной цикл работает штатно, если получаю ответ ОК, но при ошибке передачи данных в буфере полный хлам и Ардуина зависает.
При такой ситуации можно как-то Ардуину программно перезагружать?
 

anakod

Moderator
Команда форума
В случае использования SoftwareSerial, поменять нужно другую константу - _SS_MAX_RX_BUFF
Хлам в буфере скорее всего говорит о том, что либо буфера не хватает и данные теряются, либо одновременно идет прием и передача (с чем плохо дружит программный сериал) либо что-то еще.

PS Когда закончите тестирование, выложите, пожалуйста, полный код, я думаю многим будет полезно.
 

anakod

Moderator
Команда форума
Еще зависание может быть следствием нехватки памяти, тут тоже можно применить несколько оптимизаций:
1. Уменьшить размер буфера того Serial, который направлен в сторону пользователя (а не ESP)

2. Отправлять данные не из оперативной памяти, а из кода программы. Это может довольно сильно сэкономить память, если narodmon готов принимать данные по частям.
В примерах у меня есть такой пример использования:
Код:
connection.send(F("Hi from ESP8266pro, my friend!"));
Про функцию F(..) можете погуглить, это стандартный функционал Arduino. Суть тут в том что в этом случае мы почти не задействуем RAM а шлем данные прямо из кода программы.

3. В крайнем случае размер буфера в моей библиотеке тоже можно уменьшить (но это лучше делать только если другие оптимизации не помогли, т.к. потом могут быть проблемы с приемом)
 

Jon

Member
Скетч для отправки данных на Народный Монитор на основе обертки от автора anakod https://github.com/anakod/ESP8266pro .
Прошивка ESP АТ21 http://esp8266.ru/download/esp8266-firmware/AT21SDK95-2015-01-24.bin
К Ардуине можно подключить:
- датчик атмосферного давления BMP085,
- датчик влажности DHT22/DHT11,
плюс кучу термодатчиков DS18B20.
Библиотеки к датчикам стандартные, скачиваются с основного сайта Ардуины.

Полный текст скетча не поместился в сообщение, поэтому подцепил в виде отдельного текстового файла.
 

Вложения

Последнее редактирование:

Jon

Member
Проблема периодической отправки данных на сервер, так и не решилась.
После старта первая посылка четко уходит и ответ ОК. Следующая отправка уходит, но до сервера уже не доходит и программа ничего не пишет.
Перепробовал по моему уже все.
Размер буферов менял.
Прошивку 20 ставил. Кстати в ней скорость нельзя изменить, только 115200.
На скорости 115200 даже первая посылка не проходит.
Вообщем что-то не так в этой команде: con.send() . Какая-то она одноразовая. Видимо что-то надо перед отправкой чистить.
 

anakod

Moderator
Команда форума
У меня в тестах запросы уходили не по одному разу (хотя сбои время от времени тоже проскакивают но работа всегда продолжается), поэтому проблема не в send() .
Так и не услышал какой размер буфера установлен? ESP подключен к SoftwareSerial или Hardware?
 

anakod

Moderator
Команда форума
А еще всегда есть возможность сделать ESP.reset() если очень хочется :)
 

Jon

Member
#define _SERIAL_BUFFER_SIZE 256;
ESP подключен к хардпорту. Скорость 9600
В главном цикле воткнуть ESP.reset() ? , а потом wifi.begin();

или как?
 

Jon

Member
я смотрю у Вас есть хорошая функция wifi.stationMAC(), только она возвращает МАК с разделителями ":" .
А как слитно адрес можно получить? Я в СИ вообще ни бум-бум.
 

anakod

Moderator
Команда форума
Да, reset можно попробовать в любом месте до или после и иногда даже вовремя работы :)
Можно обратно уменьшить второй буфер который не подсоединен к ESP (если увеличивали), может быть памяти не хватает, ее довольно мало в запасе остается.
Еще, как я уже говорил, можно писать не:
connection.send("check");
а
connection.send(F("check"));

Это тоже сильно экономит память. На 2Кб сильно не разгуляешься, однако :(
 

Jon

Member
Функция con.send(F(bufer)) не катит. Компилятор ругается на не детирминированный размер буфера.
 

anakod

Moderator
Команда форума
Эта функция только для статических строк, так можно отдавать ту часть запроса что не меняется. Остальную придётся отправлять обычным методом.
 

Jon

Member
Вопрос по циклической передачи данных снят!
Не знаю в чем причина, но одновременно два порта (программный и аппаратный) в цикле не живут.
Оставил в программе только аппаратный порт и все стало стабильно работать.
Спасибо еще раз автору за предоставленную обертку для АТ-команд.
 
Сверху Снизу