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:52]
cosmin_mihail.duta [Hardware Design: Schema Electrica]
pm:prj2023:dene:cosmin-duta [2023/05/30 14:31] (current)
cosmin_mihail.duta [Software Design - Descrierea codului aplicatiei]
Line 12: Line 12:
 ducând la probleme de sănătate și la distrugerea mediului înconjurător. 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. ​ 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 detectarapid ​nivelul de poluare dintr-o anumită zonă in doar cateva secunde.+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. 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ă ​înainte.+Î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 38: Line 38:
  
 </​note>​ </​note>​
 +
 +===== Hardware Design: Montajul =====
 +
 +{{:​pm:​prj2023:​dene:​whatsapp_image_2023-05-19_at_19.04.57.png?​650|}}
 +
 +
  
  
Line 50: Line 56:
   * 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 MQ135 se conecteaza astfel: Senzorul MQ135 se conecteaza astfel:
Line 68: Line 68:
   * PIN3 se lasă liber   * PIN3 se lasă liber
   * PIN4 reprezintă GND și se conectează la G din zona pinului digital D3   * PIN4 reprezintă GND și se conectează la G din zona pinului digital D3
 +
 +Modulul Bluetooth se conecteaza astfel:
 +  * PIN1 STATE se conecteaza la GND
 +  * PIN2 RXD se conecteaza la D1/TX
 +  * PIN3 TXD se conecteaza la D0/RX
 +  * PIN4 GND se conecteaza la GND
 +  * PIN5 VCC se conecteaza la VCC
 +  * PIN6 EN se conecteaza la 3V3
  
 Conectarea LED-urilor: Conectarea LED-urilor:
   * LED-ul alb se conecteaza la GND si V la pinul digital 1 => sistemul este ON   * 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 ​   * LED-ul rosu se conecteaza la GND si S pe pinul digital 2 => parametrii depasesc limita maxima setata ​
 +
 +
 +
 +{{:​pm:​prj2023:​dene:​schema-electrica.png?​650|}}
 +
 +{{:​pm:​prj2023:​dene:​schema-electrica2.png?​650|}}
  
  
Line 95: Line 109:
 </​note>​ </​note>​
  
-===== Software Design: Libraries ​=====+===== Software Design ​-  Descrierea codului aplicatiei ​===== 
 + 
 <note tip> <note tip>
-Librarii folosite: 
-  * Dht11.h 
-  * Wire.h 
-  * LiquidCrystal_I2C.h 
-  * SPI.h 
-  * Ethernet.h ​ 
-  * SD.h  
  
-</note>+/*Importam librariile necesare*/​ 
 +#include <​dht11.h>​ 
 +#include <​Wire.h>​  
 +#include <​LiquidCrystal_I2C.h>
  
 +#include <​SPI.h>​
 +#include <​Ethernet.h>​
 +#include <​SD.h>​
  
-===== Rezultate obtinute =====+LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); ​
  
-===== Concluzii =====+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.1683406375.txt.gz · Last modified: 2023/05/06 23:52 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