Boa tarde pessoal!!!
Estou com problemas ao realizar o controle de umidade utilizando um Arduino UNO, sensor de umidade e temperatura DHT11 e um módulo de relé 2 canais de 5 V para acionar, sendo um relé para a bomba de ar seco e a outra de ar úmido.
Quando ligo o arduino na porta USB tudo funciona corretamente, imprimindo os valores de umidade relativa na porta serial, no entanto após certo período de tempo (este período está variando de pouco minutos até quase 1 hora de funcionamento) o arduino trava, o computador faz um barulho igual quando desconectamos algo da porta USB, e a porta COM fica inacessível pelo arduino. Logo em seguida o arduino liga no entanto o programa não é executado.
Observações:
1 - Já tentei usar Serial.flush();
2 - Já tentei utilizar uma fonte externa para os relés;
3 - Já tentei ler apenas a umidade pelo LCD, porém após um tempo o LCD passa a escrever valores sem lógica (quando um relé desliga e o outro é acionado) e depois o arduino trava, liga novamente e não roda o programa;
4 - Segue o código:
#include <dht11.h>
#include <LiquidCrystal.h>
#include<Servo.h>
// Defini os pinos de ligação do LCD:
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
// Vss, K, RW: GND
// Vdd, A: 5 V
// V0: Pino central do potenciometro de 10 Kohms
// RS: Pino 12 do arduino
// E: Pino 11 do arduino
// D0 à D3: Não Utilizados
// D4: Pino 5 do arduino
// D5: Pino 4 do arduino
// D6: Pino 3 do arduino
// D7: Pino 2 do arduino
// Define o nome do sensor e depois o pinos do sensor
//código do byte °
byte grau[8] ={ B00001100,
B00010010,
B00010010,
B00001100,
B00000000,
B00000000,
B00000000,
B00000000,};
dht11 DHT;
#define DHT11_PIN 13
//Inicialmente declarou-se, a variável da umidade (h), os pinos do relé 1 e 2 (R1-umido e R2-seco), e os limites inferior e superior de umidade (ref1 e ref2)
float h,t;
int pos,vel,velo;
int Rl = 8;
int R2 = 7;
float ref1 = 70;
float ref2 = 70;
float i = 0.0;
Servo myservo;
//Começa o setup, inicia a porta serial para ler e imprimir valores; declara os pinos de entrada e saída e o estado de energia de cada um)
void setup() {
Serial.begin(9600);
myservo.attach(9);
lcd.begin(16, 2);
lcd.createChar(0, grau);
lcd.setCursor(0,0);
lcd.print("Temp : ");
lcd.setCursor(0,1);
lcd.print("U.R : ");
pinMode(Rl,OUTPUT);
pinMode(R2,OUTPUT);
digitalWrite(Rl,HIGH);
digitalWrite(R2,HIGH);
}
// pelo serial são recebidos os valores de referencia e inicia a verificação do sinal do sensor e o switch case
void loop() {
Serial.print("Lendo sensor: ");
int chk = DHT.read(DHT11_PIN);
switch(chk) {
case DHTLIB_OK:
Serial.println("OK");
delay(2000);
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println("Erro no checksum");
digitalWrite(Rl,HIGH);
digitalWrite(R2,HIGH);
delay(2000);
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println("Tempo esgotado");
digitalWrite(Rl,HIGH);
digitalWrite(R2,HIGH);
delay(2000);
break;
default:
Serial.println("Erro desconhecido");
}
h=(float)DHT.humidity;
delay(1000);
Serial.println(h);
t=(float)DHT.temperature;
lcd.setCursor(7,0);
lcd.print(t);
lcd.setCursor(13,0);
lcd.write((byte)0);
lcd.setCursor(14,0);
lcd.print("C");
lcd.setCursor(6,1);
lcd.print(h);
lcd.setCursor(12,1);
lcd.print("%");
if(h==0.0)
{
digitalWrite(Rl,HIGH);
digitalWrite(R2,HIGH);
delay(1000);
}
if(h<ref1)
{
digitalWrite(Rl,LOW);
digitalWrite(R2,HIGH);
delay(1000);
}
if(h>=ref2)
{
digitalWrite(Rl,HIGH);
digitalWrite(R2,LOW);
delay(1000);
}
else{
digitalWrite(Rl,LOW);
digitalWrite(R2,HIGH);
delay(1000);
}
if (Serial.available()){
ref1 = Serial.parseInt();
ref2 = Serial.parseInt();
pos = Serial.parseInt();
vel = Serial.parseInt();
velo = Serial.parseInt();
Serial.println(pos);
Serial.println(vel);
Serial.println(velo);
Serial.print ("Limite inferior de umidade: ");
Serial.println(ref1);
Serial.print("Limite superior de umidade: ");
Serial.println(ref2);
Serial.print("Ângulo de deformação: ");
Serial.println(pos);
Serial.print("Delay entre os ângulos: ");
Serial.println(vel);
Serial.print("Delay de súbida e descida: ");
Serial.println(velo);
}
else
{
for(i=0;i<=pos;i+=1.0){
myservo.write(i);
delay(vel);
}
delay(velo);
for(i=pos;i>=0;i-=1.0){
myservo.write(i);
delay(vel);
}
delay(velo);
}
}