Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2023:dene:cosmin-duta [2023/05/06 23:25]
cosmin_mihail.duta [Introducere]
pm:prj2023:dene:cosmin-duta [2023/05/30 14:31] (current)
cosmin_mihail.duta [Software Design - Descrierea codului aplicatiei]
Line 6: Line 6:
 Grupă: 331CC Grupă: 331CC
 </​note>​ </​note>​
 +
 +====== Introducere ======
 +În societatea modernă, poluarea reprezintă una dintre cele mai importante probleme cu care ne confruntăm. ​
 +Din cauza emisiilor de gaze toxice și a altor substanțe poluante, calitatea aerului poate fi afectată în mod semnificativ, ​
 +ducând la probleme de sănătate și la distrugerea mediului înconjurător.
 +Un sistem de înregistrare al fumului, temperaturii și umidității poate fi deosebit de util în lupta împotriva poluării. ​
 +Acest sistem poate monitoriza si detecta rapid nivelul de poluare dintr-o anumită zonă in doar cateva secunde.
 +De asemenea, poate fi folosit pentru a evalua impactul unui anumit proces sau eveniment asupra mediului înconjurător.
 +Într-o lume în care mediul înconjurător este tot mai vulnerabil, aceste sisteme sunt mai importante ca niciodată.
 ====== Descriere ====== ====== Descriere ======
 Sistem ce determina temperatura,​ umiditatea, calitatea aerului dintr-o incapere. Sistemul va avea un modul Bluetooth pentru a verifica toti parametrii de pe telefon. Totodata, daca temperatura,​ umiditatea sau nivelul calitatii aerului ies din limita admisa, sistemul trebuie sa notifice prin MAIL. Avertizarea se va face prin aprinderea LED-urilor corespunzatoare. Sistem ce determina temperatura,​ umiditatea, calitatea aerului dintr-o incapere. Sistemul va avea un modul Bluetooth pentru a verifica toti parametrii de pe telefon. Totodata, daca temperatura,​ umiditatea sau nivelul calitatii aerului ies din limita admisa, sistemul trebuie sa notifice prin MAIL. Avertizarea se va face prin aprinderea LED-urilor corespunzatoare.
Line 30: Line 39:
 </​note>​ </​note>​
  
-====== Hardware Design: ​Schema Electrica ======+===== Hardware Design: ​Montajul ​=====
  
-<note tip>+{{:​pm:​prj2023:​dene:​whatsapp_image_2023-05-19_at_19.04.57.png?​650|}}
  
 +
 +
 +
 +===== Hardware Design: Schema Electrica =====
 +<note tip>
 Am realizat conectarea pieselor in felul urmator: Am realizat conectarea pieselor in felul urmator:
 Pe placa Arduino Uno am pus shield-ul Ethernet, iar pe shield-ul Ethernet am pus placa de expansiune pentru senzori. ​ Pe placa Arduino Uno am pus shield-ul Ethernet, iar pe shield-ul Ethernet am pus placa de expansiune pentru senzori. ​
- 
  
 Ecranul LCD se conecteaza astfel: Ecranul LCD se conecteaza astfel:
- * GND la G din zona pinului analog A5 +  ​* GND la G din zona pinului analog A5 
- * VCC la V din zona pinului analog A5 +  * VCC la V din zona pinului analog A5 
- * SDA la S din zona pinului analog A4 +  * SDA la S din zona pinului analog A4 
- * SCL la S din zona pinului analog A5+  * SCL la S din zona pinului analog A5
  
 +Senzorul MQ135 se conecteaza astfel:
 +  * GND la G din zona pinului analog A0
 +  * VCC la V din zona pinului analog A0
 +  * D0 se lasă liber
 +  * A0  la S din zona pinului analog A0
  
 +Senzorul DHT11 se conecteaza astfel:
 +  * PIN1 reprezinta VCC la V din zona pinului digital D3
 +  * PIN2 reprezinta DATA la S din zona pinului digital D3
 +  * PIN3 se lasă liber
 +  * PIN4 reprezintă GND și se conectează la G din zona pinului digital D3
  
-Senzorul MQ135 se conecteaza astfel: +Modulul Bluetooth ​se conecteaza astfel: 
- ​* ​GND la G din zona pinului analog A0 +  PIN1 STATE se conecteaza ​la GND 
- ​* ​VCC la V din zona pinului analog A0 +  PIN2 RXD se conecteaza ​la D1/TX 
- * D0 se lasă liber +  PIN3 TXD se conecteaza la D0/RX 
- ​* ​A0  ​la ​S din zona pinului analog A0+  * PIN4 GND se conecteaza la GND 
 +  PIN5 VCC se conecteaza la VCC 
 +  * PIN6 EN se conecteaza ​la 3V3
  
 +Conectarea LED-urilor:
 +  * LED-ul alb se conecteaza la GND si V la pinul digital 1 => sistemul este ON
 +  * LED-ul rosu se conecteaza la GND si S pe pinul digital 2 => parametrii depasesc limita maxima setata ​
  
  
-Senzorul DHT11 se conecteaza astfel: 
- * PIN1 reprezinta VCC la V din zona pinului digital D3 
- * PIN2 reprezinta DATA la S din zona pinului digital D3 
- * PIN3 se lasă liber 
- * PIN4 reprezintă GND și se conectează la G din zona pinului digital D3 
  
 +{{:​pm:​prj2023:​dene:​schema-electrica.png?​650|}}
 +
 +{{:​pm:​prj2023:​dene:​schema-electrica2.png?​650|}}
  
  
-Conectarea LED-urilor: 
- * LED-ul alb se conecteaza la GND si V la pinul digital 1 => sistemul este ON 
- * LED-ul rosu se conecteaza la GND si S pe pinul digital 2 => parametrii depasesc limita maxima setata ​ 
 </​note>​ </​note>​
  
-===== Software Design: Libraries ===== 
-<note tip> 
-Librarii folosite: 
-  * Dht11.h 
-  * Wire.h 
-  * LiquidCrystal_I2C.h 
-  * SPI.h 
-  * Ethernet.h ​ 
-  * SD.h  
  
 +
 +
 +===== Software Design -  Descrierea codului aplicatiei =====
 +
 +
 +<note tip>
 +Descrierea codului aplicaţiei (firmware):
 +  * Importam librariile necesare
 +  * Consideram in momentul de start ca aerul este normal
 +  * Introducem o adresa MAC unica si o adresa IP
 +  * Initializam LCD-ul
 +  * Aer normal in jur de 120-150 (peste 150 posibil sa existe fum)
 +  * Afisam temperatura pe LCD
 +  * Afisam umiditatea pe LCD
 +  * Afisam nivelul de fum pe LCD (afisam Normal sau FUM pe LCD)
 +  * Stabilim valorile de alerta
 </​note>​ </​note>​
  
 +===== Software Design -  Descrierea codului aplicatiei =====
  
  
 +<note tip>
 +
 +/*Importam librariile necesare*/
 +#include <​dht11.h>​
 +#include <​Wire.h> ​
 +#include <​LiquidCrystal_I2C.h>​
 +
 +#include <​SPI.h>​
 +#include <​Ethernet.h>​
 +#include <​SD.h>​
 +
 +LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); ​
 +
 +dht11 DHT11;
 +#define DHT11PIN 3
 +
 +int sensorValue;​
 +int alb = 1; // led alb pe pin digital 1
 +int rosu = 2; // led alb pe pin digital 2
 +int t;
 +int h; 
 +String aer = "​Normal";​ // consideram in momentul de start ca aerul este normal
 +
 +// Introducem o adresa MAC unica si o adresa IP
 +byte mac[] = {
 +  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
 +};
 +IPAddress ip( 192, 168, 0, 123 ); 
 +IPAddress gateway( 192, 168, 0, 1 );
 +IPAddress subnet( 255, 255, 255, 0 );
 +IPAddress DNSserver(192,​168,​0,​1);​
 +
 +
 +char server[] = "​mail.smtp.ro"; ​ //aici trebuie schimbat cu serverul vostru de smtp - gmail
 +int port = 587; //  porturile 25, 8025 sau 587.
 +
 +File myFile;
 +
 +EthernetClient client;
 +int c = 1; //contor de intarziere
 +int k=0; //contor de verificare timp alarma
 +
 +void setup() ​
 +{
 +lcd.begin(16,​2);​ // initializam LCD-ul
 +
 +  pinMode(alb,​ OUTPUT); ​
 +  pinMode(rosu,​ OUTPUT);
 +
 +  digitalWrite(rosu,​ HIGH);
 +  digitalWrite(alb,​ HIGH);
 +
 +Serial.begin(115200); ​
 +pinMode(4,​OUTPUT);​
 +digitalWrite(4,​HIGH);​
 +Ethernet.begin(mac,​ ip, gateway, DNSserver, subnet);
 +delay(2000);​
 +Serial.println(Ethernet.localIP());​
 +Serial.println(F("​Gata! Apăsati '​e'​ pentru a trimite mail"​));​ // metoda manuala de trimis mail de test din Serial Monitor
 +  ​
 +}
 +
 +void loop() ​
 +{
 +  ​
 +byte inChar;
 +
 +  inChar = Serial.read();​
 +
 +  if(inChar == '​e'​)
 +  {
 +    if(sendEmail()) Serial.println(F("​Email trimis"​));​
 +    else Serial.println(F("​Eroare trimitere Email"​));​
 +  }
 +  ​
 +  ​
 +  afisare_info();​ // apelam functia de afisare a informatiilor pe LCD
 +  ​
 +}
 +
 +void afisare_info(){
 +   ​DHT11.read(DHT11PIN);​ // citim valorile senzorului DHT11
 +  sensorValue = analogRead(0);​ // se citeste valoarea senzorului de fum
 +//  //aer normal in jur de 120-150
 +//  //peste 150 posibil sa existe fum
 +
 +  t = (float)DHT11.temperature,​ 2;
 +  h = (float)DHT11.humidity,​ 2;
 +
 +  //afisam temperatura pe LCD
 +  lcd.clear();​
 +  lcd.setCursor(0,​ 0);
 +  lcd.print("​Temp:​ ");
 +  lcd.print(t);​
 +  lcd.print((char)223);​
 +  lcd.print("​C"​);​
 +  ​
 +  //afisam umiditatea pe LCD
 +  lcd.setCursor(0,​ 1);
 +  lcd.print("​Umid:​ ");
 +  lcd.print((float)DHT11.humidity,​ 2);
 +  lcd.print("​ %");
 +
 +  delay(2000);​
 +  //afisam nivelul de fum pe LCD
 +  lcd.clear();​
 +  lcd.setCursor(0,​ 0);
 +  lcd.print("​Nivel fum: ");
 +  lcd.print(sensorValue);​
 +
 +  //si afisam Normal sau FUM pe LCD
 +  lcd.setCursor(0,​ 1);
 +  lcd.print("​Aer:​ ");
 +    if(sensorValue>​150){
 +     ​lcd.print("​FUM!"​);​
 +     aer = "​FUM!";​ // daca senzorul a detectat FUM, variabila "​aer"​ devine FUM
 +  }else{
 +    lcd.print("​Normal"​);  ​
 +    aer = "​Normal";​
 +  }
 +
 +  //Aici se stabilesc valorile de alerta:
 +
 +  //verificam daca unul din parametri a depasit limita maxima sau daca a fost detectat deja FUM
 +  if(aer == "​FUM!"​ || t >= 25 || h >= 80){
 +      digitalWrite(rosu,​ HIGH);
 +     ​digitalWrite(alb,​ LOW);
 +  }else{
 +    digitalWrite(alb,​ HIGH);
 +    digitalWrite(rosu,​ LOW);
 +  }
 +
 +
 +  if(c>​10){ // la pornire lasam 20 de secunde sa se stabilizeze senzorii, dupa care trimitem alerte daca sunt probleme
 +    // am pus 10 pentru ca mai jos este delay de 2000 (10*2000=20secunde)
 +  if(aer == "​FUM!"​ || t >= 25 || h >= 80){
 +    k++; // contor ce numara de cate ori se inregistreaza eroare.
 +    if(k>​=30){ //daca timp de 60 secunde este alarma, se trimite mail
 +     ​if(sendEmail_alerta()) Serial.println(F("​Email trimis"​));​
 +    else Serial.println(F("​Eroare trimitere Email"​));​
 +    k=0; // resetam contorul daca s-a trimis mail
 +    }
 +  }
 +  }else{
 +    c++;
 +  }
 +delay(2000);​
 +}
 +
 +//functia de mai jos trimite mail la cerere din Serial Monitor, apasand tasta '​e'​
 +byte sendEmail()
 +{
 +  byte thisByte = 0;
 +  byte respCode;
 +
 +  if(sensorValue>​150){ ​    
 +     aer = "​FUM!";​
 +  }else{ ​   ​
 +    aer = "​Normal";​
 +  }
 +  //Codul de conectare la serverul de smtp si trimitere mail este preluat de aici:
 +  // https://​www.smtp2go.com/​setupguide/​arduino/​
 +
 +  if(client.connect(server,​port) == 1) {
 +    Serial.println(F("​connected"​));​
 +  } else {
 +    Serial.println(F("​connection failed"​));​
 +    return 0;
 +  }
 +
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending hello"​));​
 +// replace 1.2.3.4 with your Arduino'​s ip
 +  client.println("​EHLO 1.2.3.4"​);​
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending auth login"​));​
 +  client.println("​auth login"​);​
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending User"​));​
 +// Change to your base64 encoded user
 +  client.println(F("​user criptat Base64 aici"​)); ​
 +
 +
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending Password"​));​
 +// change to your base64 encoded password
 +  client.println(F("​parola criptata Base64 aici"​)); ​
 +
 +
 +  if(!eRcv()) return 0;
 +
 +// change to your email address (sender)
 +  Serial.println(F("​Sending From"​));​
 +  client.println("​MAIL From: <​expeditor@cevreitu.ro>"​);​
 +  if(!eRcv()) return 0;
 +
 +// change to recipient address
 +  Serial.println(F("​Sending To"));
 +  client.println("​RCPT To: <​destinatar@cevreitu.ro>"​);​
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending DATA"​));​
 +  client.println("​DATA"​);​
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending email"​));​
 +
 +// change to recipient address
 +  client.println("​To:​ Destinatar <​destinatar@cevreitu.ro>"​);​
 +
 +// change to your address
 +  client.println("​From:​ Camera Server <​cameraserver@cevreitu.ro>"​);​
 +
 +  client.println("​Subject:​ Date termice Camera Server"​); ​
 +
 +      client.print("​Date termice Camera Server:"​); ​
 +      client.println(""​);​
 +      client.print("​Temperatura:​ ");
 +      client.print(t);​
 +      client.print("​ C");
 +      client.println(""​);​
 +      client.print("​Umiditatea:​ ");
 +      client.print((float)DHT11.humidity,​ 2);
 +      client.println(""​);​
 +      client.print("​Nivel fum: ");
 +      client.print(sensorValue);​
 +      client.println(""​);​
 +      client.print("​Aer:​ ");
 +      client.print(aer);​
 +      client.println(""​);​
 +          ​
 +client.println("​."​);​
 +
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending QUIT"​));​
 +  client.println("​QUIT"​);​
 +  if(!eRcv()) return 0;
 +
 +  client.stop();​
 +
 +  Serial.println(F("​disconnected"​));​
 +
 +  return 1;
 +}
 +
 +//functia de mai jos trimite mail cand este detectata o alarma
 +byte sendEmail_alerta()
 +{
 +  byte thisByte = 0;
 +  byte respCode;
 +
 +  if(sensorValue>​150){ ​    
 +     aer = "​FUM!";​
 +  }else{ ​   ​
 +    aer = "​Normal";​
 +  }
 +  ​
 +  if(client.connect(server,​port) == 1) {
 +    Serial.println(F("​connected"​));​
 +  } else {
 +    Serial.println(F("​connection failed"​));​
 +    return 0;
 +  }
 +
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending hello"​));​
 +// replace 1.2.3.4 with your Arduino'​s ip
 +  client.println("​EHLO 1.2.3.4"​);​
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending auth login"​));​
 +  client.println("​auth login"​);​
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending User"​));​
 +// Change to your base64 encoded user
 +  client.println(F("​user criptat Base64 aici"​)); ​
 +
 +
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending Password"​));​
 +// change to your base64 encoded password
 +  client.println(F("​parola criptata Base64 aici"​)); ​
 +
 +
 +  if(!eRcv()) return 0;
 +
 +// change to your email address (sender)
 +  Serial.println(F("​Sending From"​));​
 +  client.println("​MAIL From: <​cameraserver@cevreitu.ro>"​);​
 +  if(!eRcv()) return 0;
 +
 +// change to recipient address
 +  Serial.println(F("​Sending To"));
 +  client.println("​RCPT To: <​destinatar@cevreitu.ro>"​);​
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending DATA"​));​
 +  client.println("​DATA"​);​
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending email"​));​
 +
 +// change to recipient address
 +  client.println("​To:​ Destinatar <​destinatar@cevreitu.ro>"​);​
 +
 +// change to your address
 +  client.println("​From:​ Camera Server <​cameraserver@cevreitu.ro>"​);​
 +
 +  client.println("​Subject:​ ALERTA CAMERA SERVER!!!"​); ​
 +
 +      client.print("​Date termice Camera Server:"​); ​
 +      client.println(""​);​
 +      client.print("​Temperatura:​ ");
 +      client.print(t);​
 +      client.print("​ C");
 +      client.println(""​);​
 +      client.print("​Umiditatea:​ ");
 +      client.print((float)DHT11.humidity,​ 2);
 +      client.println(""​);​
 +      client.print("​Nivel fum: ");
 +      client.print(sensorValue);​
 +      client.println(""​);​
 +      client.print("​Aer:​ ");
 +      client.print(aer);​
 +      client.println(""​);​
 +          ​
 +client.println("​."​);​
 +
 +  if(!eRcv()) return 0;
 +
 +  Serial.println(F("​Sending QUIT"​));​
 +  client.println("​QUIT"​);​
 +  if(!eRcv()) return 0;
 +
 +  client.stop();​
 +
 +  Serial.println(F("​disconnected"​));​
 +
 +  return 1;
 +}
 +
 +byte eRcv()
 +{
 +  byte respCode;
 +  byte thisByte;
 +  int loopCount = 0;
 +
 +  while(!client.available()) {
 +    delay(1);
 +    loopCount++;​
 +
 +// if nothing received for 10 seconds, timeout
 +    if(loopCount > 10000) {
 +      client.stop();​
 +      Serial.println(F("​\r\nTimeout"​));​
 +      return 0;
 +    }
 +  }
 +
 +  respCode = client.peek();​
 +
 +  while(client.available())
 +  { 
 +    thisByte = client.read(); ​
 +    Serial.write(thisByte);​
 +  }
 +
 +  if(respCode >= '​4'​)
 +  {
 +    efail();
 +    return 0; 
 +  }
 +
 +  return 1;
 +}
 +
 +
 +void efail()
 +{
 +  byte thisByte = 0;
 +  int loopCount = 0;
 +
 +  client.println(F("​QUIT"​));​
 +
 +  while(!client.available()) {
 +    delay(1);
 +    loopCount++;​
 +
 +// if nothing received for 10 seconds, timeout
 +    if(loopCount > 10000) {
 +      client.stop();​
 +      Serial.println(F("​\r\nTimeout"​));​
 +      return;
 +    }
 +  }
 +
 +  while(client.available())
 +  { 
 +    thisByte = client.read(); ​
 +    Serial.write(thisByte);​
 +  }
 +
 +  client.stop();​
 +
 +  Serial.println(F("​disconnected"​));​
 +}
 +
 +
 +
 +
 +</​note>​
pm/prj2023/dene/cosmin-duta.1683404722.txt.gz · Last modified: 2023/05/06 23:25 by cosmin_mihail.duta
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