Proiectul consta in proiectarea unui Dispozitiv Multifunctional care va afisa ora si data curenta in functie de localizare, informatii pe care le va accesa de pe internet. In cazul in care nu are acces la internet, acesta va avea si un ceas de timp real. Sincronizarea se face automat la ora 12 noaptea.
Mai mult decat atat, ceasul va afisa o data la cateva secunde pe ecran un ceas analog, unul digital si informatiile citite de senzorul de presiune atmosferica, cel de temperatura si cel de umiditate. Acest afisaj se poate schimba si prin apasarea unui buton. Datele intoarse de senzori vor fi puse pe un server web la fiecare minut (ThingsSpeak) unde vor fi desenate si grafice pentru date, astfel avand acces si remote la acestea. Prin intermediul modulului bluetooth o sa trimit datele si pe telefon.
Ceasul poate avea si o alarma setata de pe telefon. Acest lucru se realizeaza prin intermediul modulului bluetooth. Cand ora si minutul trimise de pe telefon reprezinta timpul curent, se va aprinde un led si va suna un buzzer timp de 5 secunde.
Schema bloc:
Mod de functionare:
ESP-ul interoghraza senzorul de temperatura si umiditate si cel de presiune atmosferica doar cand e in ecranul care le afiseaza. Definesc 3 ecrane, 1 pentru afisarea unui ceas analog, 1 pentru afisarea cesului digital impreuna cu data si locatia si 1 pentru temperatura, presiunea aerului si umiditate. Acestea sunt schimbate la un interval de 5 secunde. Sincronizarea timpului se realizeaza la ora 12 seara si la pornirea ceasului. Datele colectate de senzori sunt transmise pe server o data pe minut. Prin modulul bluethooth se poate seta de pe telefon o ora la care ceasul sa simuleze o alarma aprinzand un led si sunand dintr-un buzzer.
Schema a fost realizata in Fritzing
Mediu de dezvoltare: Arduino IDE
Biblioteci:
Structura folosita de IPGeolocation: struct IPGeo {
String tz; int offset; String city; String country; String country_code; bool is_dst; double latitude; double longitude;
};
Explicarea codului:
Folosind functiile implementate in clasa OLEDDisplay am reusit sa afisez un ceas analog:
Code snippet:
void analogClockFrame(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
display->drawCircle(clockCenterX + x, clockCenterY + y, 2); // cercul mic din care pleaca limbile ceasului for (int h = 0; h < 12; h++) { float angle = h * 30; angle = angle * PI / 180; // grade in radiansi int x1 = clockCenterX + x + (int)(sin(angle) * (clockRadius - 2)); int y1 = clockCenterY + y - (int)(cos(angle) * (clockRadius - 2)); int x2 = clockCenterX + x + (int)(sin(angle) * clockRadius); int y2 = clockCenterY + y - (int)(cos(angle) * clockRadius); // afisez ora doar pentru 3 6 9 12, altfel pun o liniuta if (h == 0) display->drawString(x1, y1 -2, "12"); else if (h == 3) display->drawString(x1 + 2, y1, "3"); else if (h == 6) display->drawString(x1, y1 + 2, "6"); else if (h == 9) display->drawString(x1 - 2, y1, "9"); else display->drawLine(x1, y1, x2, y2); } // limba ceasului pentru secunde float angle = secunda * 6 ; angle = angle * PI / 180; ; // grade in radiansi int x3 = ( clockCenterX + ( sin(angle) * ( clockRadius - 5 ) ) ); int y3 = ( clockCenterY - ( cos(angle) * ( clockRadius - 5 ) ) ); display->drawLine( clockCenterX + x , clockCenterY + y , x3 + x , y3 + y); // limba ceasului pentru minute angle = minut * 6 ; angle = angle * PI / 180 ; x3 = ( clockCenterX + ( sin(angle) * ( clockRadius - 8 ) ) ); y3 = ( clockCenterY - ( cos(angle) * ( clockRadius - 8 ) ) ); display->drawLine( clockCenterX + x , clockCenterY + y , x3 + x , y3 + y); // limba ceasului pentru ora angle = ora * 30 + (int)(minut/2); angle = angle * PI / 180 ; x3 = ( clockCenterX + ( sin(angle) * ( clockRadius - 11 ) ) ); y3 = ( clockCenterY - ( cos(angle) * ( clockRadius - 11 ) ) ); display->drawLine( clockCenterX + x , clockCenterY + y , x3 + x , y3 + y);
}
In final, proiectul arata asa fara carcasa:
In final, poriectul arata asa cu carcasa:
Dispozitivul Multifunctional este un obiect destul de folositor. Pe langa timp, dispozitivul afiseaza si data, tara si orasul in care te afli, dar si date utile despre mediul din camera in care stai precum temperatura, umiditatea si presiunea aerului. Datele acestea sunt trimise pe un server web unde se deseneaza grafice pentru a vedea cum evolueaza/ fluctueaza aceste informatii. Pentru un confort adus utilizatorului, daca acesta vrea sa isi seteze o alarma, acest lucru se poate realiza foarte usor si rapid cu ajutorul telefonului si a conexiunii bluetooth. Datele pot fi acesate remote si de pe telefon(unde sunt trimise prin bluetooth), dar si online accesand serverul web unde sunt trimise.
Proiectul a fost interesant de implementat si m-a ajutat sa imi fixez notiunile pe care le-am dobandit la laboratorul de PM mai bine. De la simpla idee de la care am plecat, am ajuns sa imi adaug noi functionalitati pe parcurs, deoarece chiar mi-a placut sa fac acest proiect.
Resurse Hardware:
Resurse software: