Orologio Arduino senza modulo RTC su LCD

Orologio su Arduino senza modulo RTC in tempo reale con uscita di informazioni su display LCD 1602 i2c – questo progetto prevede l’impostazione dell’ora (ore e minuti) e del tempo di attivazione della sveglia. A questo scopo vengono utilizzati due pulsanti (per cambiare le modalità di impostazione) e un cicalino per il segnale acustico. Il progetto contiene un diagramma schematico dell’assemblaggio del dispositivo e un programma funzionante.




Per questa attività sono necessari:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • display LCD 1602 i2c
  • pulsanti e cicalino
  • breadboard
  • cavi di collegamento
  • libreria LiquidCrystal_I2C.h

Orologio Arduino su LCD 1602 i2c senza modulo RTC

Questo progetto richiede un minimo di componenti: un display 1602 con modulo i2c (se volete potete collegare il display senza modulo i2c), due pulsanti e un altoparlante piezoelettrico. I pulsanti sono collegati ai pin del microcontrollore Arduino Uno configurati in modalità INPUT_PULLUP: con questo metodo di collegamento è possibile leggere il numero di pressioni dei pulsanti e non sono necessarie resistenze per l’assemblaggio del circuito.

Schema per la costruzione di orologio su Arduino

Schema per la costruzione di orologio su Arduino Uno
Schema per la costruzione di orologio su Arduino Uno
LCD 1602 i2c Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

Se si utilizza un Arduino Mega, le porte SDA e SCL per il collegamento del display si trovano sui pin 20 e 21 di questa scheda. La scheda Arduino Nano ha la stessa piedinatura della Uno e l’LCD 1602 è collegato ai pin A4 (SDA) e A5 (SCL). La sveglia emette un segnale acustico per 1 minuto; per spegnerla è possibile premere il pulsante collegato alla porta 8. Dopo aver assemblato lo schema elettrico, caricare il seguente programma sulla scheda.

Programma Arduino per orologio senza modulo RTC con LCD




#include "Wire.h"                              
#include "LiquidCrystal_I2C.h"        
LiquidCrystal_I2C LCD(0x27, 20, 2);

// tempo iniziale e valori di allarme
byte SEC = 0;
byte MIN = 34;
byte HOUR = 12;
byte MIN_A = 35;
byte HOUR_A = 12;
unsigned long timer;

boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button1IsUp;
boolean button2IsUp;

boolean alarm = true;
byte c1, c2, c3, w, i;

// icona dell'allarme
byte bell [8] = {
  0b11000,
  0b11110,
  0b01100,
  0b01000,
  0b00000,
  0b00000,
  0b00000,
  0b00000,
};

void setup() {
  pinMode(9, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(5, OUTPUT);
  LCD.init();
  LCD.backlight();
  LCD.createChar(1, bell);
  timer = millis();
}

void loop() {
  button1IsUp = digitalRead(9);
  button2IsUp = digitalRead(8);

  if(button1WasUp && !button1IsUp) {
    delay(10);
    button1IsUp = digitalRead(9);
    if(!button1IsUp) {
      SEC = 0; w = 1;
    }
  }
  button1WasUp = button1IsUp;

  if(button2WasUp && !button2IsUp) {
    delay(10);
    button2IsUp = digitalRead(8);
    if(!button2IsUp) {
      alarm = false;
    }
  }
  button2WasUp = button2IsUp;

  if(millis() - timer > 1000) {
    timer = millis();
    SEC++;
    if(SEC > 59) { SEC = 0; MIN++; }
    if(MIN > 59) { MIN = 0; HOUR++; }
    if(HOUR > 23) { HOUR = 0; }
    if(alarm == true && HOUR == HOUR_A && MIN == MIN_A && i < 60) {
      tone(5, 50); i++;
    }
    if(i >= 60) {
      noTone(5); alarm == false; i = 0;
    }

    if(HOUR < 10) { c1 = 5; }
    if(HOUR >= 10) { c1 = 4; }
    if(MIN < 10) { c2 = 8; }
    if(MIN >= 10) { c2 = 7; }
    if(SEC < 10) { c3 = 11; }
    if(SEC >= 10) { c3 = 10; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("0");
    LCD.setCursor(c3, 0);
    LCD.print(SEC);
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }
    noTone(5);
  }

  while (w == 1) {
    if(HOUR > 23) { HOUR = 0; }
    if(HOUR < 10) { c1 = 5; }
    if(HOUR >= 10) { c1 = 4; }
    if(MIN < 10) { c2 = 8; }
    if(MIN >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if(alarm == true) { LCD.print(char(1)); }
    if(alarm == false) { LCD.print(" "); }

    LCD.setCursor(2, 1);
    LCD.print("HOUR SETTING");

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);

    if(button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(9);
      if(!button1IsUp) {
        LCD.clear(); w = 2;
      }
    }
    button1WasUp = button1IsUp;

    if(button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(8);
      if(!button2IsUp) {
        HOUR++;
      }
    }
    button2WasUp = button2IsUp;
  }

  while(w == 2) {
    if(MIN > 59) { MIN = 0;}
    if(HOUR < 10) { c1 = 5; }
    if(HOUR >= 10) { c1 = 4; }
    if(MIN < 10) { c2 = 8; }
    if(MIN >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if(alarm == true) { LCD.print(char(1)); }
    if(alarm == false) { LCD.print(" "); }

    LCD.setCursor(1, 1);
    LCD.print("MINUTE SETTING");

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);

    if(button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(9);
      if(!button1IsUp) {
        LCD.clear(); w = 3;
      }
    }
    button1WasUp = button1IsUp;

    if(button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(8);
      if(!button2IsUp) {
        MIN++;
      }
    }
    button2WasUp = button2IsUp;
  }

  while(w == 3) {
    if(MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if(HOUR_A > 23) { HOUR_A = 0; }
    if(HOUR_A < 10) { c1 = 5; }
    if(HOUR_A >= 10) { c1 = 4; }
    if(MIN_A < 10) { c2 = 8; }
    if(MIN_A >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR_A);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN_A);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if(alarm == true) {
      LCD.print(char(1)); LCD.setCursor(4, 1); LCD.print("ALARM ON ");
    }
    if(alarm == false) {
      LCD.print(" "); LCD.setCursor(4, 1); LCD.print("ALARM OFF");
    }
 
    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);

    if(button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(9);
      if(!button1IsUp) {
        LCD.clear(); w = 4;
      }
    }
    button1WasUp = button1IsUp;

    if(button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(8);
      if(!button2IsUp) {
        alarm = !alarm;
      }
    }
    button2WasUp = button2IsUp;
  }

  while(w == 4) {
    if(MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if(HOUR_A > 23) { HOUR_A = 0; }
    if(HOUR_A < 10) { c1 = 5; }
    if(HOUR_A >= 10) { c1 = 4; }
    if(MIN_A < 10) { c2 = 8; }
    if(MIN_A >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR_A);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN_A);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if (alarm == true) { LCD.print(char(1)); }
    if (alarm == false) { LCD.print(" "); }

    LCD.setCursor(1, 1);
    LCD.print("ALARM SET HOUR");

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);

    if(button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(9);
      if(!button1IsUp) {
        LCD.clear(); w = 5;
      }
    }
    button1WasUp = button1IsUp;

    if(button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(8);
      if(!button2IsUp) {
        HOUR_A++;
      }
    }
    button2WasUp = button2IsUp;
  }

  while(w == 5) {
    if(MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if(HOUR_A > 23) { HOUR_A = 0; }
    if(HOUR_A < 10) { c1 = 5; }
    if(HOUR_A >= 10) { c1 = 4; }
    if(MIN_A < 10) { c2 = 8; }
    if(MIN_A >= 10) { c2 = 7; }

    LCD.setCursor(4, 0);
    LCD.print("0");
    LCD.setCursor(c1, 0);
    LCD.print(HOUR_A);
    LCD.print(":");
    LCD.setCursor(7, 0);
    LCD.print("0");
    LCD.setCursor(c2, 0);
    LCD.print(MIN_A);
    LCD.print(":");
    LCD.setCursor(10, 0);
    LCD.print("00");
    if(alarm == true) { LCD.print(char(1)); }
    if(alarm == false) { LCD.print(" "); }

    LCD.setCursor(0, 1);
    LCD.print("ALARM SET MINUTE");

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);

    if(button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(9);
      if(!button1IsUp) {
        LCD.clear(); w = 0;
      }
    }
    button1WasUp = button1IsUp;

    if(button2WasUp && !button2IsUp) {
      delay(10);
      button2IsUp = digitalRead(8);
      if(!button2IsUp) {
        MIN_A++;
      }
    }
    button2WasUp = button2IsUp;
  }

}


Spiegazione del codice per orologio senza modulo RTC con LCD 1602:

  1. le variabili c1 e c2 sono responsabili della posizione del cursore durante la visualizzazione dell’ora e dei minuti sullo schermo, a seconda che nella variabile sia memorizzato un numero a due o a una cifra (questo per comodità di visualizzazione delle informazioni);
  2. durante l’impostazione dell’orologio e della sveglia, il timer viene fermato.

Conclusione. L’orologio senza il modulo RTC ds1302 ripristinerà l’ora ai valori iniziali quando l’alimentazione viene spenta, quindi al progetto sono stati aggiunti dei pulsanti. Utilizzandoli è possibile regolare l’orologio senza dover ricaricare lo sketch: si tratta di un semplice progetto Arduino per principianti. È inoltre possibile aggiungere un sensore DHT11 Arduino per creare una stazione meteorologica e visualizzare la temperatura sullo schermo.

5/5 - (2 votes)


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.