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