LRaeiMayer Abraham
Published

Monitoring air quality

We have developed an embedded monitoring system that uses various low-power connected sensors.

IntermediateWork in progress5 hours246
Monitoring air quality

Things used in this project

Hardware components

Rechargeable Battery, 3.7 V
Rechargeable Battery, 3.7 V
×1
Arduino MKR WAN 1310
Arduino MKR WAN 1310
×1
Fermion: Multi-function Environmental Module - CCS811+BME280 (Breakout)
DFRobot Fermion: Multi-function Environmental Module - CCS811+BME280 (Breakout)
×1
LL200-3-37
×4
Gravity BMP388 Barometric Pressure Sensors
DFRobot Gravity BMP388 Barometric Pressure Sensors
×1
USB Charger for 7.4V LiPo Battery DFR0564
DFRobot USB Charger for 7.4V LiPo Battery DFR0564
×1
Fermion: MEMS Microphone Module
DFRobot Fermion: MEMS Microphone Module
×1
Grove - Infrared Temperature Sensor
Seeed Studio Grove - Infrared Temperature Sensor
×1
Gravity: 130 DC Motor Module
DFRobot Gravity: 130 DC Motor Module
×1
5 mm LED: Red
5 mm LED: Red
×1
Rocker Switch, Non Illuminated
Rocker Switch, Non Illuminated
×1

Software apps and online services

Ubidots
Ubidots
KiCad
KiCad
Arduino IDE
Arduino IDE
The Things Stack
The Things Industries The Things Stack

Hand tools and fabrication machines

Plier, Cutting
Plier, Cutting
Solder Wire, Lead Free
Solder Wire, Lead Free
Breadboard, 270 Pin
Breadboard, 270 Pin
Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires
Soldering iron (generic)
Soldering iron (generic)
Tape, Electrical
Tape, Electrical

Story

Read more

Schematics

General Schematic

PCB_schema

Routing_PCB

Code

Final

Arduino
#include <MKRWAN.h>
#include <DHT.h>
#include "Arduino.h"
#include "ArduinoLowPower.h"
#include "Adafruit_CCS811.h"
#include <BMP388_DEV.h>                           // Include pour le capteur de pression BMP388_DEV.h

BMP388_DEV bmp388;       // Instantiate (create) a BMP388_DEV object and set-up for I2C operation (address 0x76) on a modifi dans la bibliothque BMP388_DEV.h
Adafruit_CCS811 ccs; //Cre une instance de la classe Adafruit_CCS811 appele ccs


// Pin pour la lecture du capteur
#define DHTPIN 2

// Type de capteur
#define DHTTYPE DHT11

// Dclaration du capteur
DHT dht(DHTPIN, DHTTYPE);

// Objet LoRaWAN
LoRaModem modem;

// Identifiants de l'application TTN
const char *appEui = "0000000000000000";
const char *appKey = "D48686E9120D86ECB0DA89D310A90F99";

int fenetre =50;// en ms
unsigned int tension; //lecture de la tension
double niveau = 0; // niveau sonore en decibel

void setup() {
  pinMode(A5, OUTPUT);// Pin du timer
  pinMode(LED_BUILTIN, OUTPUT);// POur l'horloge  ===> Sleep Mode ncessaire

  // Initialisation du port srie
  Serial.begin(9600);

  // Initialisation du capteur humidit et de temprature  
  dht.begin();

  // Initialisation du capteur humidit et de temprature
  bmp388.begin();                                 // Default initialisation, place the BMP388 into SLEEP_MODE 
  bmp388.setTimeStandby(TIME_STANDBY_1280MS);     // Set the standby time to 1.3 seconds
  bmp388.startNormalConversion();                 // Start BMP388 continuous conversion in NORMAL_MODE  

  // Initialisation du modem LoRaWAN
  if (!modem.begin(EU868)) {
    Serial.println("Erreur d'initialisation du modem");
    while (1);
  }
  
  pinMode(1,OUTPUT); //Rgle la borne numrique numro 1 de la carte Arduino en mode sortie (Lecture du pourcentage de la batterie)

  pinMode(5, INPUT);// Pin du capteur de prsence


  // Connexion au rseau LoRaWAN
  if (!modem.joinOTAA(appEui, appKey)) {
    Serial.println("Erreur de connexion au rseau");
    while (1);
  }
    if(!ccs.begin()){ // message d'erreur si capteur pas dtect 
    Serial.println("Echec detection capteur CCS811");
    while(1);
  }

  while(!ccs.available()); // Attente que le capteur soit pret et que des donnes soient disponibles
}

void loop() 
{
  digitalWrite(A3,LOW);
  // Lecture de la temprature et de l'humidit
  uint16_t humidity = dht.readHumidity() * 100;
  uint16_t temperature_dht = dht.readTemperature() * 100;

  // Vrification de la lecture du capteur
  if (isnan(temperature_dht) || isnan(humidity)) 
  {
    Serial.println("Erreur de lecture du capteur DHT11");
    return;
  }
  
  // Mircrophone pour la mesure du bruit
  unsigned long timer_start = millis();
  unsigned int tension_peaktopeak = 0;
  unsigned  int signal_max =0;
  unsigned int signal_min =1024;

  while (millis()-timer_start<fenetre)
  {
    tension = analogRead(A2);

    if (tension<1024)
    {
      if (tension>signal_max)
      {
        signal_max=tension; 
      } 
      else if (tension<signal_min)
      {
        signal_min=tension;
      } 
    } 
  }   
  tension_peaktopeak = signal_max-signal_min;
  
  double volt = (tension_peaktopeak*5.0)/1024;
  double vp = volt/2; // tension crete  crete
  double v_rms = vp/sqrt(2); // valeur efficace RMS
  double PA_RMS = v_rms/66; // Pression accoustique en valeur efficace / sensibilit du microphone ou gain 
  niveau = 20*log10(PA_RMS/0.00002)+20; // pression accoustique de ref
  uint16_t Niveau_envoie = niveau * 100; //conversion du bruit en uint16_t
  uint16_t co2;

//Capteur de Co2
do {
  if(ccs.available()){ // Si donnes disponible
    if(!ccs.readData()){ // Si donnes lus avec succs
      co2= ccs.geteCO2(); //utilise la fonction geteCO2 de la librairie Adafruit_CCS811
    }
    else{ // Si chec de la lecture des donnes 
      Serial.println("Erreur lecture capteur Co2 !");
      while(1);
    }
  }
  ccs.setBaseline(0xE6BA);// baseline cu capteur C02 /
}
while (co2<350); // on a remarque que la premire mesure etait parfois fausse... On a donc dcid de mettre cette conditionc

// Capteur de pression
  uint16_t pression;
  float temperature, pressure, altitude;            // Create the temperature, pressure and altitude variables 
  if (bmp388.getMeasurements(temperature, pressure, altitude))    // Check if the measurement is complete
  {
    pression=pressure;
  }
  else{ // Si chec de la lecture des donnes 
      Serial.println("Erreur lecture capteur pression !");
    }

  // capteur de prsence
  uint16_t presence = digitalRead(5);// pin 5 pour le capteur de prsence
 
//Lecture du pourcentage de la batterie
  float batterie = analogRead(A1); //valeur analogique
  const float TensionMin = 3.6; //tension min
  const float TensionMax = 4.2; //tension max

  int minValue = (1023 * TensionMin) / 5; //Arduino
  int maxValue = (1023 * TensionMax) / 5; //Arduino

  uint16_t batterie_envoie = ((batterie - minValue) / (maxValue - minValue)) * 100; //mettre en pourcentage
    if (batterie_envoie > 100) //max is 100%
    batterie_envoie = 100;

    else if (batterie_envoie < 0) //min is 0%
    batterie_envoie = 0;

    
  // Cration de la charge utile (payload)  envoyer
  byte payload[14];
  payload[0] = highByte(temperature_dht);
  payload[1] = lowByte(temperature_dht);
  payload[2] = highByte(humidity);
  payload[3] = lowByte(humidity);
  payload[4] = highByte(Niveau_envoie);
  payload[5] = lowByte(Niveau_envoie);
  payload[6] = highByte(co2);
  payload[7] = lowByte(co2);
  payload[8] = highByte(pression);
  payload[9] = lowByte(pression);
  payload[10] = highByte(presence);
  payload[11] = lowByte(presence);
  payload[12] = highByte(batterie_envoie);
  payload[13] = lowByte(batterie_envoie);

  // Envoi de la charge utile (payload) sur The Things Network
  modem.beginPacket();
  modem.write(payload, sizeof(payload));
  modem.endPacket(true);
  // Affichage sur le moniteur serie
  Serial.print("Temperature : ");
  Serial.println(temperature_dht/100);
  Serial.print("Humidit : ");
  Serial.println(humidity/100);
  Serial.print("Niveau de bruit : ");
  Serial.println(Niveau_envoie/100);
  Serial.print("Pression en mbar : ");
  Serial.println(pression);
  Serial.print("Presence : ");
  Serial.println(presence);
  Serial.print("Co2 en PPM : ");
  Serial.println(co2);
  Serial.print("Batterie : ");
  Serial.println(batterie_envoie);

  if (co2>1000)    // seuil d'alerte C02
  { // a clignotte pendant 10 Secondes pas plus sinon on consomme trop !
    int i = 0;
    while (i <8) 
    {    
      digitalWrite(1,HIGH); //le courant est envoy sur la borne 1, la LED  s'allume
      delay(500);
      digitalWrite(1,LOW); //On eteint la led
      delay(1000);
      i++;   
    }
 }
  delay(2000);
  digitalWrite(A3,HIGH); //On coupe l'alimentation du systme
}

Credits

LRaei

LRaei

1 project • 0 followers
Mayer Abraham

Mayer Abraham

0 projects • 0 followers
Thanks to KALI Redouane and GARD Florian.

Comments