This is an old revision of the document!
Afisaje multiple LCD
Autor: Mustatea Radu-Ioan
Grupa: 333CA
Introducere
Prin intermediul a mai multi senzori, vor putea fi afisate pe un ecran LCD mai multe date, anume temperatura, umiditatea, presiunea si calitatea aerului (masurata prin PPM)
De asemenea, prin folosirea a unuia sau a mai multor butoane, se va putea comuta pe ecran si prin afisarea a unor grafice care sa ilustreze istoricul acestor date
Prin intermediul unui modul bluetooth, se va permite si accesul exterior la aceste date
Descriere generală
Schema bloc
Hardware Design
Componente:
Placuta Arduino UNO
Senzor RTC DS3231
Senzor BME280 de temperatura, presiune si umiditate
Senzor MQ-135 pentru masurarea calitatii aerului
Ecran LCD SPI de 2.8 inch, rezolutie 240×320
Modul bluetooth HC05
6 rezistente de 2.2K, 6 rezistente de 5.1K
3 butoane
Fire tata-tata, tata-mama
Breadboard
Varianta initiala presupunea si folosirea unui modul SD pentru salvarea datelor, din pacate biblioteca SD ocupa prea mult spatiu, astfel ca s-a renuntat la acesta
Cele 3 butoane sunt implementate clasic, folosindu-se rezistentele de pullup interne ale placutei
Senzorii DS3231 si BME280 sunt I2C, deci sunt conectati impreuna cu pinii A4 si A5 de pe Arduino
MQ135 trebuie legat la un pin analog (in cazul nostru A0)
Cele 3 module de pana acum pot fi conectate direct la 5V (fie au regulatoare interne, fie suporta logica de 5V)
Ecranul foloseste SPI, deci putem folosi chiar SPI-ul hardware din Arduino daca folosim pinii corespunzatori
Logica ecranului este de 3.3V, de asemenea el nu are regulatoare interne, astfel ca toti pinii cu exceptia VCC si GND necesita reducerea tensiunii de la 5 la 3.3V. Acest lucru se realizeaza prin divizoare de tensiune (folosind rezistente de 2.2K, respectiv 5.1K)
Similar si pentru modulul HC05, pe pinul RX este redusa la fel tensiunea de la 5V la 3.3V, acesta functionand tot cu logica de 3.3V
Software Design
Se folosesc bibliotecile Ucglib.h (pentru ecran), Adafruit_BME280.h (pentru senzorul BME280), RTClib.h (pentru senzorul RTC) si SoftwareSerial (pentru modulul HC05)
Pentru afisarea efectiva pe ecran, ne folosim de 4 macrouri de stari, anume NORMAL_STATE, MAX_STATE, MIN_STATE si AVG_STATE. Folosind un buton vom comuta printre acestea. In cazul NORMAL_STATE, vom afisa constant datele de la senzori, iar pentru celelalte stari afisam extremele sau mediile obtinute in urma inregistrarilor din istoric.
In cazul NORMAL_STATE, ne confruntam cu problema actualizarii foarte rapide a informatiei. Din cauza ca ecranul nu sterge caracterele scrise anterior atunci cand scriem unele noi in acelasi loc, avem nevoie de o tehnica pentru a masca acest neajuns. Tehnica presupune scrierea aceluiasi text vechi, insa folosind culoarea fundalului (in acest sens folosim string-urile oldTemp, oldBar, oldHum si oldAir), urmand ca apoi sa scriem textul nou. Problema este ca daca facem acest lucru pentru intreg textul, efectul asupra privitorului este unul obositor. Prin urmare, solutia consta in a modifica doar acele caractere care difera fata de iteratia trecuta. Pentru asta insa, trebuie sa ne asiguram ca toate caracterele au aceeasi latime in pixel (in biblioteca Ucglib, acest lucru nu e garantat). Pentru asta putem insa folosi asa numitele fonturi monospace, care asigura aceasta proprietate
Pentru istoric, ne folosim de vectori care retin datele preluate de la senzori (din pacate, neavand posibilitatea utilizarii unui modul SD, acest date sunt volatile). Datele sunt preluate din ora in ora. In acest sens, folosim senzorul RTC pentru a determina cand ne aflam la o ora fixa (!rtcMin), moment in care scriem datele preluate atunci in vectori. Tinem minte si cate date avem trecute in vectori (variabila writeCount). Avem doua butoane care functioneaza doar atunci cand nu ne aflam in starea uzuala si care ne permit marirea intervalului pentru care ne intereseaza o sumarizare a datelor, sau scaderea sa (intervalul e dat de numarul de ore). Variabila writeCount joaca deci un rol din punct de vedere al asigurarii ca nu vom incerca de exemplu sa afisam date pentru mai multe ore decat avem stocate
Nu in ultimul rand, avem nevoie de o comunicare cu modulul Bluetooth. Pentru asta, deschidem o conexiune seriala, prin care vom transmite datele la modul (la fel cum ar aparea pe ecran in starea normala). Pentru a nu trimite prea multe date pentru a putea fi percepute vizual corespunzator de catre un utilizator uman, trimiterea datelor prin Bluetooth se face doar la intervale regulate de timp (in cazul nostru 5 secunde)
Rezultate Obţinute
Concluzii
Download
Bibliografie/Resurse