This is an old revision of the document!
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:
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);
}
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.