Proiectul este destinat inregistrarii anumitor date din atmosfera inconjuratoare prin intermendiul mai multor senzori specializati. Acesti senzori pot inregistra date precum umiditatea, temperatura si gradul de fum care este prezent in atmosfera, acestea urmand sa fie afisate pe un LCD impreuna cu un grafic al anumitor inregistrar. Mai mult, datale inregistrate in ultima ora se vor memora prin intermediul unui modul MicroSD si al unui card de 32GB care va fi conectat la sistem.
Acesta are scopul de a:
Ideea proiectului a pornit din dorinta de a crea un dispozitiv care poate inregistra simultan mai multe date despre atmosfera inconjuratoare. Astfel, acest sistem cu mai multi senzori mi s-a parut o idee interesanta, pentru a putea monitoriza oricand, cu usurinta, numerosi indici legati de atmosfera din casa. Mai mult, scurgerile de gaze si incendiile reprezinta o cauza importanta a numeroase incidente, mai ales in locuintele private, asa ca acest sistem se va dovedi foarte util.
Avand in vedere ca in aceasta era tehnologica strangerea de date este cruciala pentru buna functionare a oricarui sistem, necesitatea unui inregistrator de date este facila si poate fi folosit de catre oricine in orice conditii. Mai mult, consider ca acest sistem este util pentru prevenirea incendiilor si pentru atentionarea la aparitia temperaturilor severe sau aparitia unui nivel de gaze periculos.
Proiectul consta in atasarea si conectarea mai multor senzori care inregistreaza date din atmosfera inconjuratoare. Senzorul de temperatura va trimite date direct, prin intermediul protocolului de I2C, catre ecran, urmand sa se genereze si un grafic al inregistrarilor. Aceste inregistrari sunt retinute cu ajutorul unui modul MicroSD si a unui card SD de 32GB. Senzorii de umiditate si de fum vor fi de asemenea conectati la LCD pentru a trimite date catre acesta. De asemenea, sistemul va contine si un buzzer care se va activa in momentul in care senzorul de fum va detecta o valoare peste pragul maxim admis. Pentru acuratete, datele livrate de catre detectorul de fum prin intermediul unui pin analogic vor fi citite cu ajutorul unui ADC care este controlat prin setarea anumitor registri.
Produsele folosite in implementarea hardware a proiectului sunt:
In aceasta functie se seteaza pinii corespunzatori pe in sau pe out, se initializeaza LCD-ul si baude rate-ul. De asemenea, aici se verifica si daca operatiile facute pe cardul SD sunt corecte.
// initializarea pinilor, output pentru led-uri si buzzer si input pentru senzori pinMode(greenLed, OUTPUT); pinMode(redLed, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(smokeA0, INPUT); pinMode(data_pin, OUTPUT); // setare lcd lcd.init(); lcd.clear(); lcd.backlight(); if (SD.begin(sd_cs)) { Serial.println("SD card initialization successful."); } else { Serial.println("SD card initialization failed."); return; } File data_file = SD.open("data.txt", FILE_WRITE);
De asemenea, aici se seteaza si registrele folosite pentru a initializa ADC-ul cu care se citeste de pe pinul anbalogic valoarea data de catre senzorul de fum
// setup-ul pentru citirea pinului smokeA0 folosind registri si ADC ADMUX = 0; // setez canalul 1 pentru multiplexor ADMUX |= (0 << MUX0); ADMUX |= (1 << REFS0); ADCSRA = 0; // prescaler la 128 ADCSRA |= (7 << ADPS0); // enable ADC ADCSRA |= (1 << ADEN);
// initializez lcd-ul LiquidCrystal_I2C lcd(0x27, 16, 2); // initializez modulul de DHT11 dht DHT;
// Valoarea de threshold care poate fi modificata int sensorThres = 94; // fisierul deschis pe cardul SD de unde iau valorile File data_file; // pinul digital dupa care citesc valoarea senzorului de temperatura int data_pin = 8;
LCD-ul este initializat cu ajutorul laboratorului 6 de I2C care este un protocol de comunicatie. Cele mai importante linii ale magistralei I2C sunt SDA(linia de date) si SCL(linia pentru clock). Ambii pini de SDA si SCL sunt conectati la pinii speciali de pe placuta, intrucat aceasta este deja configurata pentru acest protocol.
// setare initiala LCD lcd.init(); lcd.clear(); lcd.backlight(); lcd.begin(16, 2); lcd.setCursor(0, 0);
Legatura cu cardul SD este realizata prin intermediul protocolului de SPI care are 4 semnale:
data_file = SD.open("data.txt", FILE_WRITE); // scrierea se face la fiecare iteratie si se opreste in momentul in care se termina tot programul data_file.print("AS:"); data_file.print(analogSensor); data_file.println(","); // inchid fisierul data_file.close();
Senzorul de temperatura si umiditate DHT11 trebuie sa fie initializat, iar dupa accea, se citesc datele de pe pinul digital asociat acestuia folosindu-se 2 functii specifice bibliotecii dht.h. Ulterior, acestea sunt printate pe lcd si pe baza inregistrarilor se vor genera graficele.
// initializez senzorul dht DHT; // citesc datele date de catre senzor de pe pinul setat int read_data = DHT.read11(data_pin); // inregistrez temperatura si umiditate float temp = DHT.temperature; float umid = DHT.humidity; lcd.print(static_cast<float>(temp), 0); lcd.print(static_cast<float>(umid), 1);
Toate aceste calcule sunt realizate in interiorul unui if care numara intervale de doua secunde fara a folosi o functie de delay generala pe toata functia de loop. Daca am folosi un delay, atunci si sunetul buzzer-ului ar trebuie sa fie intrerupt o data la doua secunde, ceea ce nu este de dorit. Aceasta solutie este aleasa deoarece conform datasheet-ului, senzorul DHT11 are nevoie de 2 secunde intre inregistrari pentru a se calibra intern.
unsigned long currMill = millis(); if (currMill - prevMill >= interval) { prevMill = currMill; }
Senzorul de fum MQ-135 este folosit pentru a inregistra nivelul de fum din atmosfera. Acesta foloseste ADc pentru a citi de pe pinul analogic. De asemenea, la acest senzor este conectat un buzzer care este implementat pentru a se activa in momentul in care se depaseste o valoare de threashold care poate fi modificata din cod
int sensorThres; while (!(ADCSRA & (1 << ADIF))); uint16_t analogSensor = ADC; // daca media calculata cu inregistrarile senzorului depaseste // pargul admis, atunci se activeaza buzzerul, altfel nu if (static_cast<float>(sum) / count > sensorThres) { // aprind becul digitalWrite(redLed, HIGH); digitalWrite(greenLed, LOW); // buzzer tone(buzzer, 1000, 200); } else { digitalWrite(redLed, LOW); digitalWrite(greenLed, HIGH); noTone(buzzer); }
Laboratoarele folosite sunt: I2C, ADC, SPI, UART.
Semnalul generat de catre senzorul de fum in momentul in care este supus unei surse de gaz:
Semnalul generat de catre senzorul de temperatura si umiditate in cazul in care acesta inregistreaza:
De asemenea, este interesant de mentionat si cum arata output-ul generat in fisierul de pe cardul SD:
AS: 78, AS: 78, AS: 78, AS: 78, AS: 78, AS: 78,
Acest proiect a fost foarte interesant pentru ca nu ne lovim in fiecare zi de problema implementarii unui sistem cu tot cu partea de hardware. Lucrul cu care am ramas din acest proiect este ca este foare important sa iti cunosti piesele si tool-urile cu care lucrezi si sa nu te arunci in a implementa pana nu citesti cu atentie documnetatia despre piesa respectiva. De asemenea, proiectul a adus si o satisfactie in momentul in care puteai sa zici ca inregistrarile pe care le primeai erau facut aproape integral de catre tine.
Un alt lucru cu care am ramas dupa acest proiect este ca nu este obligatoriu ca soft-ul sa fie bun pentru ca si hardware-ul sa fie bun. Am invatat ca sunt doua entitati separate care trebuie tratate si separat si impreuna pentru buna functionare a proiectului.
24.04.2023 - Achizitie piese
16.05.2023 - Finalizare etapa hardware
25.05.2023- Finalizare etapa software
28.05.2023 - finalizare pagină documentație