Ардуино работает, но через какое то время зависает и оставляет нагреватель во включенном состоянии

Dryg02
Offline
Зарегистрирован: 18.03.2022

Всем привет, первые сутки всё функционирует как часики, потом не могу понять в чём причина. 

Датчик 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) ;}
 }
}

 

KindMan
Offline
Зарегистрирован: 19.12.2018

Поясните, что происходит в строке 38?

Dryg02
Offline
Зарегистрирован: 18.03.2022

Если с момента включения прошло больше 0, но меньше 10 минут то управляющий сигнал высокий

Идёт управление кулером через функцию миллис

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Если с момента включения прошло больше 10мин будет так:
if(millis()>60000)

b707
Offline
Зарегистрирован: 26.05.2017

Dryg02 пишет:

Если с момента включения прошло больше 0, но меньше 10 минут то управляющий сигнал высокий

Идёт управление кулером через функцию миллис

То есть код не рассчитан на работу существенно более чем 10 минут? - чего вы тогда удивляетесь, что он на следующий день глючит?

Dryg02
Offline
Зарегистрирован: 18.03.2022

Раньше он конечно был настроен по-другому и без ресета, добавлял эту функцию чтобы попробовать устранить проблему, но она никуда не ушла

Dryg02
Offline
Зарегистрирован: 18.03.2022

Сейчас максимально очистил код, оставил только снятие показаний температуры и управление реле, теперь оно через несколько дней оставляет нагреватель не во включенном состоянии, а в выключенном и заданную функцию не выполняет

b707
Offline
Зарегистрирован: 26.05.2017

Dryg02 пишет:

Сейчас максимально очистил код

показывайте

Dryg02
Offline
Зарегистрирован: 18.03.2022
#include <Wire.h>
 #include "ClosedCube_HDC1080.h"
      #define PIN_RELAY 6
ClosedCube_HDC1080 hdc1080;
void setup()
{  
                                     // Serial.begin(9600);
pinMode(PIN_RELAY, OUTPUT);
hdc1080.begin(0x40);
}
void loop()
{
float t;
 /*                                      Serial.print("T=");
                                        Serial.print(hdc1080.readTemperature());
                                        Serial.print("C, RH=");
                                        Serial.print(hdc1080.readHumidity());
                                        Serial.println("%");*/
t = hdc1080.readTemperature();
  if (t >= 28.50) {digitalWrite(PIN_RELAY, LOW) ; }
if (t <= 27.50 ){digitalWrite(PIN_RELAY, HIGH) ;}
delay(30000);
 }

 

b707
Offline
Зарегистрирован: 26.05.2017

а ардуина какая? wdt включен?

Dryg02
Offline
Зарегистрирован: 18.03.2022

Nano 328 wdt это таймер?

b707
Offline
Зарегистрирован: 26.05.2017

Dryg02 пишет:
wdt это таймер?

это ватчдог - специальная система, которая ресетит ардуину, если МК завис. Для вашего случая, как мне кажется, очень полезная вещь.

По коду криминала не вижу, скорее всего ардуина виснет из-за наводок при срабатывании реле. Обратный диод на реле стоит?

Dryg02
Offline
Зарегистрирован: 18.03.2022

Диод стоит, спасибо попробую, слышал что от wdt загрузчик может полететь

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

А провод до датчика длинный?

Dryg02
Offline
Зарегистрирован: 18.03.2022

Сантиметров 30

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А схема то будет или нет? А то один тут тоже собирал и не работало, а оказалось - реле напрямую на пин подключал,  а так низзяя.

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

Dryg02 пишет:
Сантиметров 30

подтяжка к VCC есть? какой номинал резисторов?

Dryg02
Offline
Зарегистрирован: 18.03.2022

На самом датчик 10ком

Dryg02
Offline
Зарегистрирован: 18.03.2022

А почему? Реле по 5 вольовой линии и управляющий сигнал с цифрового

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Dryg02 пишет:
А почему? Реле по 5 вольовой линии и управляющий сигнал с цифрового

Что почему? Кому отвечал то?))

Рисуй схему, хоть от руки на листочке. Шар хрустальный запотел по полной (