Orologio a modulo TM1637 con termometro

Progetto di sveglia con termometro su Arduino con modulo display tm1637 e sensore di temperatura e umidità DHT11. Anche sul nostro sito è possibile trovare un progetto simile di orologio e sveglia su LCD 1602, Questa variante del progetto di sveglia è implementata senza il modulo ds1302 di orologio in tempo reale RTC. L’impostazione dell’ora corrente e dell’ora di attivazione del segnale sonoro avviene con l’aiuto dei pulsanti dell’orologio.




Per questa attività sono necessari:

Orologio digitale su TM1637 con termometro e sveglia

Orologio digitale su TM1637 con termometro
Orologio digitale su TM1637 Arduino con termometro e sveglia

Il primo pulsante (collegato al pin 8) viene utilizzato per accedere alla modalità di impostazione; in primo luogo viene impostata l’ora corrente, il secondo clic sul pulsante imposta l’ora della sveglia. Il terzo clic sul pulsante consente di uscire dalla modalità di impostazione e di salvare i dati inseriti. Nella modalità di impostazione, il secondo pulsante (collegato al pin 9) imposta le ore, il terzo pulsante (pin 10) imposta i minuti.

Premendo il secondo pulsante, quando il programma non è in modalità di impostazione, si attiva/disattiva la sveglia, con lo stato attuale di ON/OFF della sveglia visualizzato sul digitale display a quattro cifre del tm1637. Quando si preme il terzo pulsante, il display visualizza la temperatura dell’aria. Dopo aver assemblato il progetto della sveglia termometrica sulla scheda Arduino Uno, caricare il seguente programma nel microcontrollore.

Programma Arduino per orologio regolabile con TM1637





#include "TM1637Display.h"
TM1637Display display(3, 2); // CLC, DIO

#include "DHT.h"
DHT dht(7, DHT11);

// impostazioni di orologio e sveglia
byte HOUR = 13;
byte MIN = 21;
byte SEC = 0;
byte HOUR_A = 13;
byte MIN_A = 55;

#define HZ 100  // frequenza sonora del buzzer
byte s = 2;  // visualizzazione della temperatura in secondi

boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button3WasUp = true;
boolean button1IsUp;
boolean button2IsUp;
boolean button3IsUp;
boolean alarm = true;
unsigned long timer;
byte w, i;

const uint8_t C[] = {
  SEG_B | SEG_A | SEG_F | SEG_G,
  SEG_A | SEG_D | SEG_E | SEG_F };

const uint8_t ON[] = {
  SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,
  SEG_A | SEG_B | SEG_C | SEG_E | SEG_F };

const uint8_t OFF[] = {
  SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,
  SEG_A | SEG_G | SEG_E | SEG_F,
  SEG_A | SEG_G | SEG_E | SEG_F };

void setup() {
  pinMode(10, INPUT_PULLUP);  // boutons
  pinMode(9, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(5, OUTPUT);  // buzzer
  dht.begin();
  display.setBrightness(2);  // luminosità dello schermo da 0 a 7
  timer = millis();
}

void loop() {
  noTone(5);
  int t = dht.readTemperature();

  // funzione di conto alla rovescia dei secondi e del tempo
  if (millis() - timer > 1000) {
    timer = millis(); SEC++;
    if (SEC > 59) { SEC = 0; MIN++; }
    if (MIN > 59) { MIN = 0; HOUR++; }
    if (HOUR > 23) { HOUR = 0; }
    display.showNumberDecEx(MIN, 0b01000000, true, 2, 2);
  }

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

  // se si preme il pulsante 1, si passa alle impostazioni (while)
  if (button1WasUp && !button1IsUp) {
    delay(10); button1IsUp = digitalRead(8);
    if (!button1IsUp) { w = 1; }
  } button1WasUp = button1IsUp;

  // se si preme il pulsante 2, si attiva/disattiva l'allarme.
  if (button2WasUp && !button2IsUp) {
    delay(10); button2IsUp = digitalRead(9);
    if (!button2IsUp) {
      alarm = !alarm; i = 0; display.clear();
      if (alarm == true) { display.setSegments(ON, 2, 2); }
      if (alarm == false) { display.setSegments(OFF, 3, 1); }
      while (i < s) {
        if (millis() - timer > 1000) {
          timer = millis(); SEC++; i++;
        }
      }
    }
  } button2WasUp = button2IsUp;

  // se si preme il pulsante 3, viene visualizzata la temperatura
  if (button3WasUp && !button3IsUp) {
    delay(10); button3IsUp = digitalRead(10);
    if (!button3IsUp) {
      i = 0; display.clear(); 
      while (i < s) {
        if (millis() - timer > 1000) {
          timer = millis(); SEC++; i++;
        }
        display.showNumberDecEx(t, 0b00000000, false, 2, 0);
        display.setSegments(C, 2, 2);
      }
    }
  } button3WasUp = button3IsUp;

    // attivazione dell'allarme
    if (alarm == true && HOUR == HOUR_A && MIN >= MIN_A) {
      tone(5, HZ); delay(50);
    }

  display.showNumberDecEx(HOUR, 0b00000000, true, 2, 0);

  while (w == 1) {
    button1IsUp = digitalRead(8);
    button2IsUp = digitalRead(9);
    button3IsUp = digitalRead(10);

    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(8);
      if (!button1IsUp) { w = 2; }
    } button1WasUp = button1IsUp;

    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(9);
      if (!button2IsUp) { HOUR++; if (HOUR > 23) HOUR = 0; }
    } button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10); button3IsUp = digitalRead(10);
      if (!button3IsUp) { MIN++; if (MIN > 59) MIN = 0; }
    } button3WasUp = button3IsUp;

    display.showNumberDecEx(HOUR, 0b01000000, true, 2, 0);
    display.showNumberDecEx(MIN, 0b01000000, true, 2, 2);

    if (millis() - timer > 1000) {
      timer = millis(); SEC++;
      if (SEC > 59) { SEC = 0; MIN++; }
      if (MIN > 59) { MIN = 0; HOUR++; }
      if (HOUR > 23) { HOUR = 0; }
    }
  }

  while (w == 2) {
    button1IsUp = digitalRead(8);
    button2IsUp = digitalRead(9);
    button3IsUp = digitalRead(10);

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

    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(9);
      if (!button2IsUp) { HOUR_A++; if (HOUR_A > 23) HOUR_A = 0; }
    } button2WasUp = button2IsUp;

    if (button3WasUp && !button3IsUp) {
      delay(10); button3IsUp = digitalRead(10);
      if (!button3IsUp) { MIN_A++; if (MIN_A > 59) MIN_A = 0; }
    } button3WasUp = button3IsUp;

    display.showNumberDecEx(HOUR_A, 0b00000000, true, 2, 0);
    display.showNumberDecEx(MIN_A, 0b00000000, true, 2, 2);

    if (millis() - timer > 1000) {
      timer = millis(); SEC++;
      if (SEC > 59) { SEC = 0; MIN++;}
      if (MIN > 59) { MIN = 0; HOUR++; }
      if (HOUR > 23) { HOUR = 0; }
    }
  }
 
}

Spiegazione del codice per orologio regolabile con display TM1637:



  1. frequenza del segnale sonoro e la luminosità del display sono impostate nel programma;
  2. variabile s = 2; è responsabile del tempo di visualizzazione della temperatura in secondi.

Conclusione. In questa versione dell’orologio digitale con sveglia e termometro su tm1637 non viene utilizzato il modulo RTC per l’orologio in tempo reale, quindi al riavvio o allo spegnimento del microcontrollore Arduino Uno verranno impostati i valori temporali originali specificati all’inizio del programma. Se avete domande sul funzionamento del programma o su come costruire il circuito del progetto, lasciatele nei commenti a questo post.

5/5 - (1 vote)


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.