Estoy empezando con mi primer mini proyecto Arduino. No tengo mucha idea de electrónica, ni de programación, así que os pido paciencia.
Tengo un baño en el dormitorio donde se genera demasiada humedad, y pretendo programar un extractor con arduino.
Bien, os explico: me he hecho con un sensor de temp. y humedad DHT11, un relé SONGLE SRD-05VDC-SL-C y un ventilador.
Ya tengo montado todo el tinglado físicamente y sólo me queda el tema de la programación. Pero me he estancado en algo.
Funciona perfectamente, pero ahora quiero pulirlo un poquito. Tengo puesta la humedad máxima a 70, pero cuando se activa el relé quiero que baje a 65, por eso de que no ande encendiendo y apagando de manera intermitente.
El caso es que al estar dentro del bucle si le aplico hmax = hmax -tol; me lo va a restar siempre que esté en marcha el ventilador y no se apagará nunca.
Este es el código:
#include <DHT.h> // Carga la libreria del sensor
#define DHTPIN 4 // Define el pin 4 para el sensor
#define DHTTYPE DHT11 // Define el tipo de sensor a DHT 11
DHT dht(DHTPIN, DHTTYPE);
int rele = 2; // PIN donde va conectado el rele
int sensor = 4; // PIN donde va conectado el sensor de temperatura y humedad DHT11
int ON = LOW; // Variable para activar el rele (HIGH = apagado / LOW = encendido) ?Hago algo mal?
int OFF = HIGH; // Variable para desactivar el rele
int LEDOK = 6; // LED verde - todo OK
int LEDERR = 7; // LED rojo - ERROR
int hmax = 70; // Humedad maxima a la que se activa el extractor
int tol = 5 ; // Rango de seguridad para evitar que se encienda de manera intermitente el ventilador
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // Activamos el monitor serie a 9600 bauds
pinMode(rele, OUTPUT); // Activamos el PIN 2 como salida para el rele
pinMode(sensor, OUTPUT); // Activamos el PIN 4 como salida para el sensor
dht.begin(); // Iniciamos el sensor de humedad
}
void loop() {
// Aqui se leen los datos del sensor y se envian por el monitor de serie
int h = dht.readHumidity();
int t = dht.readTemperature();
// check if returns are valid, if they are NaN (not a number) then something went wrong!
if (isnan(t) || isnan(h) || h == 0 && t == 0) {
Serial.println("Failed to read from DHT");
digitalWrite(LEDERR, HIGH);
} else {
digitalWrite(LEDOK, HIGH);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C");
Serial.print(" Humedad max.: ");
Serial.println(hmax);
delay(2000);
}
// Empieza la parte del rele que controla el ventilador
boolean vent ;
if (h > hmax) {
vent = true;
digitalWrite(rele, ON);
//hmax = --hmax;
}
else {
digitalWrite(rele, OFF);
//hmax = hmax - tol;
}
}
El ventilador lo enciendo con ON y OFF porque no se a qué se debe, pero al relé tengo que mandarle la señal LOW cuando quiero encenderlo. He probado a cambiar los cables y la conexión es NC, no me lo explico. Para liarme menos lo he cambiado.
Gracias de antemano.
Un saludo
Entonces cuando h > 70 activas el rele
y no lo detienes hasta que sea menor que 70-tol = 65
Tu programa esta bien, pero la variable vent no la usas para nada. La pones en true y luego no haces nada con ella. seguramente fue algo que quedó de un ensayo.
Era tan sencillo buscar la solución por otro lado... y yo empeñado en hacerle la resta a la variable.
Muchas gracias. Ya he hecho limpieza en el código. Lo pego por si puede servirle a alguien:
#include <DHT.h> // Carga la libreria del sensor
#define DHTPIN 4 // Define el pin 4 para el sensor
#define DHTTYPE DHT11 // Define el tipo de sensor a DHT 11
DHT dht(DHTPIN, DHTTYPE);
int rele = 2; // PIN donde va conectado el rele
int sensor = 4; // PIN donde va conectado el sensor de temperatura y humedad DHT11
int ON = LOW; // Variable para activar el rele (HIGH = apagado / LOW = encendido) ?Hago algo mal?
int OFF = HIGH; // Variable para desactivar el rele
int LEDOK = 6; // LED verde - todo OK
int LEDERR = 7; // LED rojo - ERROR
int hmax = 70; // Humedad maxima a la que se activa el extractor
int tol = 5 ; // Rango de seguridad para evitar que se encienda de manera intermitente el ventilador
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); // Activamos el monitor serie a 9600 bauds
pinMode(rele, OUTPUT); // Activamos el PIN 2 como salida para el rele
pinMode(sensor, OUTPUT); // Activamos el PIN 4 como salida para el sensor
dht.begin(); // Iniciamos el sensor de humedad
}
void loop() {
// Aqui se leen los datos del sensor y se envian por el monitor de serie
int h = dht.readHumidity();
int t = dht.readTemperature();
// check if returns are valid, if they are NaN (not a number) then something went wrong!
if (isnan(t) || isnan(h) || h == 0 && t == 0) {
Serial.println("Failed to read from DHT");
digitalWrite(LEDERR, HIGH);
} else {
digitalWrite(LEDOK, HIGH);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
delay(2000);
}
// Empieza la parte del rele que controla el ventilador
if (h > hmax) {
digitalWrite(rele, ON);
}
if (h < hmax - tol) {
digitalWrite(rele, OFF);
}
}
raulm21:
El ventilador lo enciendo con ON y OFF porque no se a qué se debe, pero al relé tengo que mandarle la señal LOW cuando quiero encenderlo. He probado a cambiar los cables y la conexión es NC, no me lo explico. Para liarme menos lo he cambiado.
hay tres contactos mas dos de la bobina, tres en un lado (dos de la bobina y el del medio el común de los contactos) y en el otro lado del rele dos pines mas, uno es el NC y el otro el NA, si con uno te enciende con un 0 y cambia al otro pin y te encenderá con un un 1
En este caso es un ventilador, pero esto parece una tontería y sin embargo es critico a en otras aplicaciones (industriales por ejemplo) cual es el comportamiento mas seguro en cada caso? es decir si falla el arduino que queremos que este el motor en marcha o parado?
En este caso lo correcto es que a fallo de arduino se quede parado, como mucho se producirá un aumento de la humedad. Interesa usar el pin NA.
Pero imagínate que es el motor que suministra aire para ventilación para mantener a raya el C02 por ejemplo, interesa usar el pin NC, a fallo del arduino el ventilador queda en marcha
Viene preparado para conectar directamente. He probado a conectar el ventilador al 1º y 2º (NC) y al 2º y 3º (NA). En éste último, he de enviarle LOW para que arranque.
Nada esta mal diseñado.
Existe la lógica positiva (Rele que enciende por HIGH) y la lógica negativa (como tu caso que se activa por LOW).
Tu no te compliques. Siempre escribe tu código pensando en lógica positiva y si no funciona le pones un ! previo al comando final y cuando lo confirmas, si eres prolijo, lo cambias.
El ! es un negador o inversor.