ESP, IoT зависание arduino при обмене данных с esp

vivatgm

✩✩✩✩✩✩✩
26 Янв 2021
23
0
Здрав будь бояре! чело разбил о земь непонимания. есть ардуино, к которой прикручен по i2c bme280 и по прерыванию датчик холла который считает скорость ветра. esp питается от шилда на которой отдельный вывод 3.3В (свой ams 1117 3.3). как схемы рисовать на форуме не знаю, чтобы понятно выложить всю схему подключения. сообщения между дунькой и есп перекресное через Rx Tx (Txардуино к Rx есп) на участке Rx есп -> TX ардуино установлены резисторы по принципу: Rx esp -> 1K -> Tx arduinu а так же от туда же 2K и на общую землю. вообщем схема из инета, легко гуглится.
со стороны есп код:
участок парсинга на esp:
void Bot_EchoMessages() {
  for (int i = 1; i < bot.message[0][0].toInt() + 1; i++)      {
    if (bot.message[i][4]=="##########") {
      Otvet="Запросов: " + String (EEPROM.read(0)) +" "+ parsing();
      bot.sendMessage(bot.message[i][4], Otvet, "");
      }
      else {bot.sendMessage(bot.message[i][4], parsing(), "");}
              
    if (bot.message[i][5] == "start") {
      String wellcome = "Добро пожаловать к боту моей метеостанции";
      bot.sendMessage(bot.message[i][4], wellcome, "");
      Start = true;
    }
    zapros++;
    EEPROM.write(0, zapros);
    EEPROM.commit();
  }
  bot.message[0][0] = "";   // All messages have been replied - reset new messages
}
String parsing() {
  String atvet="";
  char d='1';
 Serial.write(d);
 delay(30);
  while (Serial.available() > 0) {
    char incomingByte = Serial.read();      // обязательно ЧИТАЕМ входящий символ
    if (incomingByte == '$') {              // если это $
      getStarted = true;                    // поднимаем флаг, что можно парсить
    } else if (incomingByte != ';' && getStarted) { // пока это не ;
      // в общем происходит всякая магия, парсинг осуществляется функцией strtok_r
      inputData[inde] = incomingByte;
      inde++;
      inputData[inde] = NULL;
    } else {
      if (getStarted) {
        char *p = inputData;
        char *str;
        inde = 0;
        String value = "";
        while ((str = strtok_r(p, " ", & p)) != NULL) {
          string_convert = str;
          intData[inde] = string_convert.toInt();
          inde++;
        }
        inde = 0;
      }
    }
    if (incomingByte == ';') {        // если таки приняли ; - конец парсинга
      getStarted = false;
      recievedFlag = true;
      atvet="\xF0\x9F\x8C\xA1\xEF\xB8\x8F " + String (float (intData[0])/10, 1) + "\xE2\x84\x83  \xF0\x9F\x92\xA7 " + String (intData[1]) + "% Давление: " +  String (intData[2]) + "mmHg напряжение:  " + String (float (intData[3]/10), 1)+ " Скорость ветра: "+ String (float (intData[4]/10))+ "м/с" ;
      return atvet;
    }
  }
}
#########- это я свой идентификатор затер

со стороны ардуино
C++:
void loop() {
  ok.tick();
  if (ok.isHolded()) {        //вход в меню при удержании кнопки ок
    menu();
  }
  skorvetr();
  printTime();                //вывод инфы на дисплей
  provBudil();                //проверка исполнения таймеров
  saveAccum();                //проверка сохранения жизни аккумулятора панели и переключение при низком заряде на сеть 220В
  peredacha ();               //отправка данных на esp
}
void peredacha () {                                               //передача данных в ESP8266
  if (Serial.available() > 0) {
    char incomingByte = Serial.read();
    String dacha="$" + String(int (bme.readTemperature()*10)) + " " +  String(int (bme.readHumidity())) + " " + String(int(pressureToMmHg((bme.readPressure())))) + " " + String(int(analogRead(1) / 4.092)) + " " + String(int(speed*10))+";";
    Serial.print(dacha);
    }
}
смысл всего это передавать сведения с датчиков на запрос в телеграмм там будет прикручены далее и доп функции но это не об этом сейчас.
код телеграмм бота взят с просторов инета, парсинг со страниц уроков по парсингу на сайте гайвера.
Клиника: после включения питания на ардуино очень активно начинает мигать передача данных, если подключить все это и открыть монитор порта, то можно увидеть что данные с ардуино льются непрерывным потоком, при этом есп должна запрашивать данные только если есть новое сообщение. и через 3-15 сек ардуино зависает. есп продолжает отвечать в телеге с теми же данными (я так понимаю теми что накидала ардуино в буфер до того как зависла) а потом пустыми сообщениями (данные перестали после зависания ардуино поступать)
по всей видимости ардуино и виснет от того что бесконечно льет данные а тут еще и прерывания. мне не понятно почему она так делает ведь должна отправить 1 пакет по запросу
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
ESP при старте сыпет в Serial отладочную инфу. Возможно на неё и реагирует ардуинка, посылая ответ на каждый байт отладочный инфы.