Зависает Arduino Nano через ≈ 8-12 часов.
- Войдите на сайт для отправки комментариев
Доброго времени суток! Возникла необходимость собрать приточно-вытяжную вентиляцию, ну и до кучи прикрутить датчик движения для управления светом. Систему "климат-контроля" собрал из : arduino nano, 4-х канального релейного модуля, датчика DHT-11 и PIR датчика (типа НС-SR501). Собрал систему написал скетч вроде работает, но через 8-12 часов после запуска "зависает" (светятся светодиоды: power и L(13 PIN), TX не моргает). Если перезагрузить по питанию, то работает опять 8-12 часов. Не могу понять почему зависает. Это мой первый код на millis(), думаю что мог где создать абсурдное условие которое приводит к зависанию. Код:
#include "DHT.h" #define DHTPIN 12 #define PIN_PIR 7 #define PIN_LED 4 #define PIN_RELAY1 2 #define PIN_RELAY2 3 #define PIN_BUTT 8 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); static uint32_t myTimer1, myTimer2, myTimer3, myTimer4, period; static byte mode = 0; boolean butt_flag = 0; boolean butt; boolean relay_flag = 0; void setup() { pinMode(6, OUTPUT);digitalWrite(6, LOW); pinMode(8, OUTPUT); pinMode (PIN_BUTT, INPUT_PULLUP); pinMode(PIN_PIR, INPUT); pinMode(PIN_LED, OUTPUT); pinMode(PIN_RELAY1, OUTPUT);digitalWrite(PIN_RELAY1, HIGH); pinMode(PIN_RELAY2, OUTPUT);digitalWrite(PIN_RELAY2, HIGH); pinMode(11, OUTPUT);digitalWrite(11, HIGH); dht.begin(); Serial.begin(9600); } void loop() { // каждую секунду if (millis() - myTimer3 >= 1000) { myTimer3 = millis(); // сбросить таймер toggleLED(); } if (millis() - myTimer2 >= 1000) { myTimer2 = millis(); // сбросить таймер humid(); } if (millis() - myTimer4 >= 1000) { myTimer4 = millis(); // сбросить таймер butt = !digitalRead(PIN_BUTT); if(butt == 1 && butt_flag == 0) { butt_flag = 1; relay_flag = !relay_flag; } if (butt == 0 && butt_flag == 1) { butt_flag = 0; } Serial.println(F("Relay: ")); Serial.println(relay_flag);} digitalWrite(13, relay_flag); } void toggleLED() { int pirVal = digitalRead(PIN_PIR); Serial.println("Motion:"); Serial.println(pirVal); Serial.println("Mode:"); Serial.println(mode); //Если обнаружили движение if (pirVal == 0) { digitalWrite(PIN_LED, HIGH); } else { digitalWrite(PIN_LED, LOW); } } void humid() { float h = dht.readHumidity(); Serial.println(F("Humidity: ")); Serial.println(h); digitalWrite(6, HIGH); if (h >= 65 || relay_flag == 1){ if (millis()-myTimer1 >= period){ myTimer1 = millis(); if (++mode >= 5) mode = 0; switch (mode) { case 0: digitalWrite(PIN_RELAY1, HIGH); period = 500; break; case 1: digitalWrite(PIN_RELAY1, LOW); period = 90000; break; case 2: digitalWrite(PIN_RELAY1, HIGH); period = 500; break; case 3: digitalWrite(PIN_RELAY2, LOW); period = 90000; break; case 4: digitalWrite(PIN_RELAY2, HIGH); period = 500; break; } } }else if(h < 65 || relay_flag == 1){ digitalWrite(PIN_RELAY1, HIGH); digitalWrite(PIN_RELAY2, HIGH); mode = 0; } }
Логика работы: при повышении влажности более 65% попеременно включаются реле1 (вытяжка) и реле2 (приточка) до тех пор пока не будет ниже 65%, и второе условие если нажать кнопку то реле переключаются до повторного нажатия. Параллельно этому отслеживается движение и по нему включается реле3 (лампа).
Спасибо за внимание!
P.S. Питание от адаптера на пин 5+.
WatchDog включи и забей на свой говнокод.
Возможно помимо программной части, зависание возникает из-за помех по питанию, у вас там несколько реле, возможно вы включаете и выключает двигатель. Решение именно в данном случае - повесить около пинов питания контроллера батарею из керамики микрофарад на 100 и поставить запирающий диод, чтобы не допустить просадок напряжения питания контроллера.
керамика на 100 микрофарад! За троллинг зачёт!!!
Chicony72 скорее всего наводки от реле, в коде явных проблем не вижу.
Комбинируйте советы #1 и #2: добавить конденсаторы по питанию на 10-100 мкФ, керамику 104-105 на каждый вход, на каждое реле по диоду в обратной полярности.
Ну и ватчдог обязательно.
керамика на 100 микрофарад! За троллинг зачёт!!!
Да это не троллинг, я из таких конденсаторов:
https://www.chipdip.ru/product0/9000591944
паял батареи 7х7, итого 7х7х10мкф=490 микрофарад.
Может и не троллинг, но от помех от двигателя сомнительная польза. Скорее всего человек имел ввиду нанофарады.
Если советы выше про конденсаторы не помогут, можно ещё попробовать отключать части схемы, как программно, так и электрически.
Скажем, отключить библиотеку , вместо датчика выключатель с резисторами на пин. Вкл- влажность больше 65% Выкл- меньше.
Так же и электрически, отключить реле, оставить светодиоды...Проверить работу программы, без периферии
Само - собой проверить источники питания, оптопара на управление реле очень желательна
Смысл в том, чтобы определить , где именно косяк
У меня было что то похожее, через пару дней зависало, оказалось что датчик влажности и температуры AMC2315 при длинных периодах считывания зависал, уменьшил период считывания и все работает. Датчик куплен в Китае, один из самых дорогих в нижнем сегменте, скорее всего клон.
ладно с кондером бог с ним, а вот про диод можно поподробней, просто кусочек схемы?
Есть адаптеры с такими помехами, что 8 часов для Nano неплохой результат.
Вобщем нужно: