De la pédagogie avec des micro capteurs sur la pollution de l’air pour que chacun puisse comprendre et s’approprier les enjeux de la qualité de l’air et favoriser ainsi les changements de comportements.
60 personnes travaillent a www.atmo-hdf.fr/ pour la région haut de France
Notre objectif est de quantifier la pollution de l'air dans le flux de circulation des voitures en velo et de choisir un itinéraire évitant la pollution mais qui ne rallonge pas trop le déplacement. Donc de réaliser un enregistreur de la pollution.
Mais que valent les micros capteurs sur l’analyse de l’air ? Que vaut les études et modèles existantes ?
Un challenge sur les micro-sensors les évalue sur ce lien…..
http://www.airlab.solutions/fr/projets/microsensor-challenge
Mais aussi pour quantifier des valeurs et les partager dans un cloud…..
grâce à de l’IOT
https://www.atmo-hdf.fr/joomlatools-files/docman-files/Lab%20Aireka/DIY-lycees-2020_guide.pdf
Mais rien sur le IOT et les capteurs choisis par « kanope » sur leur site
Mais, il y a tout ici avec SDS011, HTU21DF
L’Europe pousserait les Mackers à utiliser de micro-capteurs pour quantifier la pollution ?
https://ec.europa.eu/environment/air/pdf/Brochure%20lower-cost%20sensors.pdf
Mais quelle est la précision des micro-capteurs qui mesurent les gaz ?
Faut-il un étalonnage ? Avec quel protocole et ces difficiles à faire car il faut tester avec différents gaz …..
Des résultats à un challenge de micro capteurs
http://www.airlab.solutions/sites/default/files/brochure_2019_fr.pdf
http://www.airlab.solutions/fr/projets/microsensor-challenge
Des kits électroniques déjà toute faite de 2015,
Une thèse :
« Étude d’un système à base de micro-capteurs de gaz pour le suivi et la cartographie de la pollution atmosphérique »
https://hal.univ-lorraine.fr/tel-02940704/document
La thèse démontrent qu’il faut un étalonnage important pour certains capteurs NO2
Mais quelles sont les solutions pour mesurer la pollution avec une mobilité en velo ?
Quels sont les taux de nocivités des gazs et des particules ?
danger
si > à 25 μg/m3 en moyenne sur 24 heures pour les particules 2,5,
si > 50 μg/m3 en moyenne sur 24 heures pour les PM10.
Quelques exemples de capteurs et d IOT
https://projetsdiy.fr/calculer-indice-qualite-air-iaq-ciqa-iqa-dsm501-arduino-esp8266/
Il y a un capteur PMSA003 de détection de particule chez M5stack
https://www.respire-asso.org/le-capteur-de-particules-fines-pour-les-nuls/
Mais ce capteur détermine un nombre de particules alors comment fait il pour estimer aussi une masse par m3 ? Sachant que la densité massique des particules doit etre connu pour cela !
En effet, les capteurs à filtre, mesure la masse de quantité de particule par volume d’air.
il y a un kit chez m5stack que l’on va utiliser
https://docs.m5stack.com/#/en/base/pm2.5
Mais le code sur la liaison serie n’est pas correcte car les valeurs sont sur un int 16 bits mais la trame est sur 8 bits.
Donc, voici un nouveau code ou la liaison serie fonctionne,
// PM2.5 module and SHT20 base to read, the current Particulate Matter concentration and temperature and humidity data.
// biblio M5stick, Exemple, M5Stack core ESP32
#include <M5Stack.h> //https://docs.m5stack.com/#/en/core/core2?id=schematic
#include "Free_Fonts.h"
#include <Wire.h>
//#include <SD.h> //https://github.com/arduino-libraries/SD/blob/master/examples/NonBlockingWrite/NonBlockingWrite.ino
#include "DFRobot_SHT20.h"
DFRobot_SHT20 sht20;
#include "SPIFFS.h"
#include "FS.h" //https://github.com/dsiberia9s/DESKTOP_A-Explorer_File_Browser_via_Serial/blob/master/BRIDGE/BRIDGE.ino
#define TFT_GREY 0x7BEF
#define DATA_LEN 32
#define X_LOCAL 40
#define Y_LOCAL 30
#define X_OFFSET 160
#define Y_OFFSET 23
uint16_t CheckSum;
uint16_t CheckCode;
float humd;
float temp;
uint8_t temp1;
uint8_t humd1;
uint32_t x=0;
uint16_t x1=0;
uint8_t fileCSV[100000]={0}; //100 000octets*1seconde/4octets=>7heures sinon utilisation de memoire flash
uint8_t Air_val[32]={0};
int16_t p_val[16]={0};
uint8_t i=0;
// Print the header for a display screen
void header(const char *string, uint16_t color)
{
M5.Lcd.fillScreen(color);
M5.Lcd.setTextSize(1);
M5.Lcd.setTextColor(TFT_MAGENTA, TFT_BLUE);
M5.Lcd.fillRect(0, 0, 320, 30, TFT_BLUE);
M5.Lcd.setTextDatum(TC_DATUM);
M5.Lcd.drawString(string, 160, 3, 4);
}
void setup() {
M5.begin();
M5.Power.begin();
Serial.begin(9600);
Serial2.begin(9600, SERIAL_8N1, 16, 17);
pinMode(10, OUTPUT);
digitalWrite(10, 1);
M5.Lcd.fillScreen(TFT_BLACK); //2,0 "à 320 * 240 ILI9342C
// M5.Lcd.setBrightness(200);
header("PM 2.5 IUT GEII SOISSONS", TFT_BLACK);
sht20.initSHT20(); // Init SHT20 Sensor
delay(100);
sht20.checkSHT20();
/*
Serial.print("time");Serial.print(";");
Serial.print("0.3um:");Serial.print(";");Serial.print("0.5um:");Serial.print(";");Serial.print("1.0um:");Serial.print(";");
Serial.print("2.5umm:");Serial.print(";");Serial.print("5um:");Serial.print(";");Serial.print("10um:");Serial.print(";");
Serial.print("Temp");Serial.print(";");Serial.println("Humd");
*/
//https://github.com/m5stack/m5-docs/blob/master/docs/en/api/M5Timer.md
}
#define FRONT 2
void LCD_Display_Val(void){
for(int i=0,j=0;i<32;i++){
if(i%2==0){
p_val[j] = Air_val[i];
p_val[j] = p_val[j] <<8;
}else{
p_val[j] |= Air_val[i];
j++;
}
}
// fichier CSV de données sur moniteur serie, mettre l'horodatage pour connaitre le temps d'echantillonnage
/*
Serial.print(millis());Serial.print(";");
Serial.print(p_val[8]);Serial.print(";");Serial.print(p_val[9]);Serial.print(";");Serial.print(p_val[10]);Serial.print(";");
Serial.print(p_val[11]);Serial.print(";");Serial.print(p_val[12]);Serial.print(";");Serial.print(p_val[13]);Serial.print(";");
Serial.print(temp,2);Serial.print(";");Serial.println(humd,2);
*/
// M5.Lcd.setTextSize(FRONT);
M5.Lcd.setTextColor(TFT_RED,TFT_BLACK);
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL , FRONT);
M5.Lcd.print("Standard");
M5.Lcd.setTextColor(TFT_WHITE,TFT_BLACK);
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET, FRONT);
M5.Lcd.print(" ");
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET, FRONT);
M5.Lcd.print("PM1.0 : ");
M5.Lcd.print( p_val[2]);
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*2 , FRONT);
M5.Lcd.print(" ");
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*2 , FRONT);
M5.Lcd.print("PM2.5 : ");
M5.Lcd.print(p_val[3]);
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*3, FRONT);
M5.Lcd.print(" ");
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*3, FRONT);
M5.Lcd.print("PM10 : ");
M5.Lcd.print(p_val[4]);
M5.Lcd.setCursor(200, 40, FRONT);
M5.Lcd.print("data=");M5.Lcd.print(x);M5.Lcd.print(" ");
M5.Lcd.setTextColor(TFT_RED,TFT_BLACK);
M5.Lcd.setCursor(X_LOCAL+ X_OFFSET/4, Y_LOCAL + Y_OFFSET*4 , FRONT);
M5.Lcd.print("Number of particles");
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*5 , FRONT);
M5.Lcd.print(" ");
M5.Lcd.setTextColor(TFT_WHITE,TFT_BLACK);
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*5 , FRONT);
M5.Lcd.print("0.3um : ");
M5.Lcd.print(p_val[8]);
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*6 , FRONT);
M5.Lcd.print(" ");
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*6 , FRONT);
M5.Lcd.print("0.5um : ");
M5.Lcd.print(p_val[9]);
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*7 , FRONT);
M5.Lcd.print("1.0um : ");
M5.Lcd.print(p_val[10]);
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET*5 , FRONT);
M5.Lcd.print(" ");
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET*5 , FRONT);
M5.Lcd.print("2.5um : ");
M5.Lcd.print(p_val[11]);
M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*6 , FRONT);
M5.Lcd.print(" ");
M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*6 , FRONT);
M5.Lcd.print("5.0um : ");
M5.Lcd.print(p_val[12]);
M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*7 , FRONT);
M5.Lcd.print(" ");
M5.Lcd.setCursor(X_LOCAL+ X_OFFSET, Y_LOCAL + Y_OFFSET*7 , FRONT);
M5.Lcd.print("10um : ");
M5.Lcd.print(p_val[13]);
//enregistrement en memoire fichier CSV
if (p_val[2]>255) {p_val[2]=255;} //inutile car toujours inferieur à 255
if (p_val[3]>255) {p_val[3]=255;}
if (p_val[4]>255) {p_val[4]=255;}
if (p_val[8]>255) {p_val[8]=255;}
if (p_val[9]>255) {p_val[9]=255;}
if (p_val[10]>255) {p_val[10]=255;}
if (x<=50000) {x=x+11;
fileCSV[x]=p_val[2];
fileCSV[x+1]=p_val[3];
fileCSV[x+2]=p_val[4];
fileCSV[x+3]=temp1;
fileCSV[x+4]=humd1;
fileCSV[x+5]=p_val[8];
fileCSV[x+6]=p_val[9];
fileCSV[x+7]=p_val[10];
fileCSV[x+8]=p_val[11];
fileCSV[x+9]=p_val[12];
fileCSV[x+10]=p_val[13];
}
if (M5.BtnA.pressedFor(1000)) { //https://github.com/m5stack/m5-docs/blob/master/docs/en/api/button.md
M5.Lcd.setCursor(200, 40, FRONT); //envoie des données sur le moniteur serie
M5.Lcd.print("Transfert");
for(int i=0,j=0; i<=x; i++) {j++;Serial.print(fileCSV[i]);Serial.print(";");
if (j>=11) {Serial.println();j=0;}
}
}//fin if bouton A
if (M5.BtnB.isPressed()) { //Reset memory if bouton A
M5.Lcd.setCursor(200, 40 , FRONT);
M5.Lcd.printf(" ");
x=0;}
}
void TempHumRead(void)
{ M5.update();
humd = sht20.readHumidity(); // Read Humidity
temp = sht20.readTemperature(); // Read Temperature
humd1=(humd); //_byte sans virugle
temp1=temp;
M5.Lcd.setTextColor(TFT_GREEN,TFT_BLACK);
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*8, FRONT);
M5.Lcd.print(" ");
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET*8 , FRONT);
M5.Lcd.print("T M P : ");
M5.Lcd.print(temp);
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET*8, FRONT);
M5.Lcd.print(" ");
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET*8, FRONT);
M5.Lcd.print("H U M : ");
M5.Lcd.print(humd);
}
void loop() {
if(Serial2.available()) {
Air_val[i] = Serial2.read(); //lecture de
// Serial.write( Air_val[i]);
i++;
}else{
i=0;
}
if(i==DATA_LEN){
LCD_Display_Val();
TempHumRead();
}
}
Les données sont enregistrées dans la mémoire de l’ESP 32
Mais il serait possible de l’enregistrer dans les 16 Mégas de la mémoire flash, car dans la PSRAM, les data seront perdus si l’on a plus d’alimentation.
mais aussi avec l’enregistrement et transfert de donnée, traitée dans Excel
Nous avons monté le kit sur un velo

Il serait possible de synchroniser les données avec un GPS, ou envoyer les données par Bluetooth sur un smartphone et de synchroniser les données avec la position du velo
Si ce premier code correspond à notre objectif, il y a de nombreuses options possibles…sur ce sujet
mais il faut avoir des connaissances sur l’air et ces particules et sur les micro capteurs. ![]()
Chez Plantower plusieurs capteurs de particules ?????
Sont-ils plus ou moins précis ? Voilà leur lien mais sans réponse à la question
http://www.plantower.com/list/?6_1.html
Un autre projet open source Airbeam qui utilise une PPD60PV-T2 analogique QUI COUTE 300€ mais qui a une bonne évaluation pour mesurer les particules
Voici le data sheet
https://www.shinyei.co.jp/stc/eng/products/optical/ppd60pv.html
voici les differents lien






















