Ce face: nu prea multe :)
Principalul obiectiv e să fie atât un ceas normal dar și un ceas “enervant”, să te trezească dimineața.
Scopul: să fie o motivație atât să te trezească dar și cât să te facă să îl arunci în perete zi de zi.
Ideea de la care am pornit: Am vrut să fac un ceas normal inițial și gândindu-mă cum să îl complic, am ajuns la acest model cu 2 motoare care îl fac să se miște atât pe el, cât și pe utilizator din pat de dimineață
Ar fi util pentru alții și/sau pentru noi ? Probabil. Eu personal nu i-aș da o durată lungă de viață dar totodată consider că ar putea fi folositor cuiva undeva sub anumite circumstanțe.
Descriere generală
Schema bloc de mai sus prezintă ideea generală inițială de comunicare a modulelor prezentate unele cu altele. Foarte pe scurt, “piesa centrală” este un Arduino UNO, pe care îl voi programa să aibă funcționalitatea de ceas normal folosind un modul RTC, căruia îi adaug un buzzer pentru alarmă, un joystick pentru folosirea meniului și setarea alarmelor, un driver de motoare și 2 motoare DC pentru a-i da “personalitatea” enervantă și un senzor de temperatură și umiditate, pentru ca de ce nu ? (mi-au rămas pini liberi)
Proiectul actual, așa cum s-a văzut și în pozele de la început, nu mai are celulele fotovoltaice din lipsă de timp și resurse alocabile pentru designul exterior.
Hardware Design
* Lista de piese:
Arduino UNO
LCD cu I2C pentru mai puține fire folosite
Modul RTC DS1302
Buzzer
Senzor de temperatură no-name din Super Starter Kit
Driver de motoare HM-166 (pentru controlul mai ușor și față-spate al motoarelor)
2 motoare DC cu mini-gearbox pentru cuplu mai puternic (să fugă din mâna când încerci să îl oprești :) )
Alimentarea se va face dintr-o baterie
Un joystick pentru navigarea alarmelor și a diferitelor “ecrane”
Un buton pentru oprirea alarmei si stergerea alarmelor selectate
Un power supply mic, de breadboard
Software Design
Descrierea codului aplicaţiei (firmware):
mediul de dezvoltare va fi ArduinoIDE
biblioteci și surse 3rd-party:
virtuabotixRTC.h → pentru a putea lucra mai eficient cu modulul de RTC
LiquidCrystal_I2C.h → pentru a interacționa cu ecranul LCD legat prin I2C
ezButton.h → folosit inițial pentru a lucra cu butoanele însă am renunțat la el și am folosit întreruperi
dht.h → pentru interfațarea placuței Arduino cu senzorul de temperatură și umiditate
SparkFun_TB6612.h → o bibliotecă găsită online pentru a facilita lucrul cu driver-ul de motoare
alarm.hpp → o clasă scrisă de mine pentru a mă ajuta în lucrul cu vectorul de alarme
Algoritmi:
Nu am folosit algoritmi complecși, am realizat foarte multe funcții distincte pentru a separa mai bine codul în părți mai mici pentru un troubleshooting mai ușor:
Cel mai mare algoritm din cod este cel pentru sortarea alarmelor: a trebuit să iau în calcul dacă alarma este setată pentru ziua de azi sau pentru ziua de mâine și să le ordonez corespunzător. Am făcut acest lucru pentru a face lucrul cu alarma mai ușor deoarece întotdeauna pe poziția alarme[0] voi avea alarma care trebuie să sune și pot compara timpul curent doar cu ea în loc să parcurg mereu vectorul de alarme pentru a afla care este urmatoarea. De asemenea acest algoritm mă ajută și la ștergerea alarmelor, deoarece ele fiind ordonate (și lista, chiar și “goală” este populată cu alarme setate la 25:61 care nu vor suna niciodată) pot reseta alarma și să o mut la finalul vectorului fără nici o problemă.
Detalii structurale:
Primul lucru ar fi faptul că ecranul LCD este folosit pentru a afișa un State Machine de sub-ecrane (care vor fi atașate sub această căsuță de text):
Ecranul principal pe care se află ora și data curentă, în “sus” se află ecranul cu numărul de alarme setate, “sub” ecranul cu data și ora se află ecranul cu informațiile de la senzorul de temperatură și umiditate. În “stânga” se află meniul de vizualizare a alarmelor, dacă există, un mesaj corespunzător dacă totuși există alarme atât setate dar și nesetate sau un mesaj dacă nu a fost setată nici o alarmă.
Butoanele au următoarele acțiuni în funcție de locul în care sunt apăsate:
Pe linia de ecrane principale (mijlocul), dacă se apasa pe joystick nu se întâmplă nimic, dacă se apasă butonul verde se stinge lumina de fundal a LCD-ului:
Pe linia din stânga, joystick-ul nu are efect iar butonul verde șterge și reordonează alarmele dacă aceasta este setată.
Pe ecranul din stânga joystick-ul incrementează sau decrementează ora sau minutul în funcție de ce se dorește a se schimba, iar apăsarea lui determină setarea orei sau minutului respective. Ordinea este următoarea: se modifică ora la cea dorită, se apasă joystick-ul, se modifică minutul la cel dorit, se apasă iar joystick-ul și când ora și minutul s-au resetat la 0, alarma a fost adaugată în listă. Pe acest ecran butonul verde nu are alte efecte.
Butonul verde oprește alarma atunci când sună indiferent de ecranul în care se află.
Surse și funcții implementate:
Funcțiile principale implementate sunt:
Funcția de ceas și afișare dată calendaristică
Funcția de termometru și afișare nivel umiditate
Funcția de alarmă și motiv de mișcare din pat
Funcție de mod Low-Power în care se stinge lumina de fundal a LCD-ului și în acest mod, când sună alarma, ceasul nu se mai mișcă, motoarele sunt dezactivate
Funcții și alte detalii pe care mi-aș fi dorit să le implementez:
Funcția de selecție a melodiei alarmei
Funcția de selecție a numărului de alarme sau creearea dinamică a acestui vector
Construcția unui cadru mai “profesional” pentru ceas și componente
Reproiectarea mai eficientă a componentelor pentru a eficientiza energia consumată (de ex foloisrea doar a microprocesorului în locul întregii plăcuțe Arduino) și/sau PCB-uri custom
Sursele de inspirație au fost diverse soluții căutate pe Google și GitHub dar și în documentațiile componentelor folosite
Rezultate Obţinute
În cadrul acestui proiect consider că am obținut tot ceea ce mi-am propus la început, chiar dacă rezultatul final arată ca un tun folosit în timpul unui război. Am reuși să implementez așa cum mi-am dorit funcționalitatea alarmelor și să folosesc (consider eu) intuitiv joystick-ul pentru o utilizare mai facilă a (deși cu câteva bug-uri) a ceasului.
Un astfel de bug de care nu am reușit încă să scap este faptul ca prin miscarea joystick-ului pot sari 2 ecrane odată: de exemplu din ecranul de afișare alarme pot sări direct în ecranul de setare alarme, fără să mai trec și prin cel cu ora și data.
Mai jos voi atașa poze cu proiectul finalizat:
Videoclipuri
Concluzii
Realizarea proiectului a fost atât o provocare dar și un prilej de a testa de ce sunt capabil. În final consider că am realizat un proiect satisfăcător și care să respecte cerințele impuse asupra lui. Mi-a plăcut să învăț să interfațez diverse module cu Arduino și să testez limitele acestuia (am folosit toți pinii disponibili pe un Arduino Uno). Dacă ar trebui sa reîncep un astfel de proiect cu siguranță primul pas ar fi prototiparea și realizarea șasiului înainte de toate .
Jurnal
Aici voi atașa câteva imagini cu diversele stadii prin care a trecut proiectul înainte să ajungă la stadiul la care se află acum: