This shows you the differences between two versions of the page.
pm:prj2021:avaduva:room-monitor [2021/04/28 19:21] dumitru.stratone |
pm:prj2021:avaduva:room-monitor [2021/06/04 20:05] (current) dumitru.stratone |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Room Monitor ====== | ====== Room Monitor ====== | ||
+ | |||
+ | ===== Introducere ===== | ||
+ | |||
+ | Room monitor confera utilizatorului detalii despre starea camerei in care se afla. | ||
+ | |||
+ | Aceste detalii includ: | ||
+ | * temperatura si umiditatea din camera | ||
+ | * calitatea aerului | ||
+ | * intensitatea luminii | ||
+ | * nivelul de zgomot | ||
+ | * daca exista scurgeri de gaz sau nu | ||
+ | |||
+ | In aceasta perioada, cand multi oameni lucreaza de acasa, conditiile din camera | ||
+ | de lucru au devenit si mai importante pentru sanatate. | ||
+ | |||
+ | ===== Descriere generală ===== | ||
+ | {{ :pm:prj2021:avaduva:schema_bloc_room_monitor.png?800 |}} | ||
+ | |||
+ | Initial, pentru 2 minute, se incalzesc senzorul de gaz si cel de calitate a aerului. | ||
+ | |||
+ | Apoi se face prima citire a senzorilor, iar datele sunt afisate pe lcd. | ||
+ | |||
+ | Pentru a economisi curent, lcd-ul se va inchide daca nu este detectata miscare in proximitate | ||
+ | |||
+ | Sensorul PIR si cel de gaz sunt consultati la fiecare secunda, data fiind importanta lor. | ||
+ | |||
+ | Ceilalti sensori sunt consultati la fiecare 5 minute, cand se face(optional) si flush pe seriala a datelor. | ||
+ | |||
+ | ===== Hardware Design ===== | ||
+ | |||
+ | === Lista componente === | ||
+ | - [[https://cleste.ro/senzor-pir-hc-sr501.html|Sensor PIR]] | ||
+ | - [[https://cleste.ro/modul-microfon-sensibilitate-inalta.html| Modul microfon]] | ||
+ | - [[https://cleste.ro/modul-buzzer-pasiv.html| Buzzer]] | ||
+ | - [[https://cleste.ro/led-rgb-5mm-4pini.html| Led catod comun]] | ||
+ | - [[https://cleste.ro/modul-senzor-lumina-intensitate-luminoasa.html| Modul intensitate luminoasa]] | ||
+ | - [[https://cleste.ro/senzor-detec-ie-metan-gaze-naturale-mq-5.html| Modul detectare gaz]] | ||
+ | - [[https://cleste.ro/modul-senzor-detector-gaz-mq-135.html| Modul detectare calitate aer]] | ||
+ | - [[https://cleste.ro/senzor-umiditate-si-temperatura-dht22.html| Senzor umiditate si temperatura]] | ||
+ | - [[https://cleste.ro/modul-lcd-1602-albastru-cu-butoane.html| Shield lcd]] | ||
+ | - Fire tata-tata, mama-tata, breadboard, rezistente. | ||
+ | |||
+ | ===== Software Design ===== | ||
+ | |||
+ | Codul arduino a fost dezvoltat in [[https://www.arduino.cc/en/software| Arduino IDE]] | ||
+ | |||
+ | Pe langa codul pentru microcontroler, am scris si un mic script in python care preia datele de pe seriala | ||
+ | si le scrie intr-un fisier. | ||
+ | |||
+ | ==== Biblioteci ==== | ||
+ | |||
+ | Am folosit in dezvoltarea pe microcontroller urmatoarele biblioteci third-party: | ||
+ | - [[https://www.arduino.cc/en/Reference/LiquidCrystal|Arduino LiquidCrystal Library]] | ||
+ | - [[https://www.arduino.cc/reference/en/libraries/dht-sensor-library/|Arduino DHT Sensor Library]] | ||
+ | |||
+ | Pentru "consumerul" de seriala, am folosit urmatorele biblioteci python: | ||
+ | - [[https://pyserial.readthedocs.io/en/latest/pyserial.html|Python serial]] | ||
+ | - [[https://docs.python.org/3/library/datetime.html|Python datetime]] | ||
+ | - [[https://docs.python.org/3/library/calendar.html|Python calendar]] | ||
+ | |||
+ | ==== Structuri de date ==== | ||
+ | |||
+ | Structura principala este numita room state si are urmatoare definitie: | ||
+ | |||
+ | <code> | ||
+ | typedef struct roomstate { | ||
+ | float temperature, humidity, heatIndex; | ||
+ | int airQuality; | ||
+ | int airQualityPercentage; | ||
+ | int lightIntensity; | ||
+ | int gasValue; | ||
+ | int motion; | ||
+ | int sound; | ||
+ | } RoomState; | ||
+ | </code> | ||
+ | |||
+ | Aici este tinuta starea camerei, la un moment dat. | ||
+ | |||
+ | ==== Functii implementate ==== | ||
+ | |||
+ | Functiile principale sunt urmatoarele: | ||
+ | <code> | ||
+ | void initSensors(); // Aici, timp de 2 secunde, se incalzesc cei 2 sensori de aer. | ||
+ | void flushRoomState(); // Aici structura de date principala este trimisa pe seriala. | ||
+ | void handleSensors(); // Un wrapper peste un agregat de functii mai mici care citesc fiecare senzor in parte. | ||
+ | void buzz(float seconds, int sign); // Functie pentru buzz. | ||
+ | void handleLCDScreen(); // Functie care imi afiseaza starea la lcd. | ||
+ | void printLCDDateTime(); // Functie care afiseaza pe lcd data si ora. | ||
+ | void printLCDTemperature(); // Functie care afiseaza pe lcd informatii despre temperatura. | ||
+ | void printLCDAirQuality(); // Functie care afiseaza pe lcd informatii despre calitatea aerului. | ||
+ | void loop(); // Citim sensorii, daca s-au implinit 5 minute, atunci dam flush. | ||
+ | </code> | ||
+ | |||
+ | Pe raspberry pi , daemon-ul care comunica cu seriala este pornit la boot (am modificat fisierul /etc/rc.local) | ||
+ | |||
+ | Codul python are urmatoarea structura: | ||
+ | |||
+ | <code> | ||
+ | ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1) // deschidem comunicarea | ||
+ | f = open("./usb/data", "a") // deschidem si fisierul pentru stocare | ||
+ | |||
+ | while True: | ||
+ | if ser.in_waiting > 0: | ||
+ | line = ser.readline().decode('utf-8').rstrip() | ||
+ | if line == "getHour": | ||
+ | // microcontrollerul cere ora | ||
+ | if line == "getDate": | ||
+ | // microcontrollerul cere data | ||
+ | if line == "flush": | ||
+ | // microcontrollerul doreste sa ne dea datele. | ||
+ | </code> | ||
+ | |||
+ | ===== Rezultate obtinute ===== | ||
+ | |||
+ | {{:pm:prj2021:avaduva:poza1_room_monitor.jpeg?300|}}{{:pm:prj2021:avaduva:poza2_room_monitor.jpeg?180|}} | ||
+ | {{:pm:prj2021:avaduva:poza3_room_monitor.jpeg?180|}} | ||
+ | |||
+ | ===== Concluzii ===== | ||
+ | |||
+ | Mi-a facut placere sa implementez acest proiect, deoarece am construit ceva care va ramane, pe care il folosesc. | ||
+ | O sa continui dezvoltarea, incercand sa il integrez cu aer conditionat si cu telefonul mobil. | ||
+ | |||
+ | ===== Download ===== | ||
+ | {{:pm:prj2021:avaduva:proiect_pm_room_monitor.zip| Arhiva proiectului}} | ||
+ | |||
+ | ===== Bibliografie ===== | ||
+ | *[[https://pyserial.readthedocs.io/en/latest/pyserial.html|Python serial]] | ||
+ | *[[https://www.arduino.cc/en/Reference/softwareSerial|Arduino serial]] | ||
+ | *[[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet]] | ||
+ | |||
+ | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> |