[SOLUCIONADO] Encender Rele a una hora determinada y apagarlo a otra


hola buenas, leido varios temas parecidos por el foro y usado sus ejemplos y nada me ha podido ayudar, soy nuevo en este mundillo (interesantisimo por cierto) bueno lo que voy, como rtc estoy usando un ds3231 y con el quiero que mi arduino uno lleve el control del tiempo para poder encender el rele ( es una chorrada es para poner en marcha el filtro de la piscina de nivel que tengo en la terraza, pero por algo se empieza) agradeceria cualquier tipo de ayuda, ha sido un drama para mi lograr poner en hora el rtc, copiado como hacia la gente los if y nada, el relel lo probe y va osea que descarto que sea el rele, os dejo una copia del codigo que estoy usando, es un test con un lcd 16x2 que tengo por auqi y un dht22 pero que prescendire de todos los extras y dejare el ds3231 y el rele.





gracias!


code: [select]
#include <time.h>
#include <wire.h>
#include <hd44780.h>
#include <hd44780_i2cexp.h>
#include <hd44780_i2clcd.h>
#include <hd44780_pinio.h>
#include <ds3231.h>
#include "cactus_io_dht22.h"

#define dht22_pin 2
dht22 dht (dht22_pin);

// init ds3231 using hardware interface
ds3231  rtc(sda, scl);
time_t   b;
time t;    //inicia la estructura tiempo/fecha
const int rele = 8 ;


hd44780_i2cexp lcd; // declare lcd object: auto locate & config exapander chip

// lcd geometry
const int lcd_rows = 2;
const int lcd_cols = 16;



void setup()
{


// pinmode(rele,  output) ;
  // setup serial connection
  serial.begin(115200);
  // uncomment next line if using arduino leonardo
  //while (!serial) {}
// initialize lcd number of columns , rows:
  if( lcd.begin(lcd_cols, lcd_rows))

 // se inicial la interfaz i2c
  wire.begin();
  // iniciamos el reloj
  rtc.begin();
  // iniciamos el termometro dht22
  dht.begin();

 rtc.settime ( 12,  59,  30);  //descomentar para fijar hora
 rtc.setdate (8, 13, 2016); //descomentar para fijar fecha formato fecha americana


}

void loop()
{
  
  dht.readhumidity ();
  dht.readtemperature();
    if (isnan(dht.humidity) || isnan(dht.temperature_c)) {
serial.println("dht sensor read failure!");
return;
    }
  // recibir datos del ds3231
 t = rtc.gettime();
  // send current temperature
  serial.print ("\t    ");
  serial.print("fecha: \t");  
  serial.print (rtc.getdatestr() );
  serial.print ("\t    ");
  serial.print ("\t    ");
  serial.print ("hora: \t");
  serial.println (rtc.gettimestr() );
  serial.print ("\t    ");
  serial.print ("\t    ");
  serial.print("temperatura: \t");
  serial.print(dht.temperature_c);
  serial.println(" c");
  serial.print ("\t    ");
  serial.print ("\t    ");
  serial.print ("humedad: \t");
  serial.print(dht.humidity);
  serial.print ("\t    ");
  serial.println ("");
  //delay (900);

 lcd.setcursor(0, 0);
 lcd.print ("humedad: ");
 lcd.print (dht.humidity);
 lcd.print ("%");
 lcd.print (" sensa. term.: ");
 lcd.print (dht.computeheatindex_c());
 lcd.print (" c");

lcd.scrolldisplayleft();
 
lcd.setcursor (0, 1);


lcd.print ("temperatura: ");
lcd.print (dht.temperature_c);
lcd.print (" c "  );
lcd.print ("hora: ");
lcd.print (rtc.gettimestr());
lcd.scrolldisplayleft();
delay (400);

//control de las luces segun la hora:
//
//void luces()


if( t.hour == 13 && t.min == 00 && t.sec == 00)
{
digitalwrite (rele, high);
}

if( t.hour == 13 && t.min == 02 && t.sec == 00)
{
digitalwrite (rele, low);
}






/*
digitalwrite (rele, high);
delay (2000);

digitalwrite (rele, low);

delay (2000);
*/


}





pd.


se que esas lineas hara sangrar muchos ojos experimentados, pero bueno ya lo ire puliendo!


muchas gracias!



pd.2. aqui estan las librerias que utilice.



muchas gracias todos por vuestra ayuda combinando vuestros posts me ha quedado genial! gracias de nuevo

así por encima, creo que tienes un problema en la condición if.
creo que es demasiado exacta, es decir tu pides una acción en  t.hour == 13 && t.min == 02 && t.sec == 00
es es un segundo exacto de tiempo de esa hora y ¿que pasa si en ese momento justo el arduino está haciendo otra cosa?, pues que el momento de la condición habrá pasado y no hará nada.
tienes muchos print y un delay de 400 y eso se lleva quizás ese segundo critico

seamos mas flexibles

prueba algo que yo usé una vez (con otra librería)

   if (now.hour() == 22 && now.minute() == 0 && (now.second() >= 21 && now.second() <= 26))

pobre arduino, dale un margen para que respire


Arduino Forum > International > Español > Software (Moderators: surbyte, Hector_A) > [SOLUCIONADO] Encender Rele a una hora determinada y apagarlo a otra


arduino

Comments

Popular posts from this blog

Help with Missing Filename Error?

more info - Joomla! Forum - community, help and support

Using phone battery to power a plane.