• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 да и еще много где.
 
Сверху Снизу