Mega + esp8266

Здравствуйте.

Имеется плата Robotdyn mega + esp8266. Esp получает точное время из интернета и передает по последовательному порту на ардуино. Все работает. Но как только перезагружаешь ESP , то ардуино получает абракадабру. Перезагрузку делаю замыкая RST и GND. При этом после такой перезагрузки если на монитор выводить данные с ESP все нормально. А при передаче в ардуино ерунда какая-то. delay() после перезагрузки ESP не помогает. Если ставить serial.end и serial.begin , то вообще никакие данные ардуино не получает.

вангую…
скорость 9600
а есп при перезагрузке шлет отладочную инфу на другой скорости.

а вы эту абракадабру пропускайте и ждите нормальных сообщений

куда ставить?

Покажите код обоих контроллеров

Если бы Вы сделали два простейших скетча:

  1. а ESP просто передаёт слово КАКА раз в пять секунд, а раз минуту перегружается и всё - ничего лишнего;
  2. На меге - просто печатает что пришло из сериала по мере поступления.

Убедились бы, что проблема существует на этих скетчах и выложили бы их сюда, Ваша проблема бы решилась в несколько минут.

Если скетчей не будет, здесь будет обсуждение на пару сотен постов, результатом которого с большой вероятностью станет:
а) срач
и б) отсутствие приемлемого решения проблемы

Думайте, что Вам делать.

Это правильное решение. Именно так и надо делать. Только надо “ставить” “куда надо” и “как надо”. Как и куда Вы ставите, ХЗ - скетч же у Вас секретный.

asss

#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <SimplePortal.h>
#include <LittleFS.h> 

#define WIFI_CREDENTIALS_FILE "/wifi_credentials.txt"     // Определение имени файла для хранения учетных данных Wi-Fi 

  // Данные сети к которой подключаемся для отладки
  //const char *ssid = "Aliter-Axi";                       // Рабочий
  //const char *password = "33nriw197b";                   // Рабочий
  String ssid = "";                                        // Переменная для имени сети
  String password = "";                                    // Переменная для пароля сети
  int itiming = 0;                                         // Счетчик количесива попыток подключения
  int ierror = 404;                                          // флажок ошибки
  // Переменные времени
 int tHour;  
 int tMinute;  
 int tSecond;  
 int weekDay;
 int monthDay;
 int currentMonth;
 int currentYear;
 int flagok = 99;
  
   // Определение сервера для получения точного времени
   WiFiUDP ntpUDP;
   NTPClient timeClient(ntpUDP, "pool.ntp.org");

void setup() {
  Serial.begin(115200);   
 // Serial.println(" "); 
  // Инициализация LittleFS 
   LittleFS.begin();                                          //функция, которая инициализирует файловую систему LittleFS 
   
   inetconnect();     
   if (WiFi.status() != WL_CONNECTED)
   {Serial.println("77");
   delay(3000);
   interpass();
   itiming = 0;
   inetconnect(); }

   if (WiFi.status() != WL_CONNECTED)
   {Serial.println(88);
   delay(3000); }
   else {
   inettime();
        }

      if (currentYear == 1970)
      { inetconnect();
        inettime();
      } 
      
  //Print complete date:

 String currentDate = String(flagok) + ":" + String(tMinute) + ":" + String(tHour) + ":" + String(monthDay) + ":" + String(currentMonth) + ":" + String(currentYear) + ":" + String(weekDay) ;
 Serial.println("");
 Serial.println(currentDate);
      
   delay (3000);
   ESP.deepSleep(0); 
             }

// Функция подключения к интернету
void inetconnect()
{
  readWiFiCredentials(ssid, password);    // Чтение учетных данных Wi-Fi из LittleFS 
  ssid.trim();                            // Обрезаем от строки имени символ конец строки и возврат каретки
  password.trim();                        // Обрезаем от строки имени символ конец строки и возврат каретки
 // Serial.println(ssid);                   // Вывод имени сети (для отладки)
//  Serial.println(password);               // Вывод пароля сети (для отладки)
  WiFi.disconnect();
  WiFi.persistent(false);
  WiFi.begin(ssid,password);
   while (itiming < 60 &&  WiFi.status() != WL_CONNECTED) // 60 попыток подключения ~ 30 секунд
  {  itiming++;
    delay(500);
 //   Serial.print(".");                     // Процесс подключения к сети (для отладки)
 //    Serial.print(itiming);                 // Процесс подключения к сети (для отладки)
  }
}

// Функция ввода данных WiFi сети (имя, пароль) через web страницу
void interpass()
{
  delay(3000);
   portalRun(120000);                             // запустить с таймаутом 60с portalRun(30000);  запустить с кастомным таймаутом
  // Serial.println(portalStatus());          // статус: 0 error, 1 connect, 2 ap, 3 local, 4 exit, 5 timeout. Для отладки
   ssid = portalCfg.SSID;                   // Получаем данные сети с веб страницы 
   password = portalCfg.pass;                
   writeWiFiCredentials(ssid,password);
}

// Функция получения точного времени из интернета
void inettime()
{
 timeClient.begin();                              // Инициализация NTPClient для получения времени
 // GMT +3 = 10800
 // GMT 0 = 0
 timeClient.setTimeOffset(10800);                  // Время по Москве
 
 // Получение времени и его вывод в виде строки String. Секунды получаем но не выводим

 timeClient.update();                              // Получение данных времени
 time_t epochTime = timeClient.getEpochTime();
 String formattedTime = timeClient.getFormattedTime();    //возвращает время в формате HH:MM:SS
  tHour = timeClient.getHours();
  tMinute = timeClient.getMinutes();
  tSecond = timeClient.getSeconds();
  weekDay = timeClient.getDay();

 //Get a time structure
 struct tm *ptm = gmtime ((time_t *)&epochTime);   //создание структуры времени на основе значения epochTime, которое возвращает функция getEpochTime(). 
                                                   // Она возвращает количество секунд, прошедших с 1 января 1970 года (полночь GMT). 
  monthDay = ptm->tm_mday;
  currentMonth = ptm->tm_mon+1;
  currentYear = ptm->tm_year+1900;
}

 // Функция для записи учетных данных Wi-Fi в LittleFS 
 void writeWiFiCredentials(String ssid, String password) { 
  // Открытие файла для записи 
  File file = LittleFS.open(WIFI_CREDENTIALS_FILE, "w"); 
  if (!file) { 
    Serial.println("Не удалось открыть файл для записи"); 
    return; 
  } 
  // Запись SSID и пароля в файл 
  file.println(ssid); 
  file.println(password); 

  // Закрытие файла 
  file.close(); 
}

// Функция для чтения учетных данных Wi-Fi из LittleFS 
void readWiFiCredentials(String& ssid, String& password) { 
  // Открытие файла для чтения 
  File file = LittleFS.open(WIFI_CREDENTIALS_FILE, "r"); 
  if (!file) { 
    Serial.println("Не удалось открыть файл для чтения"); 
    return; 
  } 
  // Чтение SSID и пароля из файла 
  ssid = file.readStringUntil('\n'); 
  password = file.readStringUntil('\n'); 

  // Закрытие файла 
  file.close(); 
} 

void loop() {}



/ Функция получения данных от ESP8266
void itime()
 {
wificonn ();
//Serial3.println("AT+RST"); // Отправка команды перезагрузки
    resetESP8266(); 
    delay (3000); 
                                                  // Для отладки и вывода на монитор
  Serial3.end();    
  Serial3.begin(115200);   
  //Serial.setTimeout(15000);
 // delay (3000);
 // while (Serial3.available()) {Serial3.read();}
  //  if ( Serial3.peek() < 32 || Serial3.peek() > 126 ) {Serial3.read(); return;}
//resetESP8266();
while ( status != 99 && stcount != 50 )    
    {

    // Условия устраният зависания при включении когда количесво попыток начинает превышать заданное  
    if (status == 6) 
      { 
      wifistatus1 (); 
      st1++;
      if (st1 == 80) status = 99;
      }

    if (status == 77) {wifistatus2 (); st2++; }
    if (status == 88) {wifistatus3 (); st3++; delay (5000);}
    delay (1000);
    inputString = ""; 
    Serial.println(status);                                                        // Для отладки
  
    while (Serial3.available()) 
                    { 
                      c = Serial3.read();                                             // Посимвольно читаем порт Serial3
                      inputString += c;                                               // Заносим полученные данные в строку
                      Serial.println(inputString);   
                      if (c == '\n') espdata = inputString.c_str();                    // Если дошли до конца строки
                     }  
  ee = strtok(espdata,":");                                                            //Разделяет строку на токены на основе разделителя ":". Токен — это подстрока, разделённая разделителями, которые могут быть любым символом или набором символов. 
  countitime = 0;
  while (ee!= NULL) {
                     datatime[countitime] = atoi(ee);
                     status = datatime[0];
                     min =    datatime[1];
                     hou =    datatime[2];
                     den =    datatime[3];
                     mon =    datatime[4];
                     year =   datatime[5];
                     week =   datatime[6];
                     ee   =   strtok(NULL,":");
                     countitime ++;
                     Serial.println(status);
                     }
     stcount++;
     Serial.println(stcount);   
     break;
     }

  if (year == 0 || year == 1970)
      {
       Serial.println("Данные не получены");                          // Для отладки
      errordata = 1;
      }
     else 
      { 
     Serial.println("Данные  получены");                              // Для отладки
     errordata = 0;
     year=year-2000;                                                    // Получение двузначного значения года
     time.settime(-1 ,min, hou, den, mon, year, week); 
      }
       Serial.println(year);    
       Serial.println(mon);                                       // Для отладки
   return;
 }
//******************************************************************************************************************************

// Функция сброса/перезагрузки ESP
void resetESP8266() {
digitalWrite(ESP_RST_PIN, HIGH);
delay(500);
digitalWrite(ESP_RST_PIN, LOW);
delay(5000);                                                        // Даем время на загрузку ESP8266
}
//******************************************************************************************************************************

Простите, Вы читать умеете? Вам же сказали, подготовьте скетчи для демонстрации проблемы, а не выкатывайте сюда сотни строк Вашего творчества. Вот нахера мне нужна Ваша функция inetconnect, если у Вас проблема с сериалом? Чтобы мозг засрать?

Делайте, как Вам сказали:

эта функция и получает данные от ESP. Если перезагрузку ESP не делать то все прекрасно работает. А с перезагрузкой ерунда какая то

Какая? Я говорю про Ваш первый скетч (ESP-шный). Нафига там какие-то коннекты, пароли, файлы, нафига всё это? Сделайте просто передачу фиксированного слова – скетч займёт пять строк, а не 150 как у Вас.

А второй скетч. Нафига там wi-fi, нафига разбор даты и времени. Просто печатайте то, что придёт и иногда перезагружайте ESP.

Сделайте ПРОСТЫЕ скетчи в которых есть проблема, и нет ничего лишнего!

Привыкайте ВСЕГДА так делать. В половине случаев на простом скетче Вы сами увидите проблему и сами решите её. А в другой половине – на форме без напряга помогут. В длинных же портянках, в которых намешано всё вместе, никто разбираться не будет.

пин GPIO15 куда подключен на есп?

пин GPIO15 куда подключен на есп?

никуда не подключен. От ESP задействован только RST и GND.

притяни его на землю (-), через резистор 4-10 кОм.

притяни его на землю (-), через резистор 4-10 кОм.

Что это даст?

«Меньше слов, больше дела!»

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

попробую обязательно.

Сергей, такие вопросы приведут вас к тому, что вам вообще помогать перестанут

И да, не надо писать мне в личку. Задавайте вопросы в ветке, если я смогу - отвечу. А писать личные сообщения - это очень навязчиво.

Я понял. Просто хотел чтобы вы увидели.