Имеется плата Robotdyn mega + esp8266. Esp получает точное время из интернета и передает по последовательному порту на ардуино. Все работает. Но как только перезагружаешь ESP , то ардуино получает абракадабру. Перезагрузку делаю замыкая RST и GND. При этом после такой перезагрузки если на монитор выводить данные с ESP все нормально. А при передаче в ардуино ерунда какая-то. delay() после перезагрузки ESP не помогает. Если ставить serial.end и serial.begin , то вообще никакие данные ардуино не получает.
а ESP просто передаёт слово КАКА раз в пять секунд, а раз минуту перегружается и всё - ничего лишнего;
На меге - просто печатает что пришло из сериала по мере поступления.
Убедились бы, что проблема существует на этих скетчах и выложили бы их сюда, Ваша проблема бы решилась в несколько минут.
Если скетчей не будет, здесь будет обсуждение на пару сотен постов, результатом которого с большой вероятностью станет:
а) срач
и б) отсутствие приемлемого решения проблемы
Думайте, что Вам делать.
Это правильное решение. Именно так и надо делать. Только надо “ставить” “куда надо” и “как надо”. Как и куда Вы ставите, ХЗ - скетч же у Вас секретный.
#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;
}
//******************************************************************************************************************************
Простите, Вы читать умеете? Вам же сказали, подготовьте скетчи для демонстрации проблемы, а не выкатывайте сюда сотни строк Вашего творчества. Вот нахера мне нужна Ваша функция inetconnect, если у Вас проблема с сериалом? Чтобы мозг засрать?
Какая? Я говорю про Ваш первый скетч (ESP-шный). Нафига там какие-то коннекты, пароли, файлы, нафига всё это? Сделайте просто передачу фиксированного слова – скетч займёт пять строк, а не 150 как у Вас.
А второй скетч. Нафига там wi-fi, нафига разбор даты и времени. Просто печатайте то, что придёт и иногда перезагружайте ESP.
Сделайте ПРОСТЫЕ скетчи в которых есть проблема, и нет ничего лишнего!
Привыкайте ВСЕГДА так делать. В половине случаев на простом скетче Вы сами увидите проблему и сами решите её. А в другой половине – на форме без напряга помогут. В длинных же портянках, в которых намешано всё вместе, никто разбираться не будет.
говорят отключает отладочную информацию, которая прет в порт после перезагрузки, на скорости инной что у тебя в меге настроена.
отсюда после перезагрузки ты видишь крякообразы.
но это не точно)))