Buans tardes,
El sistema se compone de un modulo de 2 rele que se accionan independientes dependiendo de la cantidad de tiempo que proponga para cada uno. El tema es que uno de ellos (rele 4 funciona cada 30 seg) pero el rele 3 no funciona. (El rele en si mismo funciona correctamente, pero no reproduce la función).
Es parte de un sistema que mide temperatura y humedad con un sensor DHT22 y pantalla led I2C y que acciona, según los valores de temperatura y humedad, otro modulo de reles pero esos andan bien.
Soy químico no programador.... ha sido prueba y error pero acá me quedé estancado.
Se agradece su colaboración
Aca esta el codigo que uso
//Libraries
#include <DHT.h>;
//I2C LCD:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
//Constants
#define DHTPIN 4 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
unsigned long t;
//Variables
//int chk;
float hum; //Stores humidity value
float temp; //Stores temperature value
int RELE1 = 2; //Relé que controla temp
int RELE2 = 7; //Relé que controla humedad
int RELE3 = 8; //Relé que controla luz
int RELE4 = 9; //Relé que controla ventilador
void setup()
{
Serial.begin(9600);
Serial.println("ppdo's Temp and Humidity Sensor Test");
dht.begin();
lcd.init(); //initialize the lcd
lcd.backlight(); //open the backlight
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
pinMode(RELE3, OUTPUT);
pinMode(RELE4, OUTPUT);
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, HIGH);
digitalWrite(RELE3, HIGH);
digitalWrite(RELE4, HIGH);
Serial.begin(9600);
t = millis();
}
void loop()
{
//Read data and store it to variables hum and temp
// Reading temperature or humidity takes about 250 milliseconds!
{ hum = dht.readHumidity();
temp= dht.readTemperature();
//Print temp and humidity values to serial monitor
Serial.print("Humidity: ");
Serial.print(hum);
Serial.print(" %, Temp: ");
Serial.print(temp);
Serial.println(" Celsius");
// set the cursor to (0,0):
lcd.setCursor(0, 0);
// print from 0 to 9:
lcd.print("Temp: ");
lcd.print(temp);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(hum);
lcd.print(" %");
delay(2000); //Delay 30 sec.
}
if (temp < 19 +1)
digitalWrite(RELE1, LOW);
if (temp > 18 +1)
digitalWrite(RELE1, HIGH);
if (hum < 80 +1)
digitalWrite(RELE2, LOW);
if (hum > 80 +1)
digitalWrite(RELE2, HIGH );
{if ( millis() >= t + 30000 ) {
if ( RELE4==HIGH )
RELE4=LOW;
else
RELE4=HIGH;
digitalWrite(9,RELE4);
// Guardamos el tiempo de nuevo para comprobar en las siguientes
// pasadas.
t = millis(); }}
{if ( millis() >= t + 45000 ) {
if ( RELE3==HIGH )
RELE3=LOW;
else
RELE3=HIGH;
digitalWrite(8,RELE3);
// Guardamos el tiempo de nuevo para comprobar en las siguientes
// pasadas.
t = millis(); }}
}
Tienes llaves por todo el código sin sentido, puedes ver si están bien apretando Ctrl+T, ninguna linea tendrá que aparecer pegada a la izquierda si no ha finalizado el loop.
Explícanos con mas detalle que debe hacer para contrastar con el código.
//Libraries
#include <DHT.h>;
//I2C LCD:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
//Constants
#define DHTPIN 4 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
unsigned long t;
//Variables
//int chk;
float hum; //Stores humidity value
float temp; //Stores temperature value
int RELE1 = 2; //Relé que controla temp
int RELE2 = 7; //Relé que controla humedad
int RELE3 = 8; //Relé que controla luz
int RELE4 = 9; //Relé que controla ventilador
void setup() {
Serial.begin(9600);
Serial.println("ppdo's Temp and Humidity Sensor Test");
dht.begin();
lcd.init(); //initialize the lcd
lcd.backlight(); //open the backlight
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
pinMode(RELE3, OUTPUT);
pinMode(RELE4, OUTPUT);
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, HIGH);
digitalWrite(RELE3, HIGH);
digitalWrite(RELE4, HIGH);
Serial.begin(9600);
t = millis();
}
void loop() {
//Read data and store it to variables hum and temp
// Reading temperature or humidity takes about 250 milliseconds!
hum = dht.readHumidity();
temp = dht.readTemperature();
//Print temp and humidity values to serial monitor
Serial.print("Humidity: ");
Serial.print(hum);
Serial.print(" %, Temp: ");
Serial.print(temp);
Serial.println(" Celsius");
// set the cursor to (0,0):
lcd.setCursor(0, 0);
// print from 0 to 9:
lcd.print("Temp: ");
lcd.print(temp);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(hum);
lcd.print(" %");
delay(2000); //Delay 30 sec.
if (temp < 19 + 1)
digitalWrite(RELE1, LOW);
if (temp > 18 + 1)
digitalWrite(RELE1, HIGH);
if (hum < 80 + 1)
digitalWrite(RELE2, LOW);
if (hum > 80 + 1)
digitalWrite(RELE2, HIGH );
if ( millis() >= t + 30000 ) {
if ( RELE4 == HIGH )
RELE4 = LOW;
else
RELE4 = HIGH;
digitalWrite(9, RELE4);
// Guardamos el tiempo de nuevo para comprobar en las siguientes
// pasadas.
t = millis();
}
if ( millis() >= t + 45000 ) {
if ( RELE3 == HIGH )
RELE3 = LOW;
else
RELE3 = HIGH;
digitalWrite(8, RELE3);
// Guardamos el tiempo de nuevo para comprobar en las siguientes
// pasadas.
t = millis();
}
}
Gracias!!!! ahora me fijo lo de las llaves....
El rele 1 acciona según Temperatura
El rele 2 acciona según humedad.
Estos dos funcionan bien!
El rele 3 necesito que accione cada 12hs
y el rele 4 cada 10 min...
No me aparece ninguna linea a la izquierda cuando apreto ctrl+T....
if ( RELE4 == HIGH )
RELE4 = LOW;
else
RELE4 = HIGH;
no vaz a tener resultado ya que cuando comparas RELE4 == HIGH no tiene resultado ya que RELE4 no tiene la condicion de HIGH o LOW. Para poder comparar si el RELE3 y RELE4 tienes que guardar la condicion en una variable que indique la condicion de 0 o 1. Adjunto tu sketch modificado usando las variables de flag_rly3 y flag_rly4 para guardar la condicion del relay 3 y 4. Tratalo parar ver si el relay 3 y 4 te trabaja. Posiblemente hay una mejor forma de hacerlo pero ver si es el problema en la forma de comparar usando el RELE4 para ver la condicion HIGH o LOW.
//Libraries
#include <DHT.h>;
//I2C LCD:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
//Constants
#define DHTPIN 4 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
unsigned long t;
//Variables
//int chk;
float hum; //Stores humidity value
float temp; //Stores temperature value
int RELE1 = 2; //Relé que controla temp
int RELE2 = 7; //Relé que controla humedad
int RELE3 = 8; //Relé que controla luz
int RELE4 = 9; //Relé que controla ventilador
byte flag_rly3;
byte flag_rly4;
//*********************************************************
void setup()
{
Serial.begin(9600);
Serial.println("ppdo's Temp and Humidity Sensor Test");
dht.begin();
lcd.init(); //initialize the lcd
lcd.backlight(); //open the backlight
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
pinMode(RELE3, OUTPUT);
pinMode(RELE4, OUTPUT);
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, HIGH);
digitalWrite(RELE3, HIGH); flag_rly3 = 1;
digitalWrite(RELE4, HIGH); flag_rly4 = 1;
Serial.begin(9600);
t = millis();
}
void loop()
{
//Read data and store it to variables hum and temp
// Reading temperature or humidity takes about 250 milliseconds!
{ hum = dht.readHumidity();
temp = dht.readTemperature();
//Print temp and humidity values to serial monitor
Serial.print("Humidity: ");
Serial.print(hum);
Serial.print(" %, Temp: ");
Serial.print(temp);
Serial.println(" Celsius");
// set the cursor to (0,0):
lcd.setCursor(0, 0);
// print from 0 to 9:
lcd.print("Temp: ");
lcd.print(temp);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(hum);
lcd.print(" %");
delay(2000); //Delay 30 sec.
}
if (temp < 19 + 1)
digitalWrite(RELE1, LOW);
if (temp > 18 + 1)
digitalWrite(RELE1, HIGH);
if (hum < 80 + 1)
digitalWrite(RELE2, LOW);
if (hum > 80 + 1)
digitalWrite(RELE2, HIGH );
{ if ( millis() >= t + 30000 ) {
if ( flag_rly4 == 1 )
flag_rly4 = LOW;
else
flag_rly4 = 1;
digitalWrite(RELE4, HIGH);
// Guardamos el tiempo de nuevo para comprobar en las siguientes
// pasadas.
t = millis();
}
}
{ if ( millis() >= t + 45000 ) {
if ( flag_rly3 == 1 )
flag_rly3 = 0;
else
digitalWrite(RELE3, HIGH );
// Guardamos el tiempo de nuevo para comprobar en las siguientes
// pasadas.
t = millis();
}
}
}
Muchas Gracias tauro0221
no pasó nada...
puede ser por que al rele 3 y 4 les asigno la misma variable? por que cuando bajo la cantidad de tiempo a uno de ellos... el de menor tiempo acciona y el de mayor tiempo no...
ayy no se..jajaja gracias por tu ayuda!!!!
Usas la misma variable de comparación para todos los relés.
Obviamente se ejecutan los t mas rápidos porque eso el mas lento de 45000 mseg no se ejecuta.
Crea variables t1, t2....tn para cada caso.
if ( millis() >= t4 + 30000 ) {
if ( RELE4 == HIGH )
RELE4 = LOW;
else
RELE4 = HIGH;
digitalWrite(9, RELE4);
// Guardamos el tiempo de nuevo para comprobar en las siguientes
// pasadas.
t4 = millis();
}
if ( millis() >= t3 + 45000 ) {
if ( RELE3 == HIGH )
RELE3 = LOW;
else
RELE3 = HIGH;
digitalWrite(8, RELE3);
// Guardamos el tiempo de nuevo para comprobar en las siguientes
// pasadas.
t3 = millis();
}
asocié los t a los relés involucrados.
Ajusta las variables globales correspondientes.