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

Как правильно задавать пины ESP8266 NodeMCU в скече?

Не закидывайте тряпками. Вроде как я знаю, что надо номер GPIO писать. Ну, т.е. если мы пишем
Код:
#define DATA_PIN 4  //пин матрицы
это значит, что это GPIO4.
Но у меня какая-то хрень! Матрица (дисплей) у меня действительно висит на 4, но не на GPIO, а на D4. Все остальные пины задаются как положено цифрой от GPIO, но вот если я даю пин матрицы двойкой (D4 это GPIO2), то экран ничего не показывает. А вот если указываю 4, то работает. Меня тут смущает только одно, у SPI GPIO4 задействовано. И вроде всё прекрасно работало в течении 2 лет. Но сейчас при переключении реджима дисплея почему-то сбрасывается состояние датчика движения. И я уже весь мозг словал в чем дело.
Тут я переустановил винду и после установки поставил версию ESP8266 самую последнюю, но после перепрошивки начал безсистемно моргать светодиод 1,1 который. На буржуйских форумах я вычитал, что что бы жтого глюка у FastLed не было надо версию ESP ставить не старше 2.7.4. Установил и глюк с первым светодиодом пропал. Вот думаю может еще раньше версию поставить.
 

CodeNameHawk

Moderator
Команда форума
Вот думаю может еще раньше версию поставить.
Не стоит, 2.7.4 нормально работает.
Версии выше этой, как то работают менее стабильно, особенно если на неё есть достут с интернета.
Я назначаю выводы по номеру gpio.
Это позволяет избежать путаницы при выборе другой платы.
(Обозначения типа D5, на разных платах могут указывать на разные выводы есп)

Принял за правило, в самом скетче, указывать версию плат есп и версии библиотек, которые использую.
А то было, версию библиотеки поменял для другого скетча, а потом собираешься скетч, который ранее работал, а он не хочет работать.
 
Да, наверное это правильно. А то саму метеостанцию я делал уже больше 2 лет назад. Какие тогда версии были непонятно. Тут проблема такая: работала она эти 2 года и тут с месяц назад перестал срабатывать датчик движения. Точнее он срабатывает, что движения нет и тут же поступает сигнал о движении. А у меня при отсутствии движения дисплей переходит в другой режим. И этот же режим включается с 22 до 7 утра. Я на выход датчика движения светодиод прилепил и вот сейчас, после 22 часов вижу, что он вообще постоянно горит. Т.е. этот мой ночной режим и режим отсутствия движения каким-то образом дает 1 на выход датчика движения, а точнее на вход ESP. Вход датчика движения уже менял. Не помогает. Уже на код грешу, но я после 2-х лет не менял его. Разве что раньше у меня данные писались во внутреннюю память ESP, но она похоже вышла и з строя или количество циклов записи закончилось (перестало совсем в нее писать) и я поставил SD карту, ну и скетч под нее переписал чуть чуть. Но режимов вывода на экран и работы датчика движения это не затронуло. Вот и сижу кумекаю в чем дело.
 
А вот вопрос. Я немного покопался, вернул в работу RX и TX и посмотрел, что выдает Serial порт. Ну несколько незначительных (неважных) ошибок нашел, но самое главное, что после окончания Setup он у меня перегружается вот так:
Код:
Exception (28):
epc1=0x4000bf64 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00208cd1 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffc30 end: 3fffffc0 offset: 0190
3ffffdc0:  80000000 a5a50875 3955a5a5 00009700 
3ffffdd0:  00208cd1 4bc6a7f0 40100ab0 3ffffec0 
3ffffde0:  00000000 3fff2280 3ffefb38 40208b80 
3ffffdf0:  00000000 00000000 4bc6a7f0 00000000 
3ffffe00:  000097a7 0000012c 40100ab0 000097ad 
3ffffe10:  00000000 4c957f2d c90a0b0a 3ffffec0 
3ffffe20:  00001d40 00000000 4c957f2d 5851f42d 
3ffffe30:  00001d68 000003ad 3a353631 3a353631 
3ffffe40:  8a003538 71fd7963 00000000 40101470 
3ffffe50:  00000000 00000000 00000001 4010072c 
3ffffe60:  4022b8c8 00000000 3ffffea0 3ffffec0 
3ffffe70:  00000000 3fff2280 3ffffea0 40209034 
3ffffe80:  3fffdad0 00000000 00000000 4020e31b 
3ffffe90:  00000000 3fff0cf0 00000000 4020e473 
3ffffea0:  3fff374c 3fffff80 402010fc 4020902c 
3ffffeb0:  3fffdad0 00000000 3fff126c 4020998b 
3ffffec0:  3ffef3d0 3fff22fc 3fff3854 00000090 
3ffffed0:  00000001 00b8ffb7 4020e582 3fff22e8 
3ffffee0:  00000001 000927c0 3fff2310 40226118 
3ffffef0:  3fffff48 3fffff80 00000001 40234018 
3fffff00:  3ffe8ead 00000000 6e69000a 40228f8d 
3fffff10:  3ffe8ead 00000000 72610070 40228f8d 
3fffff20:  3ffe93e1 3fff1160 00000020 3fff12ac 
3fffff30:  40224cfc 3fff1160 3ffe8eab 40224d08 
3fffff40:  40224cfc 3fff1160 3ffe8eab 4020f1fd 
3fffff50:  3fff0cf0 00000016 3fff1160 40225268 
3fffff60:  3fff0cf0 3fff1160 3fff1160 402252dc 
3fffff70:  3fff0cf0 3fff1160 00000000 4020ac14 
3fffff80:  3fff374c 0016001f 4020116c 4020410c 
3fffff90:  3fff2500 000b000f 80efeffe 3fff12ac 
3fffffa0:  3fffdad0 00000000 3fff126c 4022754c 
3fffffb0:  feefeffe feefeffe 3ffe8a04 40100691 
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3584, room 16
tail 0
chksum 0xb0
csum 0xb0
v2843a5ac
~ld
Я порылся в инете и нашел расшифровку ets Jan 8 2013,rst cause:2, boot mode:(3,6). Так вот rst cause:2 - это External reset or wake-up from Deep-sleep.
Отсюда вопрос возник. У меня датчик движения висит на GPIO16, который и используется как контакт для вывода из глубокого сна. В своем другом устройстве на ESP8266 Wemos D1 & R2 mini я использую этот онтакт и для вывода из сна и для подключения датчика движения. Но там все работает, ESP не ресетится.
Еще вычитал, что
Код:
Exception (28): выдается когда бесконечный цикл. Ищу конечно, но говорю же, код два года работал. Правда SD карту внес в код. Может там чего???
 

CodeNameHawk

Moderator
Команда форума
Может там чего???
Ну так отключите для проверки, всего и делов-то.
ps. используйте
Код:
#define ispolzovat_SD

#ifdef ispolzovat_SD
//программа для работы со сд
.....

#endif
Чтобы отключить кусок кода достаточно закомментировать //#define ispolzovat_SD и по новой скомпилировать скетч.
 
С D0 вроде стало понятно, что дело не в нем. Если отрезать весь код, а оставить только работу с датчиком движения, все работает стабильно.
Я тут почита про расшифровку результатов ошибок. Нашел описание Exception decoder. Скачал, установил, расшифровал. Но хоть убей ничего не понимаю. И все строки касаются каких-то внутренних библиотек. Только одна что-то говорит о моем коде, но опять таки что, не понят:
Код:
Decoding 14 results
0x40101100: umm_assimilate_up at C:\Users\dimon\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\umm_malloc/umm_malloc.cpp line 227
0x40206e38: _ZZ5setupENKUlPvE_clES_$isra$178 at C:\Users\dimon\Documents\Arduino\MeteoClockV4_SD_/MeteoClockV4_SD_.ino line 107
0x40100aac: millis at C:\Users\dimon\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266/core_esp8266_wiring.cpp line 188
0x4010146c: malloc at C:\Users\dimon\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\umm_malloc/umm_malloc.cpp line 552
0x40100728: ets_post at C:\Users\dimon\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266/core_esp8266_main.cpp line 177
0x4021f578: precache at ?? line ?
0x402072ec: std::_Function_handler ::_M_invoke(std::_Any_data const&, void*) at c:\users\dimon\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2/functional line 2073
0x4020b353: TickerScheduler::handleTicker(std::function , void*, bool*) at C:\Users\dimon\Documents\Arduino\libraries\TickerScheduler/TickerScheduler.cpp line 36
0x4020b4ab: TickerScheduler::update() at c:\users\dimon\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2/functional line 2174
:  (inlined by) TickerScheduler::update() at C:\Users\dimon\Documents\Arduino\libraries\TickerScheduler/TickerScheduler.cpp line 112
0x402010fc: std::_Function_base::_Base_manager ::_M_manager(std::_Any_data&, std::_Function_base::_Base_manager  const&, std::_Manager_operation) at c:\users\dimon\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2/functional line 1931
0x402072e4: std::_Function_handler ::_M_invoke(std::_Any_data const&, void*) at c:\users\dimon\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2/functional line 2069
0x40205fcb: loop at C:\Users\dimon\Documents\Arduino\MeteoClockV4_SD_/MeteoClockV4_SD_.ino line 150
0x4021b674: loop_wrapper() at C:\Users\dimon\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266/core_esp8266_main.cpp line 197
0x4010068d: cont_wrapper at C:\Users\dimon\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266/cont.S line 81
Вторая строка ссылка на мой код. Но если как я сделал, отрезать весь код кроме датчика движения, то все работает. А эта строка дуле Setup.
 
Чего-то я завис. Я пошел по строчно смотреть из-за чего ресет происходит. И дошел вот до этих строк
Код:
      int Xi = dayFromXmass(cdayofmonth, cmonthnum, cyear) - dayFromXmass(daysInMonth(fmonth, fyear), fmonth, fyear);      
      if (Xi > mdst)
      {
        //st2 = "OK by date 15 " + fn; //To delete
        //String st3 = "OK by date 15 " + fn; //To delete
        //addToLog(st3); //To delete
        //frez = true;
        //st = "1";
      }
      else frez = false;
Это часть фуункции, которая перебирает файлы на флешке и выдает frez значение true если файл надо удалять. Щас пока там вообще файлов на удаление нет.
Так вот если все внутри IF закомментировано, то работает, не сбрасывается. Достаточно только раскомментировать st = "1" начинает сбрасываться.
А если вписать int st1 = 1, то работает.
 

CodeNameHawk

Moderator
Команда форума
С Exception decoder я сильно не разбирался, понятно одно, никаких исключений быть не должно.
Далее надо подумать не сидите ли долго в цикле main.
Правильный вариант не делать в нем никаких задержок.
Далее остаётся применять отладку, нп. по помощи #ifdef Otladka
Далее, в своём коде, в нужных(практически) во всех функциях, размещаете
Код:
#ifdef Otladka
Serial.println("зашел в такуюто функцию");
#endif
На выходе, если надо - выводить, что функцию покинул.
Так примерно можно определить, куда не доходит или где повисает.
 
Телепаты в в зимней спячке. Что это, где это и какое оно на самом деле.
Возможно, где-то вылазите за пределы массива.
Это ни к чему не относящаяся переменная. Я задаю ее внутри функции чисто для проверки уйдет в перезагрузку или нет. И вот если внутри этогого IF, что я приложил раскомментировать строковую переменную, где ей применяется любое значение, то плата уходит в циклическую перезагрузку. Если же эту переменную сделать INT и так же присвоить скажем 1, то плата не перегружается. Может памяти не хватает? Просто как бы работало же 2 года. Может подключение SD съело всю память?
 

CodeNameHawk

Moderator
Команда форума
Может подключение SD съело всю память?
Это первое, что напрашивается.

Попробуйте посмотреть при помощи:
ESP.getFreeHeap() returns the free heap size.
ESP.getHeapFragmentation() returns the fragmentation metric (0% is clean, more than ~50% is not harmless)
ESP.getMaxFreeBlockSize() returns the largest contiguous free RAM block in the heap, useful for checking heap fragmentation. NOTE: Maximum malloc() -able block will be smaller due to memory manager overheads.
https://arduino-esp8266.readthedocs.io/en/latest/libraries.html#esp-specific-apis
 
Зачем использовать такой "жирный" тип, если достаточно простого uint8_t
Пустой скетч уже немало занимает памяти Global variables use 26776 bytes (32%) of dynamic memory,
Это я уже танцы с бубнами начал. Потому что если этот IF пустой внутри, то не перегружается. А стоит раскомментировать переменную, любую, даже типа bool внутри этого IF как сразу начинаются циклические перезагрузки.
 

CodeNameHawk

Moderator
Команда форума
А стоит раскомментировать переменную, любую, даже типа bool внутри этого IF как сразу начинаются циклические перезагрузки.
Видать пошло ухудшение, ведь было
Достаточно только раскомментировать st = "1" начинает сбрасываться.
А если вписать int st1 = 1, то работает.
 
Кажется ясно откуда все беды. Часы снова показывают 165 часов 165 минут 85 секунд. И опять куда копать? Батарейку новую поставил. Все связи прозвонил.
 

CodeNameHawk

Moderator
Команда форума
Возьмите бумажку и напишите на ней.
Если не работает код, для работы с этой мс, отключаете все лишнее...
 
Зачем выводить на часы такое, если легко его проверить на правильность?
Да я пошагово разбирался в чем дело и дошел до вывода на экран информации. И тут увидел время.
Если не работает код, для работы с этой мс, отключаете все лишнее...
А лишнее что имеется в виду? Всякие датчики, SD карту и т.п.?
 
Сверху Снизу