Punctul de plecare a fost observatia ca lumina albastra seara afecteaza calitatea somnului. Majoritatea oamenilor stau la birou sau in camera cu aceeasi lumina alba tot timpul, indiferent de ora din zi. O lampa care isi adapteaza singura temperatura de culoare rezolva aceasta problema fara nicio interventie din partea utilizatorului.
Proiectul consta intr-o lampa RGB controlata de un microcontroler ATmega328P-XMINI. Lampa trece automat de la lumina rece (albastru-alb) ziua la lumina calda (galben-portocaliu) seara, in functie de luminozitatea ambientala citita de un fotorezistor si de ora curenta furnizata de un modul RTC. Pe langa modul automat, lampa poate fi controlata manual printr-un buton fizic sau de pe telefon prin Bluetooth. Un display OLED afiseaza in timp real modul activ, culoarea setata si ora curenta.
Proiectul este util pentru confortul vizual zilnic si pentru prevenirea durerilor de ochi cauzate de expunerea prelungita la lumina albastra seara. In acelasi timp, acopera practic toate periferalele studiate in laboratoarele PM: GPIO, UART, intreruperi externe, PWM, ADC, SPI si I2C.
Sistemul are urmatoarele module principale:
| Componenta | Model / Specificatii | Cantitate |
|---|---|---|
| Placa microcontroller | ATmega328P-XMINI | 1 |
| Modul Bluetooth | HC-06 UART | 1 |
| Display OLED | SH1106 1.3” SPI | 1 |
| Modul RTC | DS3231 I2C | 1 |
| MOSFET | IRLZ44N N-Channel Logic Level | 3 |
| LED rosu | LED 5mm rosu | 1 |
| LED verde | LED 5mm verde | 1 |
| LED albastru | LED 5mm albastru | 1 |
| Fotorezistor | GL5528 LDR | 1 |
| Buton | Push tactil | 1 |
| Regulator tensiune | L7805CV | 1 |
| Rezistor | 220Ω | 3 |
| Rezistor | 10kΩ | 2 |
| Rezistor | 1kΩ | 1 |
| Rezistor | 2kΩ | 1 |
| Breadboard | 830 puncte | 1 |
| Fire jumper | Male-to-male | ~30 |
| Cablu USB | Micro-USB | 1 |
| Sursa alimentare | 24V externa | 1 |
| Pin MCU | Conectat la | Functie |
|---|---|---|
| D0 (RX) | HC-06 TX | UART receptie Bluetooth |
| D1 (TX) | HC-06 RX via 1kΩ+2kΩ | UART transmisie (protejat 3.3V) |
| D2 | Buton + pull-up 10kΩ | Intrerupere externa INT0 |
| D3 (PWM) | Gate MOSFET Rosu | PWM canal R |
| D4 | OLED RST | SPI Reset |
| D5 (PWM) | Gate MOSFET Verde | PWM canal G |
| D6 (PWM) | Gate MOSFET Albastru | PWM canal B |
| D7 | OLED DC | SPI Data/Command |
| D10 | OLED CS | SPI Chip Select |
| D11 (MOSI) | OLED SDA | SPI Date |
| D13 (SCK) | OLED SCK | SPI Clock |
| A0 | Nod LDR + 10kΩ | ADC citire luminozitate |
| A4 (SDA) | DS3231 SDA | I2C date RTC |
| A5 (SCL) | DS3231 SCL | I2C clock RTC |
Mediu de dezvoltare: VSCode cu PlatformIO, framework Arduino, upload prin avrdude cu protocol custom (flags: -P usb -c xplainedmini).
Librarii folosite:
Wire.h : comunicatie I2C cu DS3231RTClib : citire ora de la DS3231U8g2lib : driver display OLED SH1106 prin SPISPI.h : comunicatie SPI hardwareAlgoritmi implementati:
Logica principala ruleaza intr-un loop cu trei straturi de prioritate. La fiecare iteratie se verifica intai daca a fost apasata o intrerupere de la buton (flag setat in ISR), apoi daca au sosit date pe UART de la Bluetooth, si in final se ruleaza modul automat bazat pe LDR si RTC.
Calculul temperaturii de culoare combina liniar doua profile: profilul “rece” (R=200, G=220, B=255) si profilul “cald” (R=255, G=180, B=80). Factorul de interpolatie este calculat din ora curenta si modulat de valoarea ADC a LDR-ului.
Intreruperea pe INT0 seteaza un flag atomic si cicleza un contor de mod. Debouncing-ul este realizat software prin ignorarea intreruperilor successive la interval mai mic de 200ms.