Sistem inteligent de avertizare

Student: Duță Mihail-Cosmin

Grupă: 331CC

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

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.

Hardware Design: Schema Bloc

Hardware Design: Componente

Lista de piese:

  • Arduino UNO
  • Placa expansiune senzori V5.0
  • LCD
  • Modul cu senzor calitate aer MQ 135
  • Senzor temperatura si umiditate
  • Doza de derivatie
  • Modul Bluetooth
  • Fire
  • Placa de expansiune Ethernet W5100
  • LED-uri

Hardware Design: Montajul

Hardware Design: Schema Electrica

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.

Ecranul LCD se conecteaza astfel:

  • GND la G din zona pinului analog A5
  • VCC la V din zona pinului analog A5
  • SDA la S din zona pinului analog A4
  • 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

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:

  • 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

Software Design - Descrierea codului aplicatiei

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

Software Design - Descrierea codului aplicatiei

#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.print1)

1) 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.txt · Last modified: 2023/05/30 14:31 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