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

Вопрос ESP8266+DHT22+DS3231+Blynk - устройство зависает сразу после включения.

Cadil

New member
Устройство ESP8266+DHT22+DS3231+Blynk устойчиво работает, если исключить одно из двух: Blynk или часы реального времени DS3231, а в целом - зависает сразу же после включения.
Эта проблема обсуждалась на форуме тут, но, к сожалению, там был был сделан только общий вывод:
функциями управления реального времени и функциями связи с потенциальным таймаутом/отображения должны заниматься разные устройства (контроллеры).

На форуме BLynk нашел решение проблемы разделения функций между двумя контроллерами - тут и решение в чистом виде - здесь. Цитирую (под спойлером):
Я использую эту процедуру запуска и повторного соединения с моей компиляцией Mega / ESP-01 ... кажется, работает нормально.

В предварительной настройке

#include <ESP8266_Lib.h> // ESP-01 Link
#include <BlynkSimpleShieldEsp8266.h> // ESP-01 Link

В моем void setup()

wifi.setDHCP(1, 1, 1); //Enable dhcp in station mode and save in flash of esp8266
Blynk.config(wifi, auth, server, port);
if (Blynk.connectWiFi(ssid, pass)) {
Blynk.connect();
}

В void loop()

void loop() {
timer.run();

if (Blynk.connected()) { // If connected run as normal
Blynk.run();
} else if (ReCnctFlag == 0) { // If NOT connected and not already tring to reconnect, set timer to try to reconnect in 30 seconds
ReCnctFlag = 1; // Set reconnection Flag
Serial.println("Starting reconnection timer in 30 seconds...");
timer.setTimeout(30000L, []() { // Lambda Reconnection Timer Function
ReCnctFlag = 0; // Reset reconnection Flag
ReCnctCount++; // Increment reconnection Counter
Serial.print("Attempting reconnection #");
Serial.println(ReCnctCount);
wifi.setDHCP(1, 1, 1); //Enable dhcp in station mode and save in flash of esp8266
Blynk.config(wifi, auth, server, port);
Blynk.connect(); // Try to reconnect to the server
if (Blynk.connectWiFi(ssid, pass)) {
Blynk.connect();
}
}); // END Timer Function
}
}

У автора два контроллера - Mega и ESP.

Возможно есть другие варианты решения этой проблемы, кроме как разделения функций между двумя контроллерами?

Буду благодарен за пример работающего скетча где присутствуют ESP8266, DS3231 и Blynk.
 
Последнее редактирование:

Cadil

New member
Не согласен, что надо два.
Можно все сделать на одном ESP, но не на дурине, а на си.
Спасибо! Согласитесь - осваивать С++ ради решения одной проблемы вряд ли разумно. Я читал ваше предложение в аналогичной теме на этом форуме. Искал нечто похожее для Arduino IDE, но ничего на глаза не попалось.
 

enjoynering

Well-known member
попробуйте для начала поменять кривой драйвер I2C на этот - enjoyneering/ESP8266-I2C-Driver .
делается просто - тупо заменяете файлы в папках и компилируете проект заново.
 

Cadil

New member
попробуйте для начала поменять кривой драйвер I2C на этот - enjoyneering/ESP8266-I2C-Driver .
делается просто - тупо заменяете файлы в папках и компилируете проект заново.
Использование Ваших библиотек привело к значительному прогрессу, но проблема в целом пока не решена.

По порядку:
Скетч для ESP8266+DHT22+DS3231+Blynk работает, если в часы загружается стартовая информация (дата, время) программно функцией RtcDateTime(18, 07, 26, 16, 49, 0) в setup'e. Со старыми библиотеками эта схема не работала.

В случае, если часы через Wi-Fi подключаются к серверу точного времени для синхронизации, то максимум чего удалось добиться - получение точного времени с сервера, соединения с Blynk - нет. Если поменять порядок - сначала Blynk, а потом синхронизацию часов, то можно ждать вечность для подключения к точке доступа.
Код:
void setup()
{ Serial.begin(115200);
  display.begin();
//Blynk.begin("b0bf3e0d02f648c6b7aff070хххххх", "Best", "vххххх1", "blynk-cloud.com", 8442);
  drawBoot();
  synchronClock();
  FaceClock();
  Blynk.begin("b0bf3e0d02f648c6b7aff070хххххх", "Best", "vххххх1", "blynk-cloud.com", 8442);
}
Похоже, все снова сводится к двум контроллерам ...
 

enjoynering

Well-known member
что за билиотеку для DS3231 вы используете?
почему вы используете D4 и D6 вместо GPIO4/D2 и GPIO5/D1? переведите экран на D4 и D6
 

Cadil

New member
что за билиотеку для DS3231 вы используете?
почему вы используете D4 и D6 вместо GPIO4/D2 и GPIO5/D1? переведите экран на D4 и D6
Занимаясь проблемой отображения времени, пробовал версии библиотек разных авторов. При этом забыл заархивировать начальную конфигурацию библиотек, которая хоть как-то дышала.
В результате пришел к печальному результату - не компилируется простейший скетч в несколько строк, без библиотек.
Скетч под спойлером.
Код:
void setup()
{  // Инициализируем (запускаем) класс Serial вызывая его метод begin и указывая скорость 9600 бод в секунду.
  Serial.begin(9600); }
void loop()
{  // Отправляем «Hello, World! ».
  Serial.println("Hello, World! ");
  // Отправляем «OK, World!» с переносом строки
  Serial.println("Hi!");
  // Ждём одну секунду.
  delay(1000); }
Сообщение об ошибке:
C:\Users\VB\AppData\Local\Temp\arduino_build_657288/arduino.ar(umm_malloc.c.o): In function `umm_info':

C:\Users\VB\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0-rc2\cores\esp8266\umm_malloc/umm_malloc.c:997: undefined reference to `printf'

C:\Users\VB\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0-rc2\cores\esp8266\umm_malloc/umm_malloc.c:999: undefined reference to `printf'

C:\Users\VB\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0-rc2\cores\esp8266\umm_malloc/umm_malloc.c:1032: undefined reference to `printf'

C:\Users\VB\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0-rc2\cores\esp8266\umm_malloc/umm_malloc.c:1054: undefined reference to `printf'

C:\Users\VB\AppData\Local\Temp\arduino_build_657288/arduino.ar(umm_malloc.c.o):C:\Users\VB\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0-rc2\cores\esp8266\umm_malloc/umm_malloc.c:1080: more undefined references to `printf' follow

C:\Users\VB\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0-rc2/tools/sdk/lib\liblwip_gcc.a(ip_addr.o): In function `ip4_addr_netmask_valid':

core/ipv4/ip_addr.c:110: undefined reference to `isxdigit'

C:\Users\VB\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0-rc2/tools/sdk/lib\liblwip_gcc.a(ip_addr.o): In function `ipaddr_aton':

core/ipv4/ip_addr.c:190: undefined reference to `isxdigit'

collect2.exe: error: ld returned 1 exit status

exit status 1
Ошибка компиляции для платы NodeMCU 1.0 (ESP-12E Module).
Переустановил Arduino IDE - не помогло. Больше ничего не приходит в голову.
Что можно предпринять в этом случае? Как уйти от неопределенной ссылки (undefined reference to)?
 

enjoynering

Well-known member
фреймвок для esp8266 под ардуино находится тут (скопируйте текст после "-" в проводник и нажмите inter) - %USERPROFILE%\AppData\Local\Arduino15\packages\
- закройте arduino ide и удалите папку esp8266 с древним 2.3.0-rc2 фреймворком
- откройте arduino ide и поставьте свежий 2.4.2 через менеджер
- потом замените файлы i2c:
Copy and replace "twi.h", "core_esp8266_si2c.c" in folder %USERPROFILE%\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\cores\esp8266
Copy and replace "Wire.h", "Wire.cpp" in folder %USERPROFILE%\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.4.2\libraries\Wire

все.

и больше не лазьте туда где вы не разбираетесь. и да nikolz прав.
 
Последнее редактирование:

Cadil

New member
- закройте arduino ide и удалите папку esp8266 с древним 2.3.0-rc2 фремвоком
- откройте arduino ide и поставьте свежий 2.4.2 через менеджер
- потом замените файлы i2c:
Выполнил Вашу инструкцию, кроме того, переместил часы на D1 и D2, а экран на D4, D6. Скетч заработал. Более того, скетч работает при добавлении Blynk'a. Проблема решена!
Искренне благодарю за помощь. Успехов!

И еще один вопрос не по теме. При подключении к модулю nodemcu cp2102 часов и цв. экрана свободными остаются два цифровых пина модуля D3 и D8. На D8 я подключил датчик DHT22. Схема работает, если при подаче питания цепь модуль - датчик (ESP8266 - DHT22) разорвать, а позже восстановить. Если цепь при подаче питания цепь не разорвана - схема не работает. Что думаете?
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
На D8 я подключил датчик DHT22. Схема работает, если при подаче питания цепь модуль - датчик (ESP8266 - DHT22) разорвать. Если цепь при подаче питания цепь не разорвана - схема не работает. Что думаете?
Думаю вам надо начать с самых азов. Прочтите документацию по подключению чипа. D8 - это gpio15. Ваша схема работает, не работает программа. И не должна.
 
Последнее редактирование:

Cadil

New member
вот вам схемы подключения ESP8266 - F12
- минимальная
- полный фарш
GPIO15 я использовал не от незнания азов, а через дефицит цифровых выводов в схеме.

Сначала пробовал освободить один пин под датчик, подключив пин RESET экрана к 3,3в - об этом пишут в нете. Проверил 2 варианта. Ни в одном из протестированных вариантов экран у меня не заработал.

Идею с задержкой сигнала с датчика при включении питания довел до логического конца. Вначале при подаче питания пин GPIO15 ключом подтягивается к "земле", а через несколько секунд после включения питания на GPIO15 подается сигнал с DHT22. Схема ESP8266+DHT22+DS3231+ OLED_TFT работает!
 
Последнее редактирование:

Cadil

New member
да и не используйте DHT22. он ужасен по точности после 50% RH. берите HTU21D, Si7021 или SHT21
Спасибо! Я в этом убедился.
В дальнейшем планирую использовать BME280, чтобы более эффективно использовать площадь экрана да и информация о давлении, думаю, не помешает. Сейчас работаю с тем, что есть под рукой.
 
Сверху Снизу