Pessoal,

Estou tentando controla temperatura e umidade de um local, como se fosse um estufa. Porém, por ser um ambiente pequeno, quando atinjo a umidade ou a temperatura, o arduino desliga a lâmpada que estou usando como resistência, mas logo os valores chegam no ajuste, desligando e ligando o rele a cada segundo. Tentei de tudo para deixar uma margem de 3 graus e 3% na umidade para que o arduino desligue a lampada e volte a ligar somente quando houver esta diferença. Se alguém puder me ajudar agradeço.

Segue o código:

#include <LiquidCrystal.h>
#include "DHT.h"

int sensor = 0; // Pino analogico em que o sensor esta conetado A0 - Colocar resistor 10K
int valorSensor = 0; //variável usada para ler o valor do sensor em tempo real.
int backlite; // variavel do backlite
int luzBacklite = 10; // Luz de fundo do LCD ligado a porta digital 10
int rele1 = 7; // Rele resistencia 10W ligado a porta digital 7
int tempo = 0, segundo, segundos = 00, minutos = 00, horas = 00, dias = 0;

const int numRows = 2; // these constants won't change. But you can change the size of
const int numCols = 16; // your LCD using them:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // initialize the library with the numbers of the interface pins

byte temp[8] = { 0b00100, // vetor de bytes correspondentes
0b01010, // ao desenho de temperatura
0b01010,
0b01110,
0b01110,
0b11111,
0b11111,
0b01110
};

byte grau[8] = { 0b01000, // vetor de bytes correspondentes
0b10100, // ao simbolo de graus
0b01000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};

byte clock[8] = { 0b00000, // vetor de bytes correspondentes
0b01110, // ao simbolo de graus
0b10101,
0b10101,
0b10111,
0b10001,
0b01110,
0b00000
};

byte umid[8] = { 0b10101, // vetor de bytes correspondentes
0b01010, // ao simbolo de umidade
0b00000,
0b01110,
0b11111,
0b00100,
0b10100,
0b01000
};


#define DHTPIN 8 // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT dht(DHTPIN, DHTTYPE);

void setup() {
Serial.begin(9600);
pinMode(luzBacklite,OUTPUT);
pinMode(rele1,OUTPUT);
digitalWrite(luzBacklite, HIGH);

lcd.begin(numCols,numRows); // set up the LCD's number of columns and rows:
lcd.setCursor(0,0);
lcd.print("Controle Umidade");

delay(2000);


lcd.createChar(1, temp); // envia caracter "temp" para o display
lcd.createChar(2, grau); // envia caracter "grau" para o display
lcd.createChar(3, umid); // envia caracter "umidade" para o display
lcd.createChar(4, clock); // envia caracter "relogio" para o display

dht.begin();
}

void loop() {
valorSensor = analogRead(sensor); //Lendo o valor do sensor.
//valorSensor = 1023 - valorSensor;
backlite = map(valorSensor, 0, 1023, 1, 255);
analogWrite(luzBacklite, backlite); // acende o backlite com o brilho determinado

segundo = millis() /1000;

float h = dht.readHumidity(); // Reading temperature or humidity takes about 250 milliseconds!
float t = dht.readTemperature(); // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)

if (segundo > tempo || segundo < tempo) {
tempo = segundo;
segundos = segundos + 1;
}
if (segundos >= 60) {
minutos = minutos + 1;
segundos = 0;
}
if (minutos >= 60) {
horas = horas + 1;
minutos = 0;
}
if (horas >= 24) {
dias = dias + 1;
horas = 0;
}

if (isnan(t) || isnan(h)) { // check if returns are valid, if they are NaN (not a number) then something went wrong!
lcd.setCursor(0,0); // Posiciona cursor na linha 0,0
lcd.print("Falha ao ler DHT"); // Imprime mensagem de erro
} else {
lcd.clear();
lcd.setCursor(0,0); // Posiciona cursor na linha 0,0
lcd.write(3); // Desenha caracter "umid"
lcd.setCursor(2,0);
lcd.print(h, 1); // Valor da umidade
lcd.print("%"); // Simbolo
lcd.print(" "); // Espaco
lcd.write(1); // Desenha caracter "temp"
lcd.print(" "); // Espaco
lcd.setCursor(10,0);
lcd.print(t, 1); // Valor de temperatura
lcd.write(2); // Desenha caracter "grau"
lcd.print("C"); // Letra C
lcd.setCursor(0,1);
if(dias < 100) {
Serial.print("0");
lcd.print("0");
}
if(dias < 99 || dias > 10) {
Serial.print("0");
lcd.print("0");
}
lcd.print(dias);
Serial.println();
Serial.print(dias);
lcd.setCursor(5,1);
lcd.write(4); //Desenha relogio
Serial.print(" ");
lcd.setCursor(8,1);
if(horas < 10) {
Serial.print("0");
lcd.print("0");
}
Serial.print(horas);
lcd.print(horas);
Serial.print(":");
lcd.print(":");
if(minutos < 10) {
Serial.print("0");
lcd.print("0");
}
Serial.print(minutos);
lcd.print(minutos);
Serial.print(":");
lcd.print(":");
if(segundos < 10) {
Serial.print("0");
lcd.print("0");
}
Serial.print(segundos);
lcd.print(segundos);
// delay(1); // Atraso para ler dados novamente
}
if((h>20) && (t<45)) { // variavel que representa se a umidade for maior que 20 e a temperatura for menor que 45
digitalWrite(7,HIGH); // Liga rele da porta digital 7
} else { // variavel que indentifica se o valor acima e verdadeiro pois se for falso executa:
digitalWrite(7,LOW);
} // Desliga rele da porta digital 7
}

Exibições: 2105

Responder esta

Respostas a este tópico

Uma sujestão para vc fazer esse tipo de controle de maneira precisa é o uso de PID e TRIAC. No meu blog tem uma série de posts que explica como fazer. Esse é o primeiro: http://automatobr.blogspot.com.br/2013/05/controle-de-potencia-em-c...

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço