Controlar 8 reles con arduino

Se que mas de uno se va a reír, ante todo decir que es lo primero que intento con arduino, llevo varias semanas intentando controlar 8 reles, con horarios distintos con arduino y la verdad es que no me aclaro. he cogido de aquí y de allí, pero no me aclaro. al final lo mejor que he logrado es el código que ahora voy a pegar, pero aunque cuando le doy a verificar no me sale error, no funcionan, o mejor dicho se quedan todos los reles activados, ayuda por favor.

El código es el siguiente:

#include <TimeAlarms.h>

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;

String daysOfTheWeek[7] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" };
String monthsNames[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo",  "Junio", "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre" };
 
void setup() {
   Serial.begin(9600);
   delay(1000); 
 
   if (!rtc.begin()) {
      Serial.println(F("Couldn't find RTC"));
      while (1);
   }
 
   // Si se ha perdido la corriente, fijar fecha y hora
   if (rtc.lostPower()) {
      // Fijar a fecha y hora de compilacion
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      
      // Fijar a fecha y hora específica. En el ejemplo, 21 de Enero de 2016 a las 03:00:00
      // rtc.adjust(DateTime(2016, 1, 21, 3, 0, 0));
   }
    // Configurar los pines de salida de relevadores desactivados al inicio
  // recordamos que los modulos de reles se activan con un estado bajo
  pinMode(OUTPUT, 6);
  digitalWrite(HIGH, 6);
  pinMode(OUTPUT, 7);
  digitalWrite(HIGH, 7);
  pinMode(OUTPUT, 8);
  digitalWrite(HIGH, 8);
  pinMode(OUTPUT, 9);
  digitalWrite(HIGH, 9);
  pinMode(OUTPUT, 10);
  digitalWrite(HIGH, 10);
  pinMode(OUTPUT, 11);
  digitalWrite(HIGH, 11);
  pinMode(OUTPUT, 12);
  digitalWrite(HIGH, 12);
  pinMode(OUTPUT, 13);
  digitalWrite(HIGH, 13);
// Crear las alarmas y configurar las funciones correspondientes a cada una
  Alarm.alarmRepeat(12, 0, 0, EventoEnciendeLuz1);  // Evento a las 12:00 diario (enciende luz1)
  Alarm.alarmRepeat(19, 0, 0, EventoApagaLuz1);  // Evento a las 7:05 diario (apaga luz1)
  Alarm.alarmRepeat(13, 0, 0, EventoEnciendeLuz2);  // Evento a las 13:00 diario (enciende luz2)
  Alarm.alarmRepeat(20, 0, 0, EventoApagaLuz2);  // Evento a las 20:00 diario (apaga luz2)
  Alarm.alarmRepeat(14, 0, 0, EventoEnciendeLuz3);  // Evento a las 14:00 diario (enciende luz3)
  Alarm.alarmRepeat(21, 0, 0, EventoApagaLuz3);  // Evento a las 21:00 diario (apaga luz3)
  Alarm.alarmRepeat(15, 0, 0, EventoEnciendeLuz4);  // Evento a las 15:00 diario (enciende luz4)
  Alarm.alarmRepeat(22, 0, 0, EventoApagaLuz4);  // Evento a las 22:00 diario (apaga luz4)
  Alarm.alarmRepeat(16, 0, 0, EventoEnciendeLuz5);  // Evento a las 16:00 diario (enciende luz5)
  Alarm.alarmRepeat(23, 0, 0, EventoApagaLuz5);  // Evento a las 23:00 diario (apaga luz5)
  Alarm.alarmRepeat(12, 0, 0, EventoEnciendeLuz6);  // Evento a las 12:00 diario (enciende luz6)
  Alarm.alarmRepeat(23, 0, 0, EventoApagaLuz6);  // Evento a las 23:00 diario (apaga luz6)
  Alarm.alarmRepeat(23, 0, 0, EventoEnciendeLuz7);  // Evento a las 23:00 diario (enciende luz7)
  Alarm.alarmRepeat(12, 0, 0, EventoApagaLuz7);  // Evento a las 12:00 diario (apaga luz7)
  Alarm.alarmRepeat(12, 0, 0, EventoEnciendeLuz8);  // Evento a las 12:00 diario (enciende luz8)
  Alarm.alarmRepeat(23, 0, 0, EventoApagaLuz8);  // Evento a las 23:00 diario (apaga luz8)

}
 
void printDate(DateTime date)
{
   Serial.print(date.year(), DEC);
   Serial.print('/');
   Serial.print(date.month(), DEC);
   Serial.print('/');
   Serial.print(date.day(), DEC);
   Serial.print(" (");
   Serial.print(daysOfTheWeek[date.dayOfTheWeek()]);
   Serial.print(") ");
   Serial.print(date.hour(), DEC);
   Serial.print(':');
   Serial.print(date.minute(), DEC);
   Serial.print(':');
   Serial.print(date.second(), DEC);
   Serial.println();
}
 
void loop() {
   // Obtener fecha actual y mostrar por Serial
   DateTime now = rtc.now();
   printDate(now);
     Serial.println();
    delay(1000);
  // Esperar 1 segundo y procesar las Alarmas mientras tanto...
  // El metodo Alarm.delay() procesa en el fondo las alarmas y llamara a las funciones indicadas
  Alarm.delay(1000);
}

/**
  Funcion callback que activa el relevador en el pin 1 (enciende la luz)
*/
void EventoEnciendeLuz1()
{
  Serial.println("Encendiendo Luz1!!!");
  digitalWrite(LOW, 6);
}

/**
  Funcion callback que desactiva el relevador en el pin 1 (apaga la luz)
*/
void EventoApagaLuz1()
{
  Serial.println("Apagando Luz1!!!");
  digitalWrite(HIGH, 6);
}

/**
  Funcion callback que activa el relevador en el pin 2 (enciende la luz)
*/
void EventoEnciendeLuz2()
{
  Serial.println("Encendiendo Luz2!!!");
  digitalWrite(LOW, 7);
}

/**
  Funcion callback que desactiva el relevador en el pin 2 (apaga la luz)
*/
void EventoApagaLuz2()
{
  Serial.println("Apagando Luz2!!!");
 digitalWrite(HIGH, 7);
}

/**
  Funcion callback que activa el relevador en el pin 3 (enciende la luz)
*/
void EventoEnciendeLuz3()
{
 Serial.println("Encendiendo Luz3!!!");
 digitalWrite(LOW, 8);
}

/**
  Funcion callback que desactiva el relevador en el pin 3 (apaga la luz)
*/
void EventoApagaLuz3()
{
 Serial.println("Apagando Luz3!!!");
 digitalWrite(HIGH, 8);
}

/**
  Funcion callback que activa el relevador en el pin 4 (enciende la luz)
*/
void EventoEnciendeLuz4()
{
 Serial.println("Encendiendo Luz4!!!");
 digitalWrite(LOW, 9);
}

/**
  Funcion callback que desactiva el relevador en el pin 4 (apaga la luz)
*/
void EventoApagaLuz4()
{
 Serial.println("Apagando Luz4!!!");
 digitalWrite(HIGH, 9);
}

/**
  Funcion callback que activa el relevador en el pin 5 (enciende la luz)
*/
void EventoEnciendeLuz5()
{
 Serial.println("Encendiendo Luz5!!!");
 digitalWrite(LOW, 10);
}

/**
  Funcion callback que desactiva el relevador en el pin 5 (apaga la luz)
*/
void EventoApagaLuz5()
{
 Serial.println("Apagando Luz5!!!");
 digitalWrite(HIGH, 10);
}

/**
  Funcion callback que activa el relevador en el pin 6 (enciende la luz)
*/
void EventoEnciendeLuz6()
{
 Serial.println("Encendiendo Luz6!!!");
 digitalWrite(LOW, 11);
}

/**
  Funcion callback que desactiva el relevador en el pin 6 (apaga la luz)
*/
void EventoApagaLuz6()
{
 Serial.println("Apagando Luz6!!!");
 digitalWrite(HIGH, 11);
}

/**
  Funcion callback que activa el relevador en el pin 7 (enciende la luz)
*/
void EventoEnciendeLuz7()
{
 Serial.println("Encendiendo Luz7!!!");
 digitalWrite(LOW, 12);
}

/**
  Funcion callback que desactiva el relevador en el pin 7 (apaga la luz)
*/
void EventoApagaLuz7()
{
 Serial.println("Apagando Luz7!!!");
 digitalWrite(HIGH, 12);
}

/**
  Funcion callback que activa el relevador en el pin 8 (enciende la luz)
*/
void EventoEnciendeLuz8()
{
 Serial.println("Encendiendo Luz8!!!");
 digitalWrite(LOW, 13);
}

/**
  Funcion callback que desactiva el relevador en el pin 8 (apaga la luz)
*/
void EventoApagaLuz8()
{
 Serial.println("Apagando Luz8!!!");
 digitalWrite(HIGH, 13);
}

Te has despistado y has intercambiado los parámetros en todas las llamadas a pinMode() y digitalWrite(). El primer parámetro ha de ser el pin. En lugar de:

  pinMode(OUTPUT, 6);
  digitalWrite(HIGH, 6);

Has de poner:

  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);

... y así con todos.

Ok, gracias me pongo a ello.

Me he dado cuenta que en el "void loop" creo que tambien lo he puesto mal:

 Serial.println("Apagando Luz1!!!");
 digitalWrite(HIGH, 6);

¿debería de ser?

 Serial.println("Apagando Luz1!!!");
 digitalWrite(6, HIGH);

Bueno lo he probado cambiando solo la parte que me comentastes y también cambiando la parte que puse en el post anterior. en ambos casos sigue igual se encienden todos los reles cuando el número 11 debería estar apagado.
Aquí os pongo las lineas que salen en el monitor,a ver que me podeis decir.

2017/8/8 (Martes) 19:18:52

2017/8/8 (Martes) 19:18:54

2017/8/8 (Martes) 19:18:56

2017/8/8 (Martes) 19:18:58

2017/8/8 (Martes) 19:19:0

2017/8/8 (Martes) 19:19:2

2017/8/8 (Martes) 19:19:4

2017/8/8 (Martes) 19:19:6

2017/8/8 (Martes) 19:19:8

2017/8/8 (Martes) 19:19:10

2017/8/8 (Martes) 19:19:12

2017/8/8 (Martes) 19:19:14

2017/8/8 (Martes) 19:19:16

Te has despistado y has intercambiado los parámetros en TODAS las llamadas a pinMode() y digitalWrite(). Y cuando digo todas, digo todas. Revisa todas. Las que te indiqué eran a modo de ejemplo. :wink:

Si, quizas no me esplique bien, he cambiado en todos desde el 6 al 13, me referí que en la parte de voice loop, también vi como estaban en orden inverso, y probe cambiando esa parte también, el resultado es este, cambiando lo que tú me dijiste y también lo del vooid loop.

#include <TimeAlarms.h>

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc;

String daysOfTheWeek[7] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" };
String monthsNames[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo",  "Junio", "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre" };
 
void setup() {
   Serial.begin(9600);
   delay(1000); 
 
   if (!rtc.begin()) {
      Serial.println(F("Couldn't find RTC"));
      while (1);
   }
 
   // Si se ha perdido la corriente, fijar fecha y hora
   if (rtc.lostPower()) {
      // Fijar a fecha y hora de compilacion
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      
      // Fijar a fecha y hora específica. En el ejemplo, 21 de Enero de 2016 a las 03:00:00
      // rtc.adjust(DateTime(2016, 1, 21, 3, 0, 0));
   }
    // Configurar los pines de salida de relevadores desactivados al inicio
  // recordamos que los modulos de reles se activan con un estado bajo
  pinMode(6, OUTPUT);
  digitalWrite(6, HIGH);
  pinMode(7, OUTPUT);
  digitalWrite(7, HIGH);
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH);
  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  pinMode(11, OUTPUT);
  digitalWrite(11, HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(12, HIGH);
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
// Crear las alarmas y configurar las funciones correspondientes a cada una
  Alarm.alarmRepeat(12, 0, 0, EventoEnciendeLuz1);  // Evento a las 12:00 diario (enciende luz1)
  Alarm.alarmRepeat(19, 0, 0, EventoApagaLuz1);  // Evento a las 7:05 diario (apaga luz1)
  Alarm.alarmRepeat(13, 0, 0, EventoEnciendeLuz2);  // Evento a las 13:00 diario (enciende luz2)
  Alarm.alarmRepeat(20, 0, 0, EventoApagaLuz2);  // Evento a las 20:00 diario (apaga luz2)
  Alarm.alarmRepeat(14, 0, 0, EventoEnciendeLuz3);  // Evento a las 14:00 diario (enciende luz3)
  Alarm.alarmRepeat(21, 0, 0, EventoApagaLuz3);  // Evento a las 21:00 diario (apaga luz3)
  Alarm.alarmRepeat(15, 0, 0, EventoEnciendeLuz4);  // Evento a las 15:00 diario (enciende luz4)
  Alarm.alarmRepeat(22, 0, 0, EventoApagaLuz4);  // Evento a las 22:00 diario (apaga luz4)
  Alarm.alarmRepeat(16, 0, 0, EventoEnciendeLuz5);  // Evento a las 16:00 diario (enciende luz5)
  Alarm.alarmRepeat(23, 0, 0, EventoApagaLuz5);  // Evento a las 23:00 diario (apaga luz5)
  Alarm.alarmRepeat(12, 0, 0, EventoEnciendeLuz6);  // Evento a las 12:00 diario (enciende luz6)
  Alarm.alarmRepeat(23, 0, 0, EventoApagaLuz6);  // Evento a las 23:00 diario (apaga luz6)
  Alarm.alarmRepeat(23, 0, 0, EventoEnciendeLuz7);  // Evento a las 23:00 diario (enciende luz7)
  Alarm.alarmRepeat(12, 0, 0, EventoApagaLuz7);  // Evento a las 12:00 diario (apaga luz7)
  Alarm.alarmRepeat(12, 0, 0, EventoEnciendeLuz8);  // Evento a las 12:00 diario (enciende luz8)
  Alarm.alarmRepeat(23, 0, 0, EventoApagaLuz8);  // Evento a las 23:00 diario (apaga luz8)

}
 
void printDate(DateTime date)
{
   Serial.print(date.year(), DEC);
   Serial.print('/');
   Serial.print(date.month(), DEC);
   Serial.print('/');
   Serial.print(date.day(), DEC);
   Serial.print(" (");
   Serial.print(daysOfTheWeek[date.dayOfTheWeek()]);
   Serial.print(") ");
   Serial.print(date.hour(), DEC);
   Serial.print(':');
   Serial.print(date.minute(), DEC);
   Serial.print(':');
   Serial.print(date.second(), DEC);
   Serial.println();
}
 
void loop() {
   // Obtener fecha actual y mostrar por Serial
   DateTime now = rtc.now();
   printDate(now);
     Serial.println();
    delay(1000);
  // Esperar 1 segundo y procesar las Alarmas mientras tanto...
  // El metodo Alarm.delay() procesa en el fondo las alarmas y llamara a las funciones indicadas
  Alarm.delay(1000);
}

/**
  Funcion callback que activa el relevador en el pin 1 (enciende la luz)
*/
void EventoEnciendeLuz1()
{
  Serial.println("Encendiendo Luz1!!!");
  digitalWrite(6, LOW);
}

/**
  Funcion callback que desactiva el relevador en el pin 1 (apaga la luz)
*/
void EventoApagaLuz1()
{
  Serial.println("Apagando Luz1!!!");
  digitalWrite(6, HIGH);
}

/**
  Funcion callback que activa el relevador en el pin 2 (enciende la luz)
*/
void EventoEnciendeLuz2()
{
  Serial.println("Encendiendo Luz2!!!");
  digitalWrite(7, LOW);
}

/**
  Funcion callback que desactiva el relevador en el pin 2 (apaga la luz)
*/
void EventoApagaLuz2()
{
  Serial.println("Apagando Luz2!!!");
 digitalWrite(7,HIGH);
}

/**
  Funcion callback que activa el relevador en el pin 3 (enciende la luz)
*/
void EventoEnciendeLuz3()
{
 Serial.println("Encendiendo Luz3!!!");
 digitalWrite(8, LOW);
}

/**
  Funcion callback que desactiva el relevador en el pin 3 (apaga la luz)
*/
void EventoApagaLuz3()
{
 Serial.println("Apagando Luz3!!!");
 digitalWrite(8, HIGH);
}

/**
  Funcion callback que activa el relevador en el pin 4 (enciende la luz)
*/
void EventoEnciendeLuz4()
{
 Serial.println("Encendiendo Luz4!!!");
 digitalWrite(9, LOW);
}

/**
  Funcion callback que desactiva el relevador en el pin 4 (apaga la luz)
*/
void EventoApagaLuz4()
{
 Serial.println("Apagando Luz4!!!");
 digitalWrite(9, HIGH);
}

/**
  Funcion callback que activa el relevador en el pin 5 (enciende la luz)
*/
void EventoEnciendeLuz5()
{
 Serial.println("Encendiendo Luz5!!!");
 digitalWrite(10, LOW);
}

/**
  Funcion callback que desactiva el relevador en el pin 5 (apaga la luz)
*/
void EventoApagaLuz5()
{
 Serial.println("Apagando Luz5!!!");
 digitalWrite(10, HIGH);
}

/**
  Funcion callback que activa el relevador en el pin 6 (enciende la luz)
*/
void EventoEnciendeLuz6()
{
 Serial.println("Encendiendo Luz6!!!");
 digitalWrite(11, LOW);
}

/**
  Funcion callback que desactiva el relevador en el pin 6 (apaga la luz)
*/
void EventoApagaLuz6()
{
 Serial.println("Apagando Luz6!!!");
 digitalWrite(11, HIGH);
}

/**
  Funcion callback que activa el relevador en el pin 7 (enciende la luz)
*/
void EventoEnciendeLuz7()
{
 Serial.println("Encendiendo Luz7!!!");
 digitalWrite(12, LOW);
}

/**
  Funcion callback que desactiva el relevador en el pin 7 (apaga la luz)
*/
void EventoApagaLuz7()
{
 Serial.println("Apagando Luz7!!!");
 digitalWrite(12, HIGH);
}

/**
  Funcion callback que activa el relevador en el pin 8 (enciende la luz)
*/
void EventoEnciendeLuz8()
{
 Serial.println("Encendiendo Luz8!!!");
 digitalWrite(13, LOW);
}

/**
  Funcion callback que desactiva el relevador en el pin 8 (apaga la luz)
*/
void EventoApagaLuz8()
{
 Serial.println("Apagando Luz8!!!");
 digitalWrite(13, HIGH);
}

aun así el resultado es el mismo, todos los reles encendidos.

Hola,
¿Puedes poner un enlace o la libreria <TimeAlarms.h>? Creo que tu problema esta en las alarmas, ya que nunca te muestra por el puerto serie las impresiones que tienes en los metodos que som llamados por las alarmas, por lo que creo que las alarmas nunca son disparadas.

Bueno, adelantandome a tu respuesta he encontrado esta libreria ¿ es la que usas?.
Si es esta te falta inicializar el reloj de la libreria ya que me da la sensación que es independiente.
En su ejemplo.

setTime(8,29,0,1,1,11); // set time to Saturday 8:29:00am Jan 1 2011

pedro68, ¿cómo ha de estar la salida del Arduino para que se enciendan los relé? ¿A nivel alto (HIGH) o a nivel bajo (LOW)? Porque depende de los relés para que funcione de una manera u otra. Y tal como tienes el código parece que en tu caso se supone que se encienden con un nivel bajo (LOW). ¿Me confirmas que esto es así?

Si se usa TimeAlarm nunca usar delay(1000) y luego un Alarm.delay(1000);
El primero no puede usarse en un código con esta librería.

disculpar que no haya contestado antes, he tenido que salir de viaje unos días y hasta el miércoles no regresó a casa, así que no podré comprobar lo que me indicáis, cuando lo haga os cuento el resultado. Empezaré por cambiar la librería. Ya os contaré

Yo uso TimeAlarm y se que funciona perfecto pero no puedes usar delay()