Ceas analog & digital cu meniu de setări, alarmă, afișare temperatură și control IR

1. Introducere

Proiectul a pornit de la dorința de a realiza un sistem de ceas complet, care să combine afișarea grafică modernă (analog și digital) cu funcții utile precum alarma, măsurarea temperaturii și controlul de la distanță. Ideea a fost inspirată din nevoia unui dispozitiv compact, autonom, ușor de folosit, care să ofere atât informații utile zilnic, cât și o interfață interactivă.

Scopul proiectului este de a pune în aplicare cunoștințele despre microcontrolere, senzori și interfețe grafice, obținând un prototip bine organizat pe componente independente și ușor de extins cu funcții noi. Consider că este util atât pentru uz personal (birou, cameră), cât și ca bază educațională.

Proiectul urmărește realizarea unui sistem de ceas modular, compus din două plăci de dezvoltare și două display-uri OLED, care funcționează împreună pentru a oferi:

  • afișare oră și dată în mod analog și digital
  • alarmă configurabilă prin meniul local
  • măsurare și afișare continuă a temperaturii
  • comutare între afișaje prin telecomandă IR
  • interfață intuitivă cu butoane și feedback sonor (buzzer)

Am folosit două microcontrolere nu doar pentru separarea funcționalităților, ci și din motive tehnice. Placa Arduino UNO gestionează ceasul și meniul, însă are un spațiu de memorie limitat: doar 32 KB Flash (pentru cod) și 2 KB SRAM (pentru variabile și afișaj). Deoarece proiectul folosește două ecrane OLED, senzori (DHT11, RTC, IR), buzzer, meniu interactiv și salvare în EEPROM, utilizarea ambelor afișaje pe o singură placă ar fi depășit rapid resursele disponibile. În special, folosirea simultană a două librării grafice pentru ecrane I2C (cu fonturi și bufferuri de afișare) ar fi dus la erori sau blocaje.

Astfel, s-a optat pentru o arhitectură modulară, unde:

  • Arduino Uno se ocupă exclusiv de ora, dată, alarmă, meniuri și afișaj pe OLED 0.96”
  • ESP8266 este dedicat măsurării temperaturii, afișării pe OLED 1.3” și recepției comenzilor IR

Această separare oferă și avantajul testării independente și a extinderii ușoare pe viitor.

2. Descriere generală

Proiectul este împărțit în două module independente, fiecare cu roluri specifice:

  • Modul Ceas & Alarmă – bazat pe Arduino Uno, responsabil pentru afișarea orei și datei în mod analog și digital, precum și pentru gestionarea alarmei.
  • Modul Temperatură & IR – bazat pe ESP8266, se ocupă de măsurarea temperaturii și de controlul prin telecomandă IR.

2.1 Schema bloc

Pentru o mai bună înțelegere a arhitecturii aplicației, am realizat o diagramă bloc care evidențiază componentele hardware implicate și modul în care acestea comunică între ele:

Diagramă bloc a sistemului – Ceas & Temperatură cu IR

Această schemă ilustrează conexiunile dintre senzori, microcontrolere și periferice, precum și direcția fluxului de date – de la senzori și interfețe de control către unitățile de procesare și afișare.

2.2 Funcționare generală

Modulul Ceas & Alarmă:

  • Utilizează un modul RTC DS1307 pentru a menține ora și data exacte.
  • Afișează ora și data pe un ecran OLED de 0.96” în mod analog și digital.
  • Permite configurarea alarmei printr-un meniu navigabil cu butoane.
  • Stochează setările alarmei în EEPROM pentru a le păstra după resetare.

Modulul Temperatură & IR:

  • Măsoară temperatura folosind un senzor DHT11.
  • Afișează temperatura pe un ecran OLED de 1.3”.
  • Permite comutarea între afișarea temperaturii și un mesaj personalizat prin intermediul unei telecomenzi IR.

Din punct de vedere software, fiecare microcontroler rulează un program independent care gestionează componentele aferente:

  • Arduino Uno rulează un cod care actualizează ora și data pe ecran la fiecare secundă, gestionează meniul de configurare prin butoane, pornește alarma la momentul setat și salvează setările în EEPROM.
  • ESP8266 rulează un cod care citește temperatura la intervale regulate de la senzorul DHT11 și afișează rezultatul sau un mesaj static, în funcție de comenzile primite prin telecomanda IR. Decodificarea semnalelor IR se face printr-o bibliotecă dedicată.

Cele două plăci nu comunică între ele, însă funcționează în paralel pentru a oferi o experiență unitară: un modul dedicat ceasului și alarmei, și unul pentru temperatură și control IR.

2.3 Fluxul de utilizare al aplicației

După pornirea sistemului, utilizatorul interacționează cu cele două afișaje OLED, fiecare având funcționalități distincte:

➤ 1. Afișare oră și dată - OLED 0.96"

  • Pe ecranul principal, ceasul afișează:
    • ora în mod analog (cu ace desenate)
    • ora în mod digital (HH:MM:SS)
    • data completă: zi, lună, an și ziua săptămânii
  • Afișajul este actualizat în timp real, fără întârzieri.

➤ 2. Accesarea meniului (prin butonul MENIU)

  • Apăsând primul buton tactil (D4), utilizatorul intră într-un meniu cu 3 opțiuni:
    • `Set Time and Date`
    • `Set Alarm`
    • `Back`
  • Butoanele UP și DOWN sunt folosite pentru deplasarea cursorului între opțiuni.

➤ 3. Setare timp și dată

  • Selectând `Set Time and Date`, utilizatorul poate modifica:
    • În partea de sus dreapta : oră , minut , secundă
    • În partea de jos dreapta : ziua, luna, anul
  • În colțul stânga sus, apare un mesaj care indică ce se modifică în acel moment, în funcție de poziția cursorului( de exemplu : dacă se editează ora: “Set the hour”
  • În partea de jos stânga apar două opțiuni:
    • `Save` – salvează valorile curente în RTC și EEPROM
    • `Back` – revine la meniul anterior fără salvare

➤ 4. Setare alarmă

  • Selectând `Set Alarm`, utilizatorul are următoarele opțiuni:
    • `Enable` – activează alarma (cu mesaj confirmare)
    • `Disable` – dezactivează alarma (cu mesaj confirmare)
    • `Back` – iese din meniu
  • Alarma activată va porni automat la ora setată și va emite un semnal sonor cu buzzerul.
  • Alarma se dezactivează automat după declanșare și poate fi dezactivată și manual din meniu înainte de a fi activată.

➤ 5. Comutare afișaj - OLED 1.3"

  • Pe ecranul mare (1.3”) se poate comuta între două moduri folosind telecomanda IR:
    • `Mod Temperatură` – afișează temperatura curentă măsurată de DHT11 (ex: „Temperature: 23.5°C”)
    • `Mod Text` – afișează un mesaj personalizat („Arduino is the best!”)
  • Comutarea se face prin butoanele:
    • `OK` → afișează temperatura
    • `#` → afișează mesajul text
  • Comenzile sunt primite prin receptorul IR și procesate în timp real.

3. Hardware Design

Secțiunea prezintă stadiul actual al implementării hardware — componentele folosite, legăturile dintre ele și dovezi de funcționare.

3.1 Stadiul actual al implementării hardware

Structura hardware a proiectului este împărțită în două module principale, fiecare având funcții bine delimitate și componente dedicate:

Modul Ceas & Alarmă – construit pe platforma Arduino UNO, acest modul gestionează afișarea orei și datei, precum și funcția de alarmă. Include un afișaj OLED de 0.96”, un modul RTC DS1307 pentru menținerea timpului real, un buzzer pentru semnal sonor și trei butoane pentru navigarea prin meniu.

Modul Temperatură & IR – bazat pe NodeMCU (ESP8266), acest modul se ocupă cu măsurarea temperaturii și controlul prin telecomandă IR. Utilizează un senzor DHT11, un receptor IR și un afișaj OLED de 1.3” pentru vizualizarea temperaturii sau a unui mesaj personalizat.

Ambele montaje sunt complet funcționale, realizate pe breadboard și testate individual. Conexiunile între componente sunt stabile, iar semnalele sunt corect interpretate de fiecare microcontroler.

Modul Ceas & Alarmă Modul Temperatură & IR
poza_arduino.jpeg poza_esp.jpeg

3.2 Listă de componente

# Componentă Datasheet Rol în proiect Modul
1 Arduino UNO ATmega328P unitate de control ceas & alarmă Ceas
2 NodeMCU  ESP8266 ESP-12E unitate de control temperatură & IR Temperatură & IR
3 RTC DS1307 breakout I2C păstrează ora și data exacte Ceas
4 OLED 0 .96″ SSD1306 I2C afișează ceas analog + digital Ceas
5 OLED 1 .3″ SH1106 I2C afișează temperatura / text Temperatură & IR
6 DHT11 senzor digital măsoară temperatura ambientală Temperatură & IR
7 Receptor IR VS1838B primește comenzi telecomandă Temperatură & IR
8 Telecomandă IR NEC 17 butoane comută moduri pe ecran Temperatură & IR
9 Buzzer activ 5 V semnal sonor la alarmă Ceas
10 3 × butoane tactile 6 × 6 mm navigare meniu Ceas
11 Breadboard + fire prototipare rapidă ambele

3.1 Conexiuni și pini

Modul Ceas & Alarmă – Arduino UNO

RTC DS1307 – menține ora și data în mod precis, chiar și în absența alimentării principale (datorită bateriei ). Este conectat prin magistrala I2C:

  • SDA → A4 (linie date I2C)
  • SCL → A5 (linie ceas I2C)
  • VCC → 5V (alimentare)
  • GND → GND (masă comună)

Justificare: DS1307 comunică doar prin I2C, iar pe Arduino UNO, A4 și A5 sunt pinii dedicați I2C.

OLED 0.96” (SSD1306) – afișează ora în mod digital și analog. Este conectat tot prin I2C:

  • SDA → A4
  • SCL → A5
  • VCC → 5V
  • GND → GND

Justificare: OLED-ul și RTC-ul partajează linia I2C, fiind compatibili și având adrese I2C diferite.

Buzzer activ 5V – semnalizează sonor activarea alarmei:

  • + → D7
  • – → GND

Justificare: D7 este configurat ca pin digital de ieșire care activează buzzerul atunci când ora alarmei este atinsă.

Butoane tactile (x3) – permit navigarea în meniul de configurare (Set Time / Set Alarm):

  • Buton Meniu → D4
  • Buton UP → D5
  • Buton DOWN → D6
  • Celălalt pin al fiecărui buton → GND

Justificare: butoanele sunt configurate cu INPUT_PULLUP, deci pinii sunt legați la GND pentru a înregistra o apăsare logică LOW.

Schema electrică

Schema electrică – Arduino UNO, OLED, RTC, buzzer, butoane

Modul Temperatură & IR – NodeMCU ESP8266

DHT11 – măsoară temperatura ambientală:

  • DATA → D4 (GPIO2)
  • VCC → 3V3
  • GND → GND

Justificare: D4 (GPIO2) este pin digital compatibil pentru citirea semnalului digital de la DHT11.

Receptor IR (VS1838B) – primește semnale de la telecomanda IR:

  • OUT → D5 (GPIO14)
  • VCC → 3V3
  • GND → GND

Justificare: D5 este configurat ca pin de intrare pentru decodificarea semnalelor IR folosind biblioteca `IRremoteESP8266`.

OLED 1.3” (SH1106) – afișează temperatura sau mesajul selectat:

  • SDA → D2 (GPIO4)
  • SCL → D1 (GPIO5)
  • VCC → 3V3
  • GND → GND

Justificare: SDA și SCL sunt pinii standard I2C pe NodeMCU pentru OLED; I2C permite actualizare grafică rapidă și simplă.

Schema electrică

Schema electrică – ESP8266, DHT11, IR receiver, OLED 1.3"

4. Software Design

4.1 Alegerea bibliotecilor și justificare

Pentru implementarea funcționalităților am folosit biblioteci fiabile și compatibile cu microcontrolerele utilizate:

Bibliotecă Rol în proiect Justificare
RTClib Citirea și scrierea timpului pe modulul RTC DS1307 Ușor de folosit, compatibilă direct cu DS1307 și foarte bine documentată
Adafruit_SSD1306 + Adafruit_GFX Afișarea grafică a ceasului pe OLED 0.96” Suportă text și forme grafice pentru reprezentarea ceasului analog
GyverOLED Afișaj pe OLED 1.3” cu driver SH1106 (ESP8266) Rapidă, eficientă și optimizată pentru ESP8266
IRremote Decodarea comenzilor IR de la telecomandă Suportă protocoale populare (NEC, Sony etc.), ideală pentru ESP
DHT Citirea temperaturii de la senzorul DHT11 Asigură timpi corecți de citire și stabilitate
EEPROM Salvarea alarmei și preferințelor între porniri Permite păstrarea datelor în memoria internă a Arduino-ului

4.2 Element de noutate în proiect

  • Comutarea modului de afișare pe ecranul OLED de 1.3” folosind telecomanda IR, fără butoane locale.
  • Afișarea ceasului în format analog, desenat cu grafică vectorială prin biblioteca GFX.
  • Separarea funcțională pe două microcontrolere independente (Arduino UNO și ESP8266), fiecare cu afișaj propriu.
  • Posibilitatea de setare a alarmei și salvare în EEPROM, astfel încât setările se păstrează după resetare.

4.3 Integrarea funcționalităților din laborator

Proiectul propus integrează în mod direct conceptele și funcționalitățile studiate în cadrul laboratoarelor, demonstrând aplicarea practică a noțiunilor teoretice în dezvoltarea unui sistem embedded interactiv. Tabelul de mai jos evidențiază principalele module hardware și tehnici utilizate, corelate cu implementarea din proiect:

Laborator Funcționalitate Aplicare practică în proiect
GPIO (General Purpose I/O) Controlul pinilor digitali (INPUT/OUTPUT) Configurarea butoanelor pentru navigarea prin meniu (`pinMode(4, 5, 6, INPUT_PULLUP)`) și controlul buzzerului prin pinul D7 (`digitalWrite`).
UART (Serial Communication) Comunicare serială între Arduino și PC Inițializare și trimitere date prin `Serial.begin(9600)` și `Serial.println()` pentru testare și debug (ex: mesaje IR sau erori RTC).
Întreruperi (fără delay) Programare pe bază de evenimente, evitând `delay()` Folosirea funcției millis() atât pentru actualizarea orei , cât și pentru citirea periodică a temperaturii , fără blocarea execuției. Acest lucru contribuie la un control fluid și receptiv în ambele module.
Timer / PWM (Pulse Width Modulation) Generarea semnalelor PWM pentru buzzer Activarea buzzerului în timpul alarmei sau la apăsarea butoanelor, folosind un semnal PWM simplificat (`digitalWrite` pe pinul buzzerului).
I2C (Inter-Integrated Circuit) Comunicare serială sincronă cu mai multe dispozitive Utilizarea magistralei I2C pentru conectarea simultană a modulului RTC DS1307 și a ecranelor OLED (0.96” și 1.3”), prin librăriile `Adafruit_SSD1306`, `GyverOLED`.

4.4 Structura proiectului și interacțiunea între funcționalități

Arhitectura proiectului este împărțită în două module hardware autonome, fiecare implementat printr-un sketch dedicat:

  • Sketch Arduino UNO — responsabil pentru:
    • Afișajul unui ceas digital și analogic în timp real (cu actualizare bazată pe millis).
    • Navigarea printr-un meniu interactiv cu butoane (up/down/select).
    • Setarea și salvarea unei alarme în EEPROM.
    • Generarea unui semnal sonor prin buzzer la declanșarea alarmei.
    • Controlul complet al unui display OLED de 0.96” prin I2C.
  • Sketch NodeMCU ESP8266 — responsabil pentru:
    • Citirea valorii de temperatură de la senzorul DHT11.
    • Comutarea între moduri de afișare (text personalizat sau temperatură) cu ajutorul unei telecomenzi IR.
    • Afișarea informațiilor pe un display OLED de 1.3” prin protocolul I2C.

Interacțiunea între cele două module:

  • Nu există conexiune fizică sau logică directă între placa Arduino UNO și placa ESP8266.
  • Fiecare modul funcționează independent, comunicând doar cu perifericele proprii (senzori, afișaj, buzzer etc.).
  • Ambele plăci oferă feedback vizual separat, folosind propriul ecran OLED pentru a afișa informațiile relevante.

4.5 Validarea funcționalităților

Testarea sistemului s-a realizat prin verificare practică, monitorizare continuă și comparare cu surse de referință. Rezultatele confirmă funcționarea corectă a componentelor hardware și a codului:

  • Ceasul RTC DS1307:
    • Ora a fost sincronizată cu ora sistemului de operare al PC-ului.
    • A fost monitorizat timp de 24 de ore, rezultând o abatere de mai puțin de câteva secunde.
  • Temperatura (DHT11):
    • Valoarea afișată a fost comparată cu un termometru digital de cameră, înregistrând o abatere acceptabilă (±1 °C).
  • Comenzile IR (telecomandă):
    • Codurile transmise au fost analizate cu utilitarul `ReceiveDump`.
    • Sketch-ul a interpretat corect comenzile IR în timp real și a comutat modul de afișare pe OLED.
  • Butoanele fizice:
    • Apăsarea tastelor nu produce dublu-click sau efecte nedorite de tip „bouncing”.
    • Debouncing-ul software este realizat prin utilizarea funcției `millis()` în loc de `delay()`, asigurând un răspuns rapid și fiabil.

4.6 Calibrarea senzorilor

Pentru asigurarea preciziei datelor afișate și a fiabilității sistemului, fiecare senzor a fost calibrat și verificat astfel:

  • RTC DS1307:
    • Setat inițial cu funcția `rtc.adjust(…)`, în sincron cu ora sistemului.
    • Verificat vizual și serial, cu o abatere de câteva secunde după 24 de ore de funcționare.
  • DHT11 (senzor temperatură):
    • Temperatura a fost comparată cu un termometru fizic digital.
    • Citirile sunt realizate la un interval de 5 secunde, controlat prin funcția millis(). Această metodă evită blocarea execuției programului și asigură o afișare stabilă, fără fluctuații rapide pe ecran. Actualizarea periodică permite utilizatorului să observe confortabil temperatura afișată, în timp ce restul funcționalităților rulează fluent în paralel.
  • Receptor IR:
    • Testat folosind sketch-ul `ReceiveDump` din biblioteca IRremote
    • Codurile transmise de telecomandă au fost captate și validate în timp real prin `Serial Monitor`.

4.7 Optimizări implementate

Pentru a îmbunătăți performanța și claritatea funcțiilor, au fost aplicate următoarele optimizări directe în codul proiectului:

  • Eliminarea `delay()` din logica principală:
    • Toate funcțiile legate de afișarea ceasului (pe Arduino UNO), precum și actualizarea temperaturii (pe ESP8266), sunt controlate prin `millis()` în loc de `delay()`. Acest lucru permite rularea fluentă, non-blocantă și receptivă a codului.
  • Debouncing software pentru butoane:
    • Prin utilizarea `millis()` și a citirilor periodice, a fost evitat efectul de bouncing la apăsarea tastelor, fără a folosi componente externe sau biblioteci speciale.
  • Utilizarea modului `INPUT_PULLUP` pentru butoane:
    • PinMode-ul pentru toate cele trei butoane (Select, Up, Down) este configurat cu `INPUT_PULLUP`, ceea ce elimină necesitatea unor rezistențe fizice și reduce numărul de fire și piese în montaj.
  • Structurare modulară a sketch-urilor:
    • Proiectul este împărțit în două sketch-uri independente (Arduino UNO și ESP8266), fiecare concentrat pe funcționalități specifice, cu periferice dedicate și fără interferențe între ele.

4.8 Demonstrație video și explicații

Pentru o mai bună înțelegere a funcționării proiectului, am realizat două demonstrații video:

▶️ [https://drive.google.com/file/d/1IcjIhJSybZn36Gk-Nq22kOQmnmctzyUI/view?usp=sharing | Demonstrație inițială – Testare pe breadboard]

  • Prezintă montajul prototip cu fire și componente expuse
  • Se testează afișajul ceasului, buzzerul, butoanele și senzorul DHT11
  • Demonstrează comutarea între moduri cu telecomanda IR, înainte de asamblare

▶️ [https://drive.google.com/file/d/1WwQUFutX2TDG9qx4ybHrcaH8FPK8qCFA/view?usp=sharing | Demonstrație finală ]

  • Arată pornirea și afișarea grafică (ceas analog + digital)
  • Navigare în meniu, setare dată/oră/alarmă
  • Activarea și declanșarea alarmei cu buzzer
  • Afișarea temperaturii și schimbarea modurilor cu telecomanda IR
  • Salvarea setărilor

Ambele demonstrații confirmă funcționalitatea proiectului, atât în faza de testare cât și în forma finală.

5. Rezultate obținute

În urma realizării proiectului, au fost obținute următoarele rezultate concrete:

  • A fost realizat un sistem funcțional format din două microcontrolere (Arduino UNO și ESP8266), fiecare controlând componente dedicate și operând independent.
  • Afișarea orei și datei în timp real, atât în format digital cât și analogic, cu actualizare la fiecare secundă și redare grafică stabilă pe un ecran OLED de 0.96”.
  • Implementarea unui meniu interactiv controlat prin trei butoane fizice (MENIU, UP, DOWN), ce permite configurarea rapidă a timpului și alarmei.
  • Salvarea în EEPROM a setărilor alarmei, astfel încât acestea se păstrează și după resetarea dispozitivului.
  • Generarea unui semnal sonor cu buzzer activ la declanșarea alarmei, cu dezactivare automată sau manuală.
  • Afișarea temperaturii curente, măsurată prin senzorul DHT11, pe un display OLED de 1.3”, cu actualizare constantă.
  • Comutarea modului de afișare (temperatură sau text) pe OLED 1.3” folosind o telecomandă IR — fără butoane locale.
  • Interfața a fost testată cu succes în utilizare reală, fără întârzieri sau blocaje, datorită programării non-blocante bazate pe `millis()`.

Aceste rezultate confirmă atingerea tuturor obiectivelor propuse inițial și demonstrează o integrare complet funcțională între hardware și software în cadrul unui proiect embedded modular.

6. Concluzii

Proiectul a permis aplicarea practică a cunoștințelor dobândite despre microcontrolere, afișaje grafice, senzori digitali și interfețe de control. Sistemul final rezultat este funcțional, modular, interactiv și oferă o experiență completă de utilizare, combinând:

  • afișajul ceasului (analog + digital)
  • alarmă configurabilă și salvată în EEPROM
  • afișaj de temperatură actualizată în timp real
  • control la distanță prin telecomandă IR

Separarea funcționalităților între Arduino UNO și ESP8266 a simplificat gestionarea codului și a permis testarea independentă a fiecărui modul. De asemenea, utilizarea funcției `millis()` în locul `delay()` a contribuit semnificativ la fluiditatea interfeței.

Proiectul poate fi extins pe viitor cu funcții precum afișare pe web, notificări wireless sau integrare cu senzori suplimentari.

7. Jurnal de dezvoltare

Perioada Activități realizate
21–25 Aprilie • Conceperea ideii generale de proiect (ceas + temperatură + alarmă)
• Stabilirea structurii pe două microcontrolere (Arduino UNO + ESP8266)
28 Aprilie – 2 Mai • Crearea paginii de Wiki și introducerea conținutului general
• Adăugare listă componente hardware și prima variantă de diagramă bloc
5–9 Mai • Realizare și testare afișaj ceas analog și digital pe OLED 0.96”
• Implementarea RTC DS1307 și sincronizarea cu ora sistemului
• Implementare meniu și navigare cu butoane (MENIU, UP, DOWN)
12–16 Mai • Adăugare și testare buzzer la activarea alarmei
• Implementarea salvării în EEPROM a setărilor
• Implementare afișare temperatură DHT11 pe OLED 1.3” cu ESP8266
19–23 Mai • Adăugare receptor IR și integrare cu telecomandă (OK / #)
• Comutare între afișaj text și temperatură cu IR
• Validare funcționalități hardware
24–26 Mai • Finalizare documentație pe Wiki
• Testare finală completă a ambelor module și capturi video

8. Bibliografie / Resurse

► Resurse Software

► Resurse Hardware

► Software folosit în crearea schemelor electrice:

  • Fritzing

► Arhivă cod proiect

  • [Arhiva completă a proiectului ] (cod.zip)
pm/prj2025/avaduva/daria_teodora.pocea.txt · Last modified: 2025/05/28 13:09 by daria_teodora.pocea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0