Boa tarde, estou fazendo um projeto de uma chocadeira automática, mas estou penando para que o controlador de tensão e o dht22 funcionem corretamente juntos. Ele deve funcionar assim: Enquanto a temperatura estiver abaixo do mínimo, ele deve aumentar a potencia gradualmente da lampada, até que a temperatura chegue a temperatura ideal. Depois que ela chega na temperatura ideal, a lampada deve reduzir a potencia, até que estabilize a temperatura na faixa ideal, oscilando pouco na potencia.
Meu código é esse:
#include "DHT.h" //Biblioteca do DHT
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
#define PINODHT 7 //Pino para comunicação com DHT
#define TIPODHT DHT22 //DHT22(AM2302/ AM2321)
DHT dht(PINODHT, TIPODHT); //Configuraçãoes do DHT
//Porcentagem inicial em 40%, variável com valor da 0 a 100.
volatile int power = 40;
float tempmax = 38.2;
float tempmin = 37.2;
float tempmed = 37.8;
volatile float dif = 0;
int load = 3;
void setup() {
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.begin(20, 4); // inicializa o LCD
lcd.setCursor(0, 1);
lcd.print("Chocadeira Iniciando");
delay(2500);
lcd.clear();
dht.begin(); //Inicializa o DHT
pinMode(load, OUTPUT);
//Inicializa interrupção. O número zero indica a porta 2 do arduino,
//zero_cross_int é a função que será chamada toda vez que pino 2 do
//Aeduino, "subir" (RISING) de valor de 0 para 1.
attachInterrupt(0, zero_cross_int, RISING);
}
void loop() {
//delay(1000);
//Ler a temperatura ou humidade leva cerca de 250 milisegundos!
float h = dht.readHumidity();
//Lê a temperatura em Celsius (padrão)
float t = dht.readTemperature();
// Checando se qualquer leitura falhou.
if (isnan(h) || isnan(t)) {
lcd.setCursor(0, 1);
lcd.print("Falha ao ler");
return;
}
delay(500);
dif = tempmed - t;
lcd.setCursor(0, 0);
lcd.print("Umid: ");
lcd.setCursor(6, 0);
lcd.print(h);
lcd.setCursor(12, 0);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.setCursor(6, 1);
lcd.print(t);
lcd.setCursor(12, 1);
lcd.print("C ");
lcd.setCursor(0, 2);
lcd.print("Lamp: ");
lcd.setCursor(6, 2);
lcd.print(power);
lcd.setCursor(12, 2);
lcd.print("%");
lcd.setCursor(0, 3);
lcd.print("dif: ");
lcd.setCursor(6, 3);
lcd.print(dif);
lcd.setCursor(12, 3);
lcd.print("");
//abaixo da temperattura mínima
if(t <= tempmin){
if(power < 95){
power++;
delay(200);
}
lcd.setCursor(12, 3);
lcd.print("abaixo");
}
//manutenção da temperatura ideal
if(t > tempmin){
if(t < tempmed){
if(power < 95){
power++;
delay(200);
lcd.setCursor(12, 3);
lcd.print("media+");
}
}
if(t >= tempmed){
if(power > 40){
power--;
delay(200);
}
lcd.setCursor(12, 3);
lcd.print("media-");
}
}
}
//Função executada quando o Dimmer Shield detecta a passagem por zero da
//tensão alternada (senóide)
void zero_cross_int()
{
//Cálculo do ângulo de disparo: 60Hz -> 8,33ms (1/2 ciclo)
//(8333us - 8,33us) / 100 = 83 (aproximadamente)
//O powertime é o tempo que o TRIAC permanescerá desligado quando é
//detectado o ponto 0 da senóide e varia de 0 a 8300 microsegundos
int powertime = (83 * (100 - power));
//Se o powertime for menor ou igual a 300 microsegundos, dar o comando
//de ligar a lâmpada (carga) - potência total fornecida
if (powertime <= 830)
{
//Liga o pulso do sinal ao TRIAC para que ele passe a conduzir,
//coloca o pino digital "load" em nível alto
digitalWrite(load, HIGH);
}
//Se o powertime for menor ou igual a 8000 microsegundos, dar o comando
//de desligar a lâmpada (carga) - potência zero fornecida
else if (powertime >= 8000)
{
//Desliga o pulso do sinal ao TRIAC para que ele não conduza,
//coloca o pino digital "load" em nível baixo
digitalWrite(load, LOW);
}
//Se o powertime estiver entre 300 microsegundos a 8000 microsegundos
else if ((powertime > 830) && (powertime < 8000))
{
//Mantém o circuito desligado por powertime microssegundos (espera
//powertime microssegundos)
delayMicroseconds(powertime);
//Envia sinal ao TRIAC para que ele passe a conduzir, coloca o pino
//digital "load" em nível alto
digitalWrite(load, HIGH);
//Espera 8,33 microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
//Desliga o pulso do TRIAC, coloca o pino digital "load" em nível baixo
digitalWrite(load, LOW);
}
}
Meu problema está quando a temperatura sobe, e deveria começar a baixar a potencia, ai meu dht22 para de ler a temperatura.
Obrigado.