Hola todos. Estoy intentando automatizar un sistema de humidificación. Tengo un pequeño humidificador comercial que se enciende y se apaga a través de un pulsador. Este sistema de encendido y apagado dificulta automatizarlo. Lo que quiero hacer es poder encenderlo y apagarlo con un relé conectado a Arduino que lo activará cuando la humedad llegue a un mínimo deseado y se apagará al llegar a un máximo. Para esto necesitaría desactivar el sistema de encendido por pulsador y reemplazarlo por encendido tipo interruptor mecánico (que es equivalente a un relé). ¿Alguien tendrá una idea para ayudarme con esto? Muchas gracias desde ya.
Conecta lo contactos del relé en paralelo al pulsador y listo.
Algo así

Saludos
Gracias, en realiad eso hice, pero, para emular el efecto del pulsador, el relé debe conectar y desconectar para encender y luego hacer lo mismo dos veces para apagar. Y ahí el código que intento usar no me sirve porque, al conectar arduino, el relé hace un movimiento y, con eso, me varía el estado inicial del humidificador, entonces todas las "pulsaciones" que haga tendrán un efecto diferente. Quizá haya un modo de puentear el pulsador y conectar directamente a orto punto de la placa del humidificador.
Haz una pulsación.
Activa el rele y luego de unos mseg desactívalo y tendrás el mismo efecto que manualmente.
No me gusta usar delay pero el ejemplo Blink.ino es lo mismo que necesitas.
Habitualmente LOW activa el rele y HIGH lo desactiva. Prueba esto que te digo.
digitalWrite(pin, LOW); // Activa relé
delay(100);
digitalWrite(pin, HIGH); // desactiva relé
Gracias, Surbite. Hice el código como dijiste pero si lo pongo en el loop se queda en el bucle (enciende apaga; enciende apaga; enciende apaga)
if(HUMEDAD < 80){
digitalWrite(RELAY,LOW);
delay (100);
digitalWrite(RELAY, HIGH);
}
else{
digitalWrite(RELAY,LOW);
delay (100);
digitalWrite(RELAY, HIGH);
delay (100);
digitalWrite(RELAY,LOW);
delay (100);
digitalWrite(RELAY, HIGH);
}
Mientras está debajo de 80% de humedad, repite la primera instrucción sin parar. Si llega a ochenta, empieza con la segunda instrucción igual sin parar. Debe haber una forma de parar el bucle sin afectar todo. SI escribo al final de cada instrucción for(;;);, entonces se detiene y nunca realiza la segunda instrucción inclusi sila humedad llegue a 80%. Además el monitor deja de escribir los datos. ¿existe otra forma de hacer que funcione
Tu quieres reemplazar el accionamiento con esta secuencia, la cual debe ejectutarse solo una vez en cada acción.
Primero y fundamental, nunca publiques códigos parciales como el que has presentado a menos que ya hayas publicado todo tu código en algún momento previo.
Ahora sigo y espero se comprenda.
// antes del seltup
// repite las variables gloables y librerías.
bool acciono = true;
void setup() {
// repite lo que tengas aquí
}
void loop() {
if (HUMEDAD < 80){
if (accion == true) {
digitalWrite(RELAY,LOW);
delay (100);
digitalWrite(RELAY, HIGH);
accion = false;
}
}
if (HUMEDAD > 81) {
digitalWrite(RELAY,LOW);
delay (100);
digitalWrite(RELAY, HIGH);
delay (100);
digitalWrite(RELAY,LOW);
delay (100);
digitalWrite(RELAY, HIGH);
acciono = true;
}
}
Gracias, ha mejorado en un 50%. La primera secuencia se ejecuta una sola vez, pero la segunda se sigue ejecutando indefinidamente.
Por las dudas, he reemplazado tu variable booliana "acciono" por "accion" y he desechado "acciono" tanto en la declaración como, obviamente, en el resto del código. Imagino que había un error de tipeo ahí.
Acá adjunto mi código completo con tus aportes:
#include <DHT.h>
#include <DHT_U.h>
#include <Wire.h>
#include <Adafruit_GFX.h> // libreria para pantallas graficas
#include <Adafruit_SSD1306.h> // libreria para controlador SSD1306
#define ANCHO 128
#define ALTO 64
#define OLED_RESET 4
Adafruit_SSD1306 oled (ANCHO, ALTO, &Wire, OLED_RESET);
int SENSOR=2;
int RELAY=3;
float TEMPERATURA;
float HUMEDAD;
bool accion = true;
DHT dht(SENSOR, DHT22);
void setup(){
Serial.begin(9600);
dht.begin();
Wire.begin();
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(RELAY,OUTPUT);
digitalWrite(RELAY,HIGH);
}
void loop(){
TEMPERATURA =dht.readTemperature();
HUMEDAD = dht.readHumidity();
if(HUMEDAD < 80){
if(accion==true){
digitalWrite(RELAY,LOW);
delay (100);
digitalWrite(RELAY, HIGH);
accion = false;
}
}
if (HUMEDAD >81){
digitalWrite(RELAY,LOW);
delay (100);
digitalWrite(RELAY, HIGH);
delay (100);
digitalWrite(RELAY,LOW);
delay (100);
digitalWrite(RELAY, HIGH);
accion = true;
}
Serial.print(" Temperatura: ");
Serial.print(TEMPERATURA);
Serial.print(" Humedad: ");
Serial.println(HUMEDAD);
delay(1000);
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setCursor(0,0);
oled.setTextSize (2);
oled.print("TEMP");
oled.setCursor(70,0);
oled.setTextSize (2);
oled.print("HUM");
oled.setCursor(0,32);
oled.setTextSize (2);
oled.print(TEMPERATURA,1);
oled.setCursor(70,32);
oled.setTextSize (2);
oled.print(HUMEDAD,1);
oled.display();
}
Quieres que las acciones ocurran una sola vez. No hay problema.
Usa variables que controlen justamente eso.
#include <DHT.h>
#include <DHT_U.h>
#include <Wire.h>
#include <Adafruit_GFX.h> // libreria para pantallas graficas
#include <Adafruit_SSD1306.h> // libreria para controlador SSD1306
#define ANCHO 128
#define ALTO 64
#define OLED_RESET 4
Adafruit_SSD1306 oled (ANCHO, ALTO, &Wire, OLED_RESET);
const int sensor = 2;
const int relay = 3;
float temperatura;
float humedad;
bool flag1 = false;
bool flag2 = true;
DHT dht(sensor, DHT22);
void setup() {
Serial.begin(9600);
dht.begin();
Wire.begin();
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(relay, OUTPUT);
digitalWrite(relay, HIGH);
}
void loop() {
temperatura = dht.readTemperature();
humedad = dht.readHumidity();
if (humedad < 80) {
if (flag1 == false) {
digitalWrite(relay, LOW);
delay (100);
digitalWrite(relay, HIGH);
flag1 = true; // bloque flag que acciona una vez HUM < 80
flag2 = false; // activo flag para que en el caso que HUM > 81 lo haga 1 vez
}
}
if (humedad > 81) {
if (flag2 == false) {
digitalWrite(relay, LOW);
delay (100);
digitalWrite(relay, HIGH);
delay (100);
digitalWrite(relay, LOW);
delay (100);
digitalWrite(relay, HIGH);
flag2 = true;
flag1 = false;
}
Serial.print(" temperatura: ");
Serial.print(temperatura);
Serial.print(" humedad: ");
Serial.println(humedad);
delay(1000);
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setCursor(0, 0);
oled.setTextSize (2);
oled.print("TEMP");
oled.setCursor(70, 0);
oled.setTextSize (2);
oled.print("HUM");
oled.setCursor(0, 32);
oled.setTextSize (2);
oled.print(temperatura, 1);
oled.setCursor(70, 32);
oled.setTextSize (2);
oled.print(humedad, 1);
oled.display();
}
Gracias, Serbyte, funciona. Solo que cuando la humedad baja a 80%, deja de escribirla tanto en el serial como en el oled. Solo escribe a partir de 81% de humedad. ¿tiene arreglo eso?
Si claro que lo tiene pero si no te das cuenta estas muy perdido en la programación.
Por eso siempre pido que los códigos se presenten debidamente identados o sea con el espaciado o sangría correspondiente. Siempre que un código pertenece a algo entre llaves debe ir un TAB a la derecha para ayudar a leerlo mejor.
Ahora si vamos al código anterior faltó una } (reitero).
Mira lo que esta debajo de
if (humedad > 81) {
justamente todo lo que imprime en serial y OLED
Se me escapó pero debe ir asi.
void loop() {
temperatura = dht.readTemperature();
humedad = dht.readHumidity();
if (humedad < 80) {
if (flag1 == false) {
digitalWrite(relay, LOW);
delay (100);
digitalWrite(relay, HIGH);
flag1 = true; // bloque flag que acciona una vez HUM < 80
flag2 = false; // activo flag para que en el caso que HUM > 81 lo haga 1 vez
}
}
if (humedad > 81) {
if (flag2 == false) {
digitalWrite(relay, LOW);
delay (100);
digitalWrite(relay, HIGH);
delay (100);
digitalWrite(relay, LOW);
delay (100);
digitalWrite(relay, HIGH);
flag2 = true;
flag1 = false;
}
}
Serial.print(" temperatura: ");
Serial.print(temperatura);
Serial.print(" humedad: ");
Serial.println(humedad);
delay(1000);
oled.clearDisplay();
oled.setTextColor(WHITE);
oled.setCursor(0, 0);
oled.setTextSize (2);
oled.print("TEMP");
oled.setCursor(70, 0);
oled.setTextSize (2);
oled.print("HUM");
oled.setCursor(0, 32);
oled.setTextSize (2);
oled.print(temperatura, 1);
oled.setCursor(70, 32);
oled.setTextSize (2);
oled.print(humedad, 1);
oled.display();
}
Ahora cada condición activa o desactiva lo que corresponde y ambas presentan los datos x Serial y OLED:
Se me olvidó una llave. A ti te debió haber dado un error y la completaste claro que al hacerlo la pusiste al final y con ello cerraste la llave del
if (humedad > 81) {
que estaba pendiente y eso arrastró todo y lo condicionó.
Perfecto, ahora sí funciona bien!. Gracias Surbite. Y sí, claro que estoy perdido, apenas se casi nada de programación, por eso consulto en el foro lo que no puedo hacer por mi mismo.