## Le matériel.
Une sonde de mesure de VOC voir la définition [ici](https://fr.wikipedia.org/wiki/Compos%C3%A9_organique_volatil) dans notre cas BME680 | sgp30 et un raspberry Pi ici un Zero mais pour tous les RPI les connecteurs GPIO sont identiques.
+ BME680
[Fiche technique du capteur](https://doc.riot-os.org/group__drivers__bme680.html)
![Bme680](images/bme680.jpg)
+ SGP30
[Fiche technique du capteur](pdf/Sensirion_SGP30.pdf)
![sgp30](images/sgp30.jpg)
+ Le rpi0
[Les caractéristiques du Pi 0](https://www.raspberrypi.org/documentation/usage/gpio/)
![piZero](images/Pi-Zero-W-1_400x.jpg)
Et des cables entre les deux suivant ce schéma. Le cablage est identique pour les deux capteurs.
| BME680 | Description | GPIO PI0 |
|--- |:---: |---: |
| **VCC** | 3.3 V | P1 |
| **GND** | Ground | P9 |
| **SCL** | I2C SCL | P5 |
| **SDA** | I2C SDA | P3 |
**A noter**
Les deux capteurs sont basés sur des technologies identiques. **Mox Gas Sensor** par contre les résultats fournis sont très différents
* bme680 retourne un indice de 100 à 0
* sgp30 retourne une valeur E-co2 en ppm et Tvoc ppb.
## Les logiciels
### les installations
Les éléments logiciels à installer sont :
+ **les packages**
+ pip (apt install python-pip)
+ mosquitto-clients ( apt install mosquitto-clients )
+ i2c-tools ( apt install i2c-tools )
+ **python**
+ paho-mqtt (pip install paho-mqtt)
+ [bme680](https://pypi.org/project/bme680/) (pip install bme680)
+ [spg30](https://pypi.org/project/pimoroni-sgp30/) (pip install pimoroni-sgp30)
### la configuration
Il s'agit de l'activation du protocole I2C sur le raspberry PI Zero.
Pour cela on utilise raspi-config option
+ 3 Interface Options
![config](images/i2c-config.png)
Et aprés le branchement du capteur bme280 ou sgp30 et un reboot on peut vérifier si i2c est vu par le systeme.
Vérification par les deux commandes
+ dmesg | grep i2c
+ lsmod | grep i2c
puis on lance la commande suivante pour trouver le parametre à utiliser dans le code Python:
>i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- **76** --
Cette valeur est l'adresse du capteur sur le bus I2C cette adresse est différente pour le capteur Sensirion SGP30 : **58**
**Nota!!!** pour utiliser le device i2c à partir d'un utilisateur il faut ajouter cet utilisateur au groupe i2c.
> adduser username i2c
### Les codes Python.
Celui du bme680 est assez proche de celui du capteur bme280
Celui-ci lit les valeurs sur la sonde puis transmets le tout au broker mqtt.
Celui du sgp30 est assez différents, mon code s'inspire du github [suivant](https://github.com/rendzina/SGP30).
Qui utilise la librairie PiMoroni et crée une classe héritée dans le Python, ajoutant une nouvelle fonction pour retourner les données brutes.
```python
# Create inherited SPG30 class allowing access to raw values
class SGP30_Raw(SGP30):
def get_air_quality_raw(self):
eco2, tvoc = self.command('measure_air_quality')
return (eco2, tvoc)
##
```
Le reste du code étant semblable.
**NOTA** Je mettrai à jour un repository github avec les différents codes début 2022 ;-)
## La mise en place d'un service
Ayant maintenant 5 capteurs j'ai mis en place sur chaque systeme un service qui automatise les démarrages.
### Le systemd service file.
creation d'un fichier descriptif bme680.service
```bash
[Unit]
Description=C° VOC Humidité Service
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/python /home/pi/src/bme680/mqttbme680.py
WorkingDirectory=/home/pi/src/bme680
Restart=always
RestartSec=10
User=pi
[Install]
WantedBy=multi-user.target
```
### Activation
```bash
sudo cp bme680.service /lib/systemd/system
sudo systemctl enable bme680.service
sudo systemctl start bme680.service
sudo systemctl status bme680.service
● bme680.service - C° PA Humidité Service
Loaded: loaded (/lib/systemd/system/bme680.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2021-12-06 19:19:36 CET; 6 days ago
Main PID: 15772 (python)
Tasks: 2 (limit: 529)
CPU: 2h 52min 51.411s
CGroup: /system.slice/bme680.service
└─15772 /usr/bin/python /home/pi/src/bme680/mqttbme680.py
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 201979.80 Ohms,humidity: 33.70 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 203041.08 Ohms,humidity: 33.67 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 202214.68 Ohms,humidity: 33.66 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 204113.57 Ohms,humidity: 33.65 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 205318.59 Ohms,humidity: 33.63 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 202568.02 Ohms,humidity: 33.62 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 204353.44 Ohms,humidity: 33.65 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 203278.43 Ohms,humidity: 33.67 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 201862.56 Ohms,humidity: 33.70 %RH,air quali>
Dec 13 18:17:09 pi0bme680 python[15772]: Gas: 202097.17 Ohms,humidity: 33.75 %RH,air quali>
pi@pi0bme680:~/src/bme680 $
```
## Le suivi des résultats.
Le suivi ce fait avec grafana / influxdb / mqtt et telegraf.
Le résultat bme680 suivi dans deux piéces différentes.
![indice](images/iaq1.png)
E-co2 avec sgp30 dans une piéce avec un espace cuisine
![e-co2](images/iaq2.png)