Icono del sitio ELECTROALL

PLC with ARDUINO (Atmega2560) V5

YouTube
YouTube
Instagram
Instagram
GitHub
GitHub

Ya pasaron aproximadamente 6 meses desde que publicamos el PCL V4 con atmega 328p, lo cual solo tenía una cantidad limitada de entradas digitales y analógicas. Además, solo se tenia salidas con relés. Por otro lado, la cantidad de memoria era muy bajo y no tenía muchos periféricos de comunicación. Y adivinen que; para esta versión usaremos el atmega2560 que usualmente lo vemos en las placas de arduino mega, gracias a este microcontrolador tendremos hasta 24 entradas digitales, 8 entradas analógicas, 8 salidas a reles, 8 salidas a transistores IGBT’s, un puerto de comunicación serial, un puerto de ethernet para el protocolo modbus, un reloj de tiempo real, 8 bits de configuración con dipswitch, 4 comunicaciones seriales mas una comunicación ISP,  también contaremos con la comunicación I2C y finalmente la programación se realizará de manera directa ordenar plc V5.

ESPECIFICACIONES TÉCNICAS
  1. Tensión de alimentación……………………….…………24VDC
  2. Corriente de alimentación………………….……………200mA
  3. Tensión de salida……………………………………………………10VDC
  4. Corriente de salida…………………………………………………1A
  5. Entadas digitales 12-24VDC……………………….……24
  6. Entradas analógicas 0-5V………………………………..4
  7. Entradas analógicas 0-10V……………………………..4
  8. Salidas RLY…………………………………………………………8
    • Tensión AC…………..……….………………….….……250V
    • Corriente AC…………………………………………….5A
    • Tensión DC………………………………………………30V
    • Corriente DC……………………………………………5A
  9. Salidas trasistores IGBT’s
    • Tensión DC………………………………………………30V
    • Corriente DC……………………………………………5A
  10. Puerto de comunicación serial……………………………4
  11. Comunicación ICSP……………………………………………….1
  12. Comunicación I2C…………………………………………………1
  13. Comunicación MODBUS……………………………………..1
  14. Reloj de tiempo real……………………………………………..Sí
  15. Programación Directa………………………………………..Ordenador – PLC V5
  16. Entorno de programación………………………..………..Arduino IDE
  17. Condiciones ambientales min……………………….….-10°
  18. Condiciones ambientales max…………………..……….55°
  19. Dimensiones……………………………………………………….150x170mm
  20.  Empotrable………………………………….……………………Sí
CAMBIOS RESPECTO A LA ANTERIOR VERSIÓN (V4)
  1. INTEGRACIÓN DEL SISTEMA RELOJ DE TIEMPO REAL, Este sistema nos permite obtener la hora y la fecha en tiempo real, puesto que almacena los años, los meses, los días de la semana, la fecha, las horas, los minutos y los segundos, lo cual nos permite realizar instrucciones i/o ordenes que tengas que ver con los valores de tiempo real. Por ejemplo, podemos encender una lampara solo los días viernes a las 6 de la tarde y que se apague el día sábado a las 5 de la mañana. Así mismo el circuito integrado principal es el DS3231SN, básicamente este dispositivo se encarga de proporcionar la fecha y la hora a nuestro microcontrolador, muy aparte de ello este componente esta destinado para trabajar en las industrias.
  2. INTEGRACIÓN DEL PROTOCOLO MODBUS, Si bien es cierto actualmente existen varios tipos de protocolos para poder establecer una determinada comunicación, cada una con una determinada peculiaridad y para un determinado objetivo. En caso de las industrias el protocolo modbus es el que más predomina y me atrevería a decir que es el protocolo estándar por su alta confiabilidad al momento de trabajar dentro de un proceso industrial. Entonces, como nuestra tarjeta esta destinado para trabajar en ambientes industriales es pertinente la integración de este sistema en nuestra tarjeta PLC V5. Por otro lado, cabe mencionar que el circuito integrado principal es el ENC28J60, gracias a este dispositivo podemos enviar y recibir datos desde nuestro microcontrolador ATMEGA2560.
  3. INTEGRACIÓN DEL uC ATMEGA2560, En las anteriores versiones hemos venido usando el uC Atmega328p, este microcontrolador es un dispositvo básico y como tal no cuenta con muchas prestaciones ya que solo tiene una cantidad limitado de pines. Además, solo tiene 32kB de memoria flash, 2kB de SRAM y 1kB de EEPROM. Sin embargo, el uC que se está usando en esta versión cuenta con 54 pines digitales (I/O) de las cuales 15 se puede como salida PWM, 16 entradas analógicas, y  4 puertos de comunicación serial. Por otro lado, tiene 256kB de memoria flash, 8kB de SRAM y 4kB de EEPROM.
  4. INTEGRACIÓN DE SALIDAS A TRANSISTORES IGBT´s, inicialmente se ha  integrado estos dispositivos  porque son comúnmente usados en las industrias ya que son la fusión de dos transistores (MOSFET y BJT). El circuito de activación o excitación es como el del transistor MOSFET, y en cuanto a las particularidades de conducción son como las de un transistor BJT. Por lo tanto podemos tener alto aislamiento y ganancia de corriente en solo dispositivo(IGBT).
  5. INCREMENTO DE ENTRADAS DIGITALES, en la versión anterior se tenía 10 entradas digitales de 12 -24V, ahora tenemos 24 entradas digitales de 12 -24V.
  6. INCREMENTO DE ENTRADAS ANALÓGICAS, para esta versión se ha agregado hasta 8 entradas analógicas, de las cuales 4 son de 0 a 5V, y los 4 restantes son de 0 a 10V al igual que las entradas analógicas del PLC siemens.
  7. INCREMENTO DE LAS SALIDAS, en la versión previa solo se contaba con 8 salidas a reles, ahora hemos integrado 8 adicionales, los cuales son a transistores IGBT’s, con esto podremos controlar la velocidad de un motor, controlar la intensidad luminosa, etc. Todo ello gracias al control de modulación por ancho de pulso(PWM).
  8. INTEGRACIÓN DE 8 BITS CON DIPSWITCH, La intención de incorporar este dip switch, es para poder configurar algunas instrucciones o tareas específicas en un determinado momento. Supongamos que nuestra tarjeta se está utilizando en un embalador de cajas, por lo tanto una caja de tamaño A requiere requiere 5 vueltas, y una caja de tamaño B requiere 3 vueltas. entonces cambiando las posiciones del dip podemos hacer que en un momento solo gire 3 vueltas y en otro momento 5 vueltas, y así podemos realizar hasta 255 tareas.
  9. INTEGRACIÓN DE FUENTE DE ALIMENTACION (10V), De repente te suene algo raro la integración de este dispositivo. No obstante, este nos permite el suministro de 10V para las entradas analógicas que son de 0 a 10V.
ESQUEMÁTICO ELECTRÓNICO

DESCARGAR EL DISEÑO EN PROTEUS 8.9 (ayúdame con una donación para comprar materiales)

DISEÑO TARJETA PCB – Ordene ahora en JLCPCB
LISTA DE COMPONENTES
PASOS PARA SUBIR UN PROGRAMA

PASO 1 : SUBIR GESTOR DE ARRANQUE (BOOTLOADER)

Para poder usar un microcontrolador nuevo (atmega2560-16AU), es necesario subir un un gestor de arranque como también llamado “BOOTLOADER”, esto nos facilitará subir programas en futuras ocasiones.

finalmente para quemar el bootloader se tendrá que realizar a través de los pines ICSP, que prácticamente serían los pines [ (MOSI=PIN51) (MISO = PIN50) (SCK=PIN52) (Slave=PIN53) ]. Para subir y quemar el gestor de arranque necesitaremos un arduino UNO ó MEGA y realizar las siguientes conexiones (ARDUINO UNO – PLC V5).

PASO 2 : SUBIR PROGRAMA; PC – PLC V5  

Después de haber subido el gestor de arranque finalmente ya podremos subir cualquier programa como normalmente lo realizamos a través del puerto serie.

RELACIÓN DE BORNERAS EXTERNAS Y ATMEGA2560-16U
PARTES Y CONEXIONES EXTERNAS
CÓDIGOS DE PRUEBA
ENTRADAS DIGITALES
// Digital inputs
const int IN0 = 2;
const int IN1 = 3;
const int IN2 = 4;
const int IN3 = 22;
const int IN4 = 23;
const int IN5 = 24;
const int IN6 = 25;
const int IN7 = 26;
const int IN8 = 27;
const int IN9 = 28;
const int IN10 = 29;
const int IN11 = 30;
const int IN12 = 31;
const int IN13 = 32;
const int IN14 = 33;
const int IN15 = 34;
const int IN16 = 35;
const int IN17 = 36;
const int IN18 = 37;
const int IN19 = 38;
const int IN20 = 39;
const int IN21 = 40;
const int IN22 = 41;
const int IN23 = 42;

//IGBT'S OUTPUTS
int Q0 = 5;
int Q1 = 6;
int Q2 = 7;
int Q3 = 8;
int Q4 = 9;
int Q5 = 10;
int Q6 = 11;
int Q7 = 12;

//RELAY OUTPUTS
int O0 = 13;
int O1 = 43;
int O2 = 44;
int O3 = 45;
int O4 = 46;
int O5 = 47;
int O6 = 48;
int O7 = 49;

void setup() {

  //DIGITAL INPUTS
  pinMode (IN0, INPUT);
  pinMode (IN1, INPUT);
  pinMode (IN2, INPUT);
  pinMode (IN3, INPUT);
  pinMode (IN4, INPUT);
  pinMode (IN5, INPUT);
  pinMode (IN6, INPUT);
  pinMode (IN7, INPUT);
  pinMode (IN8, INPUT);
  pinMode (IN9, INPUT);
  pinMode (IN10, INPUT);
  pinMode (IN11, INPUT);
  pinMode (IN12, INPUT);
  pinMode (IN13, INPUT);
  pinMode (IN14, INPUT);
  pinMode (IN15, INPUT);
  pinMode (IN16, INPUT);
  pinMode (IN17, INPUT);
  pinMode (IN18, INPUT);
  pinMode (IN19, INPUT);
  pinMode (IN20, INPUT);
  pinMode (IN21, INPUT);
  pinMode (IN22, INPUT);
  pinMode (IN23, INPUT);

  //IGBT'S OUTPUTS
  pinMode (Q0, OUTPUT);
  pinMode (Q1, OUTPUT);
  pinMode (Q2, OUTPUT);
  pinMode (Q3, OUTPUT);
  pinMode (Q4, OUTPUT);
  pinMode (Q5, OUTPUT);
  pinMode (Q6, OUTPUT);
  pinMode (Q7, OUTPUT);

  //RELAY OUTPUTS
  pinMode (O0, OUTPUT);
  pinMode (O1, OUTPUT);
  pinMode (O2, OUTPUT);
  pinMode (O3, OUTPUT);
  pinMode (O4, OUTPUT);
  pinMode (O5, OUTPUT);
  pinMode (O6, OUTPUT);
  pinMode (O7, OUTPUT);
}

void loop() {

  if (digitalRead(IN0) == 1)digitalWrite(Q0, 1);
  else digitalWrite(Q0, 0);

  if (digitalRead(IN1) == 1)digitalWrite(Q1, 1);
  else digitalWrite(Q1, 0);

  if (digitalRead(IN2) == 1)digitalWrite(Q2, 1);
  else digitalWrite(Q2, 0);

  if (digitalRead(IN3) == 1)digitalWrite(Q3, 1);
  else digitalWrite(Q3, 0);

  if (digitalRead(IN4) == 1)digitalWrite(Q4, 1);
  else digitalWrite(Q4, 0);

  if (digitalRead(IN5) == 1)digitalWrite(Q5, 1);
  else digitalWrite(Q5, 0);

  if (digitalRead(IN6) == 1)digitalWrite(Q6, 1);
  else digitalWrite(Q6, 0);

  if (digitalRead(IN7) == 1)digitalWrite(Q7, 1);
  else digitalWrite(Q7, 0);

  if (digitalRead(IN8) == 1)digitalWrite(O0, 1);
  else digitalWrite(O0, 0);

  if (digitalRead(IN9) == 1)digitalWrite(O1, 1);
  else digitalWrite(O1, 0);

  if (digitalRead(IN10) == 1)digitalWrite(O2, 1);
  else digitalWrite(O2, 0);

  if (digitalRead(IN11) == 1)digitalWrite(O3, 1);
  else digitalWrite(O3, 0);

  if (digitalRead(IN12) == 1)digitalWrite(O4, 1);
  else digitalWrite(O4, 0);

  if (digitalRead(IN13) == 1)digitalWrite(O5, 1);
  else digitalWrite(O5, 0);

  if (digitalRead(IN14) == 1)digitalWrite(O6, 1);
  else digitalWrite(O6, 0);

  if (digitalRead(IN15) == 1)digitalWrite(O7, 1);
  else digitalWrite(O7, 0);

  if (digitalRead(IN16) == 1)digitalWrite(Q0, 1);
  else digitalWrite(Q0, 0);

  if (digitalRead(IN17) == 1)digitalWrite(Q1, 1);
  else digitalWrite(Q1, 0);

  if (digitalRead(IN18) == 1)digitalWrite(Q2, 1);
  else digitalWrite(Q2, 0);

  if (digitalRead(IN19) == 1)digitalWrite(Q3, 1);
  else digitalWrite(Q3, 0);

  if (digitalRead(IN20) == 1)digitalWrite(Q4, 1);
  else digitalWrite(Q4, 0);

  if (digitalRead(IN21) == 1)digitalWrite(Q5, 1);
  else digitalWrite(Q5, 0);

  if (digitalRead(IN22) == 1)digitalWrite(Q6, 1);
  else digitalWrite(Q6, 0);

  if (digitalRead(IN23) == 1)digitalWrite(Q7, 1);
  else digitalWrite(Q7, 0);

}
CONTADOR CON CONFIG (DIP SWITCH)
//IGBT'S OUTPUTS
int Q0 = 5;

 //DIP SWITCH INPUTS
const int IN24 = 62;
const int IN25 = 63;
const int IN26 = 64;
const int IN27 = 65;
const int IN28 = 66;
const int IN29 = 67;
const int IN30 = 68;
const int IN31 = 69;

const int IN1 = 2;
const int IN2 = 3;
boolean act = false;

int contador            = 0;   // contador para el numero de veces presinados
int estado_pulsador_asc = 0;         // estado actual del pulsador
int lastButtonState_asc = 0;     // estado anterior del pulsador
void setup() {
  //SALIDAS IGBT'S
  pinMode (Q0, OUTPUT);

  Serial.begin(9600);

  //DIP SWITCH INPUTS
  pinMode (IN24, INPUT);
  pinMode (IN25, INPUT);
  pinMode (IN26, INPUT);
  pinMode (IN27, INPUT);
  pinMode (IN28, INPUT);
  pinMode (IN29, INPUT);
  pinMode (IN30, INPUT);
  pinMode (IN31, INPUT);

  pinMode (IN1, INPUT);
  pinMode (IN2, INPUT);

}

void loop() {
  estado_pulsador_asc = digitalRead(IN1);
  if (digitalRead(IN24) == 1) {
    if (estado_pulsador_asc != lastButtonState_asc) {
      // si el estado fue cambiado, incremente el conteo
      if (estado_pulsador_asc == LOW) {
        // si el estado actual es alto, entonces
        // que pase de off a on:
        if(act==true){
        contador++;
        Serial.print("# DE VUELTAS = ");
        Serial.println(contador);
        delay(100);
        }
      }
    }

  lastButtonState_asc  = estado_pulsador_asc;
  if (digitalRead(IN2) == 1) {
   act=true;
  }
  if ((act==true)&& (contador <= 100)) {
    int analog0 = analogRead(A0);
    int v_analog0 = map(analog0, 0, 1023, 0, 255);
    analogWrite(Q0, v_analog0);
  }

  if (contador > 100) {

    analogWrite(Q0, 0);
    contador=0;
    act=false;
  }
  }

}
ENTRADA ANALÓGICA Y SALIDA PWM
//IGBT'S OUTPUTS
int Q0 = 5;
int Q1 = 6;
int Q2 = 7;
int Q3 = 8;
int Q4 = 9;
int Q5 = 10;
int Q6 = 11;
int Q7 = 12;
void setup() {
  //IGBT'S OUTPUTS
  pinMode (Q0, OUTPUT);
  pinMode (Q1, OUTPUT);
  pinMode (Q2, OUTPUT);
  pinMode (Q3, OUTPUT);
  pinMode (Q4, OUTPUT);
  pinMode (Q5, OUTPUT);
  pinMode (Q6, OUTPUT);
  pinMode (Q7, OUTPUT);

}

void loop() {
   //ANALOG INPUT (0 - 5V)
  int analog0 = analogRead(A0);
  int v_analog0 = map(analog0, 0, 1023, 0, 255);
  analogWrite(Q0, v_analog0);

  int analog1 = analogRead(A1);
  int v_analog1 = map(analog1, 0, 1023, 0, 255);
  analogWrite(Q1, v_analog1);

  int analog2 = analogRead(A2);
  int v_analog2 = map(analog2, 0, 1023, 0, 255);
  analogWrite(Q2, v_analog2);

  int analog3 = analogRead(A3);
  int v_analog3 = map(analog3, 0, 1023, 0, 255);
  analogWrite(Q3, v_analog3);

 //ANALOG INPUT (0 - 10V)
  int analog4 = analogRead(A4);
  int v_analog4 = map(analog4, 0, 1023, 0, 255);
  analogWrite(Q4, v_analog4);

  int analog5 = analogRead(A5);
  int v_analog5 = map(analog5, 0, 1023, 0, 255);
  analogWrite(Q5, v_analog5);

  int analog6 = analogRead(A6);
  int v_analog6 = map(analog6, 0, 1023, 0, 255);
  analogWrite(Q6, v_analog6);

  int analog7 = analogRead(A7);
  int v_analog7 = map(analog7, 0, 1023, 0, 255);
  analogWrite(Q7, v_analog7);

}
RELOJ DE TIEMPO REAL
/* 
                CREADO POR      :{==[=======>>>> ELECTROALL <<<<<=======]==}
                INSTAGRAM       : https://www.instagram.com/carlos_j_fuentess/ 
                                  ó  @carlos_j_fuentess
                FACEBOOK        : https://web.facebook.com/ELECTROALL.ELECTRONICA/?_rdc=1&_rdr
                PÁGINA WEB      : https://www.electroallweb.com/
                YOUTUBE         : https://www.youtube.com/c/ELECTROALL
           ________________________________________________________
            {==[=======> (Testing CLOCK REAL TIME ) <=======]==}
           ________________________________________________________
*/

#include <Wire.h>
#include "Sodaq_DS3231.h"
#include <LiquidCrystal_I2C.h> // Debe descargar la Libreria que controla el I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
char DiaSemana[][4] = {"Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab" };
const int alarm = 5 ;
// La linea fija la fecha, hora y dia de la semana, se debe suprimir la linea en la segunda carga
// Ejemplo 2017 diciembre 06, 22:00:00  dia 1-Lunes (0=Dom, 1=Lun, 2=Mar, 3=Mie, 4=Jue, 5=Vie, 6=Sab)
//DateTime dt(2020, 06, 16, 07, 43, 0, 2);
void setup ()
{
  Serial.begin(9600);
  Wire.begin();
  rtc.begin();
  lcd.init();
  lcd.backlight();
  lcd.clear();
  // La linea fija la fecha, hora y dia de la semana, se debe suprimir la linea en la segunda carga
  // rtc.setDateTime(dt);
  pinMode(alarm, OUTPUT);
}
void loop ()
{

  DateTime now = rtc.now();

  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.date(), DEC);
  Serial.print(' ');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.print(' ');
  Serial.print(DiaSemana[now.dayOfWeek()]);
  Serial.println();

  lcd.setCursor(0, 0);
  lcd.print(now.year(), DEC);
  lcd.print('/');
  lcd.print(now.month(), DEC);
  lcd.print('/');
  lcd.print(now.date(), DEC);
  lcd.setCursor(0, 1);
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  lcd.print(now.minute(), DEC);
  lcd.print(':');
  lcd.print(now.second(), DEC);
  lcd.print(' ');
  lcd.print(DiaSemana[now.dayOfWeek()]);
  //delay(1000); // Se actualiza cada segundo
  //lcd.clear();
  //8:15. 8:25 a.m. 9:25 a.m. 10:25 a.m. 10:35 a.m. 11:30  a.m.
  //12:30 p.m. 2:15 p.m. 2:25 p.m. 3:25 p.m. 4:25 p.m. 4:35 p.m. 5.30 p.m. 6.30 p.m.
  if ((now.dayOfWeek()) >= 1 && (now.dayOfWeek() <= 5)) { // MONDAY TO FRIDAY
    //MORNING
    //ALARM ==> 8:15
    if (now.hour() == 7 && now.minute() == 47 && now.second() <= 10) {
      if (now.minute() == 47 && now.second() < 10) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 8:25
    if (now.hour() == 8 && now.minute() == 25 && now.second() <= 4) {
      if (now.minute() == 25 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 9:25
    if (now.hour() == 9 && now.minute() == 25 && now.second() <= 4) {
      if (now.minute() == 25 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 10:25
    if (now.hour() == 10 && now.minute() == 25 && now.second() <= 4) {
      if (now.minute() == 25 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 10:35
    if (now.hour() == 10 && now.minute() == 35 && now.second() <= 4) {
      if (now.minute() == 35 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 11:30
    if (now.hour() == 11 && now.minute() == 30 && now.second() <= 4) {
      if (now.minute() == 30 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    // LATE
    //12:30 p.m. 2:15 p.m. 2:25 p.m. 3:25 p.m. 4:25 p.m. 4:35 p.m. 5.30 p.m. 6.30 p.m.
    //ALARM ==> 12:30
    if (now.hour() == 12 && now.minute() == 30 && now.second() <= 4) {
      if (now.minute() == 30 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 14:15
    if (now.hour() == 14 && now.minute() == 15 && now.second() <= 4) {
      if (now.minute() == 15 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 14:25
    if (now.hour() == 14 && now.minute() == 25 && now.second() <= 4) {
      if (now.minute() == 25 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 15:25
    if (now.hour() == 15 && now.minute() == 25 && now.second() <= 4) {
      if (now.minute() == 25 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 16:25
    if (now.hour() == 16 && now.minute() == 25 && now.second() <= 4) {
      if (now.minute() == 25 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 16:35
    if (now.hour() == 16 && now.minute() == 35 && now.second() <= 4) {
      if (now.minute() == 35 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 17:30
    if (now.hour() == 17 && now.minute() == 30 && now.second() <= 4) {
      if (now.minute() == 30 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 18:30
    if (now.hour() == 18 && now.minute() == 30 && now.second() <= 4) {
      if (now.minute() == 30 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
  }
  if (now.dayOfWeek() == 6) { //SATURDAY
    //MORNING
    //ALARM ==> 8:15
    if (now.hour() == 8 && now.minute() == 15 && now.second() <= 4) {
      if (now.minute() == 15 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 8:25
    if (now.hour() == 8 && now.minute() == 25 && now.second() <= 4) {
      if (now.minute() == 25 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 9:25
    if (now.hour() == 9 && now.minute() == 25 && now.second() <= 4) {
      if (now.minute() == 25 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 10:25
    if (now.hour() == 10 && now.minute() == 25 && now.second() <= 4) {
      if (now.minute() == 25 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 10:35
    if (now.hour() == 10 && now.minute() == 35 && now.second() <= 4) {
      if (now.minute() == 35 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
    //ALARM ==> 11:30
    if (now.hour() == 11 && now.minute() == 30 && now.second() <= 4) {
      if (now.minute() == 30 && now.second() < 4) digitalWrite(alarm, 1);
      else digitalWrite(alarm, 0);
    }
  }
}
VIDEO
Salir de la versión móvil