Temporizador encendido/apagado reles

Hola, estoy iniciando en arduino, entre a este mundo porque estoy queriendo automatizar un invernadero. Ya tengo montado el tema de temperatura y humedad, los eventos que desencadenan cuando sube o bajan estas variable. Ahora estoy queriendo añadir un ds1307 para poder alternar 2 bombas de agua que deben encender y apagar cada 30 minutos, pero que cuando una esta encendida, la segunda este apagada y así sucesivamente. La segunda función es para encender luces a determinado horario y apagarlo a otro horario. Les agradecería alguna compilación.

Gracias

Dos consejos:

  1. No uses DS1307 es muy mal RTC, reemplázalo pr DS3231.
  2. Usa la librería TimeAlarm.h para generar los horarios de alarma que enciendan apaguen tus bombas.

Se puede hacer algo así:

if (minute==00) ¨{ bomba1(HIGH); bomba2(LOW); } if (minute==30) { bomba1(LOW); bomba2(HIGH); }

ya tengo configurado el reloj ds1307 con la librería RTClib.h

Usa TimeAlarm.h, te facilitará las cosas.

este es mi avance, use las librerías time y timealarms pero me sale un error de compilacion, lo pongo al final. AYUDAaaaaaa!!!

#include <Time.h>
#include <TimeAlarms.h>
#include <LiquidCrystal.h> //Llamamos a la libreria para controlar el LCD incluida en el IDE de Arduino
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Definimos los pines asignados al LCD según el esquema de conexión
#include "DHT.h"//Llamamos a la libreria de los sensores DHT instalada previamente
#define DHTPIN 7 
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
int Temp=23;
// Símbolo de grado (º).
byte grau[8] = {
       B11100,
       B10100,
       B11100,
       B00000,
       B00000,
       B00000,
       B00000,
       B00000
};
#include <Wire.h> 
#include "RTClib.h"
RTC_DS1307 RTC;
int bomba1=6;
int bomba2=9;
int calefaccion=13;
int refrigeracion=8;
void setup () {
Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicación con el RTC
//RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora
Serial.begin(9600); // Establece la velocidad de datos del puerto serie
dht.begin();// Inicia o LCD 16x2.
lcd.begin(16, 2);//Iniciamos el sensor
pinMode(calefaccion,OUTPUT);
pinMode(refrigeracion,OUTPUT);
pinMode(bomba1,OUTPUT);
pinMode(bomba2,OUTPUT);
lcd.createChar(3, grau);
Alarm.timerRepeat(900, Repeats);//repite cada 15minutos (60*15)
}
void loop(){
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
float hum = dht.readHumidity();
 float temp = dht.readTemperature();//Establecemos dos variables, una para la temperatura en ºC y otra para la humedad relativa en %
if (isnan(hum) || isnan(temp)) {
   Serial.println("Error al Leer Sensor DHT¡");
   return;//Con la funcion isnan controlamos que el valor recibido del sensor sea un número, sino dara error
 }
Serial.print(now.year(), DEC); // Año
Serial.print('/');
Serial.print(now.month(), DEC); // Mes
Serial.print('/');
Serial.print(now.day(), DEC); // Dia
Serial.print(' ');
Serial.print(now.hour(), DEC); // Horas
Serial.print(':');
Serial.print(now.minute(), DEC); // Minutos
Serial.print(':');
Serial.print(now.second(), DEC); // Segundos
Serial.print("  Humedad: "); 
 Serial.print(hum);
 Serial.print(" %\t");
 Serial.print("Temperatura: "); 
 Serial.print(temp);
 Serial.println(" *C ");
  lcd.begin(16, 2); 
//Indicamos el LCD que usamos: 16 caracteres y 2 lineas
 lcd.setCursor(0,0); 
//Situamos el cursor en la posicion 0 de la primera linea
 lcd.write("T:"); 
 lcd.setCursor(2,0); 
 lcd.print(temp); 
 lcd.write(3);//simbolo de los grados º
 lcd.write("C");
 lcd.setCursor(0,1); 
 lcd.write("H:"); 
 lcd.setCursor(2,1); 
 lcd.print(hum);
 lcd.write("%");
 {
 if (temp >=Temp+3){
   digitalWrite(8,HIGH);
}
else{
digitalWrite(8,LOW);
}
}
{
  if(temp <= Temp-3){
   digitalWrite(calefaccion,HIGH);
 }
else{
   digitalWrite(calefaccion,LOW);
   }
   }
delay(1000); // La información se actualiza cada 1 seg.
}
void Repeats(){
if(digitalRead(bomba1)==HIGH){
 digitalWrite(bomba1,LOW); 
 digitalWrite(bomba2,HIGH);      
}
else{
 digitalWrite(bomba1,HIGH);
 digitalWrite(bomba2,LOW);        
}
}
// FIN

Error que sale en arduino al compilar:

Arduino:1.6.5 (Windows 8.1), Placa:“Arduino Uno”

In file included from invernadero_3_con_hora_tempo.ino:1:0:
C:\Program Files (x86)\Arduino\libraries\Time/Time.h:79:39: error: expected unqualified-id before ‘/’ token
#define dayOfWeek(time) ((( time / SECS_PER_DAY + 4) % DAYS_PER_WEEK)+1) // 1 = Sunday
^
C:\Program Files (x86)\Arduino\libraries\RTClib/RTClib.h:24:13: note: in expansion of macro ‘dayOfWeek’
uint8_t dayOfWeek() const;
^
C:\Program Files (x86)\Arduino\libraries\Time/Time.h:79:39: error: expected ‘)’ before ‘/’ token
#define dayOfWeek(time) ((( time / SECS_PER_DAY + 4) % DAYS_PER_WEEK)+1) // 1 = Sunday
^
C:\Program Files (x86)\Arduino\libraries\RTClib/RTClib.h:24:13: note: in expansion of macro ‘dayOfWeek’
uint8_t dayOfWeek() const;
^
C:\Program Files (x86)\Arduino\libraries\Time/Time.h:79:39: error: expected ‘)’ before ‘/’ token
#define dayOfWeek(time) ((( time / SECS_PER_DAY + 4) % DAYS_PER_WEEK)+1) // 1 = Sunday
^
C:\Program Files (x86)\Arduino\libraries\RTClib/RTClib.h:24:13: note: in expansion of macro ‘dayOfWeek’
uint8_t dayOfWeek() const;
^
C:\Program Files (x86)\Arduino\libraries\Time/Time.h:79:39: error: expected ‘)’ before ‘/’ token
#define dayOfWeek(time) ((( time / SECS_PER_DAY + 4) % DAYS_PER_WEEK)+1) // 1 = Sunday
^
C:\Program Files (x86)\Arduino\libraries\RTClib/RTClib.h:24:13: note: in expansion of macro ‘dayOfWeek’
uint8_t dayOfWeek() const;
^
Error de compilación

This report would have more information with
“Show verbose output during compilation”
activala desde Archivo > Preferencias

Recuerda usar tags please!! para los códigos. Te he enviado un privado para que veas cómo hacerlo.

Creo y no puedo asegurarlo que es tu librería RTClib que es vieja y genera alguna incompatibilidad. Mira esta es la pagina de donde uso TimeAlarm, Time y DS1307RTC Library. Modifica tu código para usarla y resolverás el problema.

Gracia, ahi trate de acomodarlo lo mejor que pude. saludos

Bien, lo hicieste bien, pero los errores tambien se ponen en tags, por ahora deja.. para la próxima ya sabes. Dame un email por privado y te paso un ejemplo mio que usa tu RTC con la librería que te dije hace un momento,la libreria time, la librería TimeAlarm Pasalo por privado

Hola, ya tengo el codigo para la automatizacion de mi invernadero, seguira evolucionando ya que quiero agregar otro sensor de temperatura ds18b20 y algun otro chiche mas. gracias por la ayuda. Aqui el codigo:

#include <Time.h>
#include <TimeAlarms.h>
#include <LiquidCrystal.h> //Llamamos a la libreria para controlar el LCD incluida en el IDE de Arduino
LiquidCrystal lcd(12, 13, 8, 9, 10, 11); //Definimos los pines asignados al LCD según el esquema de conexión
#include "DHT.h"//Llamamos a la libreria de los sensores DHT instalada previamente
#define DHTPIN 7 
#define DHTTYPE DHT22//Definimos el pin de Arduino al que conectamos el pin de datos del sensor e indicamos el tipo de sensor (DHT22))


DHT dht(DHTPIN, DHTTYPE);
int TempSet=23; // temperatura de seteo ideal
// Símbolo de grado (º).
byte grau[8] = {
        B11100,
        B10100,
        B11100,
        B00000,
        B00000,
        B00000,
        B00000,
        B00000
};

#include <Wire.h> 
#include "RTClib.h"
RTC_DS1307 RTC; // Crea el objeto RTC  

int bomba1=4;
int bomba2=3;
int calefaccion=6;
int refrigeracion=5;
int Estado=digitalRead(bomba1);


void setup () {
Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicación con el RTC
//RTC.adjust(DateTime(13,11,15,23,54,00,5)); // Establece la fecha y hora (Comentar una vez establecida la hora)
Serial.begin(9600); // Establece la velocidad de datos del puerto serie 
dht.begin();//Iniciamos el sensor
lcd.begin(16, 2);// Inicia o LCD 16x2.
pinMode(calefaccion,OUTPUT);
pinMode(refrigeracion,OUTPUT);
pinMode(bomba1,OUTPUT);
pinMode(bomba2,OUTPUT);
digitalWrite(bomba1,HIGH);
lcd.createChar(3, grau);// Crea los íconos.
Alarm.timerRepeat(15,marchabomba);
}

void loop(){
 
  Alarm.delay(1000); 
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
 int hum = dht.readHumidity();
 int temp = dht.readTemperature();
//Establecemos dos variables, una para la temperatura en ºC y otra para la humedad relativa en %

  if (isnan(hum) || isnan(temp)) {
    Serial.println("Error al Leer Sensor DHT¡");
    return;
//Con la funcion isnan controlamos que el valor recibido del sensor sea un número, sino dara error
  }
Serial.print(now.day(), DEC); // Dia
Serial.print('/');
Serial.print(now.month(), DEC); // Mes
Serial.print('/');
Serial.print(now.year(), DEC); // Año
Serial.print(' ');
Serial.print(now.hour(), DEC); // Horas
Serial.print(':');
Serial.print(now.minute(), DEC); // Minutos
Serial.print(':');
Serial.print(now.second(), DEC); // segundos
Serial.print("  H: "); 
  Serial.print(hum);
  Serial.print(" %");
  Serial.print("   T1: "); 
  Serial.print(temp);
  Serial.println(" *C ");
 
  lcd.begin(16, 2); 
//Indicamos el LCD que usamos: 16 caracteres y 2 lineas
  lcd.setCursor(0,0); 
//Situamos el cursor en la posicion 0 de la primera linea
  lcd.write("T1:"); 
  lcd.setCursor(3,0); 
  lcd.print(temp); 
  lcd.write(3);//simbolo de los grados º
  lcd.write("C ");
  lcd.write("T2:");
  lcd.setCursor(0,1); 
  lcd.write("H:"); 
  lcd.setCursor(2,1); 
  lcd.print(hum);
  lcd.write("% ");
  lcd.print(now.hour(), DEC);
  lcd.write(":");
  lcd.print(now.minute(), DEC);
  lcd.write("hs");
  delay(1000);
  
  if (temp >=TempSet+3){
    digitalWrite(refrigeracion,HIGH);
 }
 else{
 digitalWrite(refrigeracion,LOW);
 }
 

   if(temp <= TempSet-3){
    digitalWrite(calefaccion,HIGH);
  }
 else{
    digitalWrite(calefaccion,LOW);
    }
       

}
void marchabomba(){
   if(digitalRead(bomba1)==0){
    digitalWrite(bomba1,HIGH);
    digitalWrite(bomba2,LOW);
  }
 else{
    digitalWrite(bomba1,LOW);
    digitalWrite(bomba2,HIGH);
    }
    }

Saludos

te planteo algunas modificaciones y dudas que planteo en tu código. 1. no veo para que usas Alarm.delay(1000) al comienzo del loop y al final usas delay(1000) 2. Retiré el lcd.begin(16,2) porque debes usarlo en el setup solamente. 3. Te simplifique toda la parte de impresión en lcd usando sprintf. Si hay errores lo corriges con espacios. Su uso con %02d asegura que tu presentación no se desplazará y no te quedarán caracteres para borrar luego. 4. comenté esto int Estado=digitalRead(bomba1); porque no es válido según creo. 5. para terminar no veo que ajustes el reloj y que se disparé en algun horario predeterminado o te falta incluir parte de código?