Orologio Arduino con OLED i2c e sensore DHT11

Un altro progetto di orologio su Arduino con display OLED e sensore di temperatura e umidità DHT11 (può essere sostituito da un sensore di pressione BMP180). Abbiamo pubblicato due varianti contemporaneamente: con modulo di orologio in tempo reale RTC (l’ora può essere impostata solo nel programma stesso) e senza modulo RTC (l’ora può essere impostata in qualsiasi momento). Entrambe le varianti sono dotate di funzione di sveglia.




Per questa attività sono necessari:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • display OLED i2c 128×64
  • modulo RTC DS3231 / DS1307
  • pulsanti e buzzer
  • breadboard
  • cavi di collegamento
  • libreria OLED_I2C.h, DHT.h e iarduino_RTC.h

Orologio con OLED i2c senza modulo RTC DS3231

Se si utilizza la scheda Arduino Mega 2560, le porte SDA e SCL su questa scheda si trovano sui pin 20 e 21. La scheda Arduino Nano ha la stessa piedinatura della scheda Arduino Uno e il display I2C è collegato alle porte A4 (SDA) e A5 (SCL). I pulsanti sono collegati alle porte digitali del microcontrollore Arduino configurato in modalità INPUT_PULLUP: con questo metodo di collegamento è possibile leggere il numero di pressioni dei pulsanti.

Schema per la costruzione di orologio senza modulo RTC

Schema per la costruzione di orologio con display OLED senza modulo RTC
Schema per la costruzione di orologio con display OLED senza modulo RTC
OLED i2c 0,96 Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VDD 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

L’immagine sopra mostra lo schema di montaggio del progetto e la tabella mostra i pin per collegare il display OLED 0,96 alla scheda Arduino. Per lavorare con il display è necessaria la libreria OLED_I2C.h e per il sensore di temperatura la libreria DHT.h. Gli archivi con le librerie possono essere scaricati dal nostro sito web. Dopo aver assemblato il circuito e installato le librerie necessarie, caricare il seguente programma nel microcontrollore Arduino.

Programma Arduino per orologio con OLED senza modulo RTC




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

#include "OLED_I2C.h"
OLED  myOLED(SDA, SCL, 8);

extern uint8_t SmallFont[];
extern uint8_t BigNumbers[];

byte SEC = 0;
byte MIN = 59;
byte HOUR = 7;
byte MIN_A = 0;
byte HOUR_A = 8;
unsigned long timer;

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

boolean alarm = true;
byte w, i;

void setup() {
  pinMode(9, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(5, OUTPUT);
  dht.begin();
  myOLED.begin();
  timer = millis();
}

void loop() {
   int h = dht.readHumidity();
   int t = dht.readTemperature();
  
  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 = !alarm; } }
  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;
    }

    myOLED.clrScr();
    myOLED.setFont(BigNumbers);
    
    if (HOUR < 10) { myOLED.print("0" + String(HOUR) + "-", 8, 20); }
    if (HOUR >= 10) { myOLED.print(String(HOUR) + "-", 8, 20); }
    if (MIN < 10) { myOLED.print("0" + String(MIN) + "-", 50, 20); }
    if (MIN >= 10) { myOLED.print(String(MIN) + "-", 50, 20); }
    if (SEC < 10) { myOLED.print("0" + String(SEC), 92, 20); }
    if (SEC >= 10) { myOLED.print(String(SEC), 92, 20); }
  
    myOLED.setFont(SmallFont);
    
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    
    myOLED.print(String(t) + "' / " + String(h) + "% ", RIGHT, 55);
    myOLED.update();
    noTone(5);
  }

  while (w == 1) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (HOUR > 23) { HOUR = 0; }
    if (HOUR < 10) { myOLED.print("0" + String(HOUR) + "-", 8, 20); }
    if (HOUR >= 10) { myOLED.print(String(HOUR) + "-", 8, 20); }
    if (MIN < 10) { myOLED.print("0" + String(MIN) + "-", 50, 20); }
    if (MIN >= 10) { myOLED.print(String(MIN) + "-", 50, 20); }
    myOLED.print("00", 92, 20);
    
    myOLED.setFont(SmallFont);
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("HOUR SETTING", CENTER, 55);
    myOLED.update();

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 2; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { HOUR++; } }
    button2WasUp = button2IsUp;
  }

  while (w == 2) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (MIN > 59) { MIN = 0;}
    if (HOUR < 10) { myOLED.print("0" + String(HOUR) + "-", 8, 20); }
    if (HOUR >= 10) { myOLED.print(String(HOUR) + "-", 8, 20); }
    if (MIN < 10) { myOLED.print("0" + String(MIN) + "-", 50, 20); }
    if (MIN >= 10) { myOLED.print(String(MIN) + "-", 50, 20); }
    myOLED.print("00", 92, 20);

    myOLED.setFont(SmallFont);
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("MINUTE SETTING", CENTER, 55);
    myOLED.update();

    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 3; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { MIN++; } }
    button2WasUp = button2IsUp;
  }

  while (w == 3) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { myOLED.print("0" + String(HOUR_A) + "-", 8, 20); }
    if (HOUR_A >= 10) { myOLED.print(String(HOUR_A) + "-", 8, 20); }
    if (MIN_A < 10) { myOLED.print("0" + String(MIN_A) + "-", 50, 20); }
    if (MIN_A >= 10) { myOLED.print(String(MIN_A) + "-", 50, 20); }
    myOLED.print("00", 92, 20);

    myOLED.setFont(SmallFont);
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("ALARM SET HOUR", CENTER, 55);
    myOLED.update();
 
    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 4; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { HOUR_A++; } }
    button2WasUp = button2IsUp;
  }

  while (w == 4) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { myOLED.print("0" + String(HOUR_A) + "-", 8, 20); }
    if (HOUR_A >= 10) { myOLED.print(String(HOUR_A) + "-", 8, 20); }
    if (MIN_A < 10) { myOLED.print("0" + String(MIN_A) + "-", 50, 20); }
    if (MIN_A >= 10) { myOLED.print(String(MIN_A) + "-", 50, 20); }
    myOLED.print("00", 92, 20);
 
    myOLED.setFont(SmallFont); 
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("ALARM SET MINUTE", CENTER, 55);
    myOLED.update();
 
    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 0; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { MIN_A++; } }
    button2WasUp = button2IsUp;
  }

}

Spiegazione del codice per orologio con OLED senza modulo RTC e DHT11:



  1. l’heure et le réveil peuvent être modifiés au début du programme.

Schema per la costruzione di orologio con OLED e DHT11

Schema per la costruzione di orologio con OLED e DHT11
Schema per la costruzione di orologio con OLED e RTC

La seconda variante dell’orologio con sveglia prevede l’uso del modulo di orologio in tempo reale RTC basato sul chip DS1302 / DS1307 utilizzando la libreria iarduino_RTC.h. Lo schema di collegamento del modulo e del display al microcontrollore Arduino è mostrato nell’immagine precedente. Le impostazioni di data e ora nel programma sono impostate dalla funzione watch.settime(); solo la sveglia può essere impostata tramite i pulsanti.

Programma Arduino per orologio su OLED e modulo RTC

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

#include "OLED_I2C.h"
OLED  myOLED(SDA, SCL, 8);

#include "Wire.h"
#include "iarduino_RTC.h"
iarduino_RTC watch(RTC_DS1302, 5, 6, 7); // RTC DS1302, RST, CLK, DAT
//  iarduino_RTC watch(RTC_DS1307);      // RTC DS1307 I2C
//  iarduino_RTC watch(RTC_DS3231);      // RTC DS3231 I2C

extern uint8_t SmallFont[];
extern uint8_t BigNumbers[];

byte MIN_A = 0;
byte HOUR_A = 8;
unsigned long timer;

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

boolean alarm = true;
byte w, i;

void setup() {
  pinMode(9, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(3, OUTPUT);
  dht.begin();
  myOLED.begin();
  timer = millis();
  watch.begin();

  watch.settime(0, 59, 7, 16, 02, 22, 3);
}

void loop() {
   int h = dht.readHumidity();
   int t = dht.readTemperature();

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

  if (button1WasUp && !button1IsUp) {
    delay(10); button1IsUp = digitalRead(9);
    if (!button1IsUp) { w = 1; } }
  button1WasUp = button1IsUp;
  if (button2WasUp && !button2IsUp) {
    delay(10); button2IsUp = digitalRead(8);
    if (!button2IsUp) { alarm = !alarm; } }
  button2WasUp = button2IsUp;

  if (millis() - timer > 1000) {
    timer = millis();
    if (alarm==true && watch.Hours==HOUR_A && watch.minutes==MIN_A && i<60) {
      tone(3, 50); i++;
    }
    if (i >= 60) {
      noTone(3); alarm == false; i = 0;
    }

    myOLED.clrScr();
    
    myOLED.setFont(BigNumbers);
    myOLED.print(watch.gettime("H-i-s"), CENTER, 20);
  
    myOLED.setFont(SmallFont);
    if (alarm == true) {
      myOLED.print(String(t) + "' / " + String(h) + "% / on ", RIGHT, 3);
    }
    if (alarm == false) {
      myOLED.print(String(t) + "' / " + String(h) + "% / off", RIGHT, 3);
    }
    myOLED.print(watch.gettime("d.m.Y, D"), CENTER, 55);
    myOLED.update();
    noTone(3);
  }

   while (w == 1) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { myOLED.print("0" + String(HOUR_A) + "-", 8, 20); }
    if (HOUR_A >= 10) { myOLED.print(String(HOUR_A) + "-", 8, 20); }
    if (MIN_A < 10) { myOLED.print("0" + String(MIN_A) + "-", 50, 20); }
    if (MIN_A >= 10) { myOLED.print(String(MIN_A) + "-", 50, 20); }
    myOLED.print("00", 92, 20);

    myOLED.setFont(SmallFont);
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("ALARM SET HOUR", CENTER, 55);
    myOLED.update();
 
    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 2; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { HOUR_A++; } }
    button2WasUp = button2IsUp;
  }

  while (w == 2) {
    myOLED.clrScr();
 
    myOLED.setFont(BigNumbers);
    if (MIN_A > 59) { MIN_A = 0; HOUR_A++; }
    if (HOUR_A > 23) { HOUR_A = 0; }
    if (HOUR_A < 10) { myOLED.print("0" + String(HOUR_A) + "-", 8, 20); }
    if (HOUR_A >= 10) { myOLED.print(String(HOUR_A) + "-", 8, 20); }
    if (MIN_A < 10) { myOLED.print("0" + String(MIN_A) + "-", 50, 20); }
    if (MIN_A >= 10) { myOLED.print(String(MIN_A) + "-", 50, 20); }
    myOLED.print("00", 92, 20);
 
    myOLED.setFont(SmallFont); 
    if (alarm == true) { myOLED.print("on ", RIGHT, 3); }
    if (alarm == false) { myOLED.print("off", RIGHT, 3); }
    myOLED.print("ALARM SET MINUTE", CENTER, 55);
    myOLED.update();
 
    button1IsUp = digitalRead(9);
    button2IsUp = digitalRead(8);
    if (button1WasUp && !button1IsUp) {
      delay(10); button1IsUp = digitalRead(9);
      if (!button1IsUp) { w = 0; } }
    button1WasUp = button1IsUp;
    if (button2WasUp && !button2IsUp) {
      delay(10); button2IsUp = digitalRead(8);
      if (!button2IsUp) { MIN_A++; } }
    button2WasUp = button2IsUp;
  }

}

Spiegazione del codice per orologio su OLED e modulo RTC Arduino:

  1. dopo aver flashato il modulo RTC e impostato correttamente la data e l’ora, commentare o eliminare la riga watch.settime(); nel programma e caricare il codice in Arduino.

Conclusione. Abbiamo presentato due varianti di orologi su display OLED: con e senza modulo RTC in tempo reale. Sul nostro sito è disponibile anche un programma di esempio con uno schema di costruzione di un orologio su display LCD. Nella seconda variante del firmware non è possibile impostare l’ora tramite i pulsanti, ma solo la sveglia. Tutte le domande o i commenti utili su questo progetto possono essere lasciati 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.