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 pentru afisarea unor sumarizari ale datelor preluate la un interval fix (initial se planuia realizarea unor grafice care sa ilustreze istoricul acestor date, din pacate constrangerile de memorie ale placutei nu au permis acest lucru)
  • Prin intermediul unui modul bluetooth, se va permite si accesul exterior la aceste date
  • Proiectul este util din punct de vedere al posibilitatilor de monitorizare (de exemplu la nivelul unei camere)

Descriere generală

  1. 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

pm/prj2021/cghenea/radumustatea.1622574973.txt.gz · Last modified: 2021/06/01 22:16 by radu_ioan.mustatea
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0