Ардуино работает, но через какое то время зависает и оставляет нагреватель во включенном состоянии
- Войдите на сайт для отправки комментариев
Пт, 18/03/2022 - 10:55
Всем привет, первые сутки всё функционирует как часики, потом не могу понять в чём причина.
Датчик HDC1080, добавил функцию ресета через каждые 3 часа и "невозможных" показаниях датчика, но проблема никуда не ушла. Причём ардуино не встаёт, а как бы продолжает работать, но режимы работы уже не переключает. Может кто сталкивался? Интернет перешерстил своей проблемы найти не могу
Вот код
#include <Wire.h> #include "ClosedCube_HDC1080.h" #define Green 2 #define Yellow 3 #define Red 4 // #define Led 5 #define PIN_RELAY 6 #define Cooler 7 ClosedCube_HDC1080 hdc1080; unsigned long l; unsigned long c; unsigned long a; unsigned long r; void (*resetFunc)(void)=0; void setup() { // Serial.begin(9600); pinMode(PIN_RELAY, OUTPUT); pinMode(Red, OUTPUT); pinMode(Yellow, OUTPUT); pinMode(Green, OUTPUT); // pinMode(Led, OUTPUT); pinMode(Cool, OUTPUT); hdc1080.begin(0x40); a=30000; r=0; } void loop() { /*if (millis() - l >=0&&millis() - l < (unsigned long)60*60*12*1000){ digitalWrite(Led, HIGH) ; } if (millis() - l >= (unsigned long)60*60*12*1000){ digitalWrite(Led, LOW) ;} if(millis()-l>=(unsigned long)60*60*24*1000){ l = millis();}*/ if (millis()-c>=0&&millis()-c<600000){ digitalWrite(Cooler, HIGH);} if (millis()-c>=600000){ digitalWrite(Cooler, LOW);} if (millis()-r>10800000){ resetFunc(); } if (millis()-a>=30000){ a=millis(); float t,h; /* Serial.print("T="); Serial.print(hdc1080.readTemperature()); Serial.print("C, RH="); Serial.print(hdc1080.readHumidity()); Serial.println("%");*/ t = hdc1080.readTemperature(); h = hdc1080.readHumidity(); if (t >= 28.50) {digitalWrite(PIN_RELAY, LOW) ; } if (t <= 27.50 ){digitalWrite(PIN_RELAY, HIGH) ;} if (t>31.00 || t<1.00){resetFunc();} if (h >= 95.00 ){digitalWrite(Green, HIGH) ;} else {digitalWrite(Green, LOW) ;} if (h >= 90.00 && h < 95.00 ){digitalWrite(Yellow, HIGH) ;} else {digitalWrite(Yellow, LOW) ;} if (h < 90.00 ) {digitalWrite(Red, HIGH) ;} else {digitalWrite(Red , LOW) ;} } }
Поясните, что происходит в строке 38?
Если с момента включения прошло больше 0, но меньше 10 минут то управляющий сигнал высокий
Идёт управление кулером через функцию миллис
Если с момента включения прошло больше 10мин будет так:
if(millis()>60000)
Если с момента включения прошло больше 0, но меньше 10 минут то управляющий сигнал высокий
Идёт управление кулером через функцию миллис
То есть код не рассчитан на работу существенно более чем 10 минут? - чего вы тогда удивляетесь, что он на следующий день глючит?
Раньше он конечно был настроен по-другому и без ресета, добавлял эту функцию чтобы попробовать устранить проблему, но она никуда не ушла
Сейчас максимально очистил код, оставил только снятие показаний температуры и управление реле, теперь оно через несколько дней оставляет нагреватель не во включенном состоянии, а в выключенном и заданную функцию не выполняет
Сейчас максимально очистил код
показывайте
а ардуина какая? wdt включен?
Nano 328 wdt это таймер?
это ватчдог - специальная система, которая ресетит ардуину, если МК завис. Для вашего случая, как мне кажется, очень полезная вещь.
По коду криминала не вижу, скорее всего ардуина виснет из-за наводок при срабатывании реле. Обратный диод на реле стоит?
Диод стоит, спасибо попробую, слышал что от wdt загрузчик может полететь
А провод до датчика длинный?
Сантиметров 30
А схема то будет или нет? А то один тут тоже собирал и не работало, а оказалось - реле напрямую на пин подключал, а так низзяя.
подтяжка к VCC есть? какой номинал резисторов?
На самом датчик 10ком
А почему? Реле по 5 вольовой линии и управляющий сигнал с цифрового
Что почему? Кому отвечал то?))
Рисуй схему, хоть от руки на листочке. Шар хрустальный запотел по полной (