• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Arduino Unu vs ESP8288 не могут найти взаимопонимание

Vitaliy

New member
Написал простенький скетч для ардуины, дабы получить заветное "ОК" от ESP8266. Пока безуспешно. После получения ESP-модуля (стандартная прошивка 0.18) под управлением ардуины удавалось даже приконнектиться к HTTP-серверу и отправить ему post-запрос. При этом тогда ардуина (Uno) общалась с ESP через SoftwareSerial на скорости 9600. Обновил прошивку до AT21SDK95-2015-01-24 версии. Пробовал поиграться с командами через ESPlorer через RS232 to USB - все работает ок. В ESPlorer выставил скорость 115200. Пробую на такой же скорости через ардуину получить "ОК", послав "AT". В ответ иероглифы. На ардуине перепробовал скорости в диапазоне с 9600 до 115200. Ничего не помогает. Синий светодиод на ESP подмигивает. Какой-то ответ от ESP есть. Вот только пока ардуина и ESP общий язык найти пока не могут.

#include <SoftwareSerial.h>

SoftwareSerial esp8266Serial = SoftwareSerial(10, 11);

void setup(void)
{
Serial.begin(115200);
esp8266Serial.begin(115200); // Здесь пробовал разные скорости
}

void loop(void)
{
while (esp8266Serial.available() > 0)
{
String s = esp8266Serial.readString();
Serial.println(s);
}

Serial.println("AT");
esp8266Serial.println("AT");
delay(1000);
}

Что я делаю не так?
 

Vitaliy

New member
Как оказалось SoftwareSerial не умеет корректно работать на скорости 115200. Переключил на ESP режим последовательного порта на работу на скорости 9600 и все заработало.
 

Vitaliy

New member
Да, я именно её и прочитал. Только как-то абзац про скорость 115200 проглядел или не запомнил. Теперь другая проблема, у Ардуино как оказалось не так много памяти. Вложенность функций 4 уровня - видимо вызывает переполнение стека. Понятное дело смотря каких функций, но пару десятков конкатенаций строк внутри функции + сохранение стека состояний вызовов мне хватило, чтобы попасться на удочку). Был бы очень рад услышать каким образом пишут под ардуино HTTP-клиенты.
 

Victor

Administrator
Команда форума
каким образом пишут под ардуино HTTP-клиенты
это лучше у ардуинщиков спросить, но экономия оперативки возникает, если строковые константы поместить во флеш. Поищите описание функции F() и объявление PROGMEM
 

JustACat

Moderator
Команда форума
Vitaliy, все строки поголовно во флеш, F() вам поможет ( Serial.print(F(“Hello World”)) ), хотя можно и с PROGMEM заморочиться.
Отдавайте текст прямо из флеш, не используйте String.
Главное, не просто применить и все, а проверить, что реально происходит с RAM.
Код:
extern int __bss_end;
extern void *__brkval;
int memoryFree()
{
   int freeValue;
   if((int)__brkval == 0)
      freeValue = ((int)&freeValue) - ((int)&__bss_end);
   else
      freeValue = ((int)&freeValue) - ((int)__brkval);
   return freeValue;
}
memoryFree - позволяет хоть как-то определить доступность рамки...

Потом это все дело (отправку строк) отделить от остальной работы. Нужно избавиться как раз от того, о чем вы пишете - от вложенности функций. Разложить программу из древовидной структуры в плоскую, последовательную.
Стройте работу либо на RTOS, либо на конечном автомате. Про конечные автоматы можно почитать, например, у DI HALT'а http://easyelectronics.ru/avr-uchebnyj-kurs-konechnyj-avtomat.html да и еще много где.
 
Сверху Снизу