Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Раздел для начинающих", создана пользователем Cadil, 25 июл 2018.

Метки:
  1. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Устройство 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.
     
    Последнее редактирование: 12 сен 2018
  2. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Спасибо! Согласитесь - осваивать С++ ради решения одной проблемы вряд ли разумно. Я читал ваше предложение в аналогичной теме на этом форуме. Искал нечто похожее для Arduino IDE, но ничего на глаза не попалось.
     
  3. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    544
    Симпатии:
    51
    попробуйте для начала поменять кривой драйвер I2C на этот - enjoyneering/ESP8266-I2C-Driver .
    делается просто - тупо заменяете файлы в папках и компилируете проект заново.
     
    Cadil нравится это.
  4. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Использование Ваших библиотек привело к значительному прогрессу, но проблема в целом пока не решена.

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

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

    enjoynering Авторитетный участник сообщества

    Сообщения:
    544
    Симпатии:
    51
    код проекта в студию?
     
  6. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    544
    Симпатии:
    51
    что за билиотеку для DS3231 вы используете?
    почему вы используете D4 и D6 вместо GPIO4/D2 и GPIO5/D1? переведите экран на D4 и D6
     
  7. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Занимаясь проблемой отображения времени, пробовал версии библиотек разных авторов. При этом забыл заархивировать начальную конфигурацию библиотек, которая хоть как-то дышала.
    В результате пришел к печальному результату - не компилируется простейший скетч в несколько строк, без библиотек.
    Скетч под спойлером.
    Раскрыть Спойлер

    Код (C):
    1. void setup()
    2. {  // Инициализируем (запускаем) класс Serial вызывая его метод begin и указывая скорость 9600 бод в секунду.
    3.   Serial.begin(9600); }
    4. void loop()
    5. {  // Отправляем «Hello, World! ».
    6.   Serial.println("Hello, World! ");
    7.   // Отправляем «OK, World!» с переносом строки
    8.   Serial.println("Hi!");
    9.   // Ждём одну секунду.
    10.   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)?
     
  8. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    544
    Симпатии:
    51
    фреймвок для 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 прав.
     
    Последнее редактирование: 9 сен 2018
    Cadil нравится это.
  9. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Выполнил Вашу инструкцию, кроме того, переместил часы на D1 и D2, а экран на D4, D6. Скетч заработал. Более того, скетч работает при добавлении Blynk'a. Проблема решена!
    Искренне благодарю за помощь. Успехов!

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

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.148
    Симпатии:
    226
    Думаю вам надо начать с самых азов. Прочтите документацию по подключению чипа. D8 - это gpio15. Ваша схема работает, не работает программа. И не должна.
     
    Последнее редактирование: 9 сен 2018
  11. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    544
    Симпатии:
    51
    вот вам схемы подключения ESP8266 - F12
    - минимальная
    - полный фарш
     

    Вложения:

  12. enjoynering

    enjoynering Авторитетный участник сообщества

    Сообщения:
    544
    Симпатии:
    51
    да и не используйте DHT22. он ужасен по точности после 50% RH. берите HTU21D, Si7021 или SHT21

    библиотека тут - enjoyneering/HTU21D
     
  13. Cadil

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    GPIO15 я использовал не от незнания азов, а через дефицит цифровых выводов в схеме.

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

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

    Cadil Новичок

    Сообщения:
    156
    Симпатии:
    2
    Спасибо! Я в этом убедился.
    В дальнейшем планирую использовать BME280, чтобы более эффективно использовать площадь экрана да и информация о давлении, думаю, не помешает. Сейчас работаю с тем, что есть под рукой.
     

Поделиться этой страницей