CONTENUTO ►
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
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:
- 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
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:
- 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.
Lascia un commento