Bonjour,
Je voudrais partager avec vous cette bidouille sur STM32 pour mesurer la qualité de l'air.
En espèrant que cela vous sera utile.
Codes Disponibles:
V1.0 Affichages des valeurs analog
V1.1 Affichages des valeurs analog + Alerte des limites établies 04-10-2020
V1.2 Affichages des valeurs analog + Alerte des limites établies + Dimming Oled 10-10-2020
Erreur de conception:
DHT22--> Je vous conseille de le situé plus à l'éxterieur !
PIN: ( Attention "Not 5V Tolerant" du STM32 diviseur de tension pour 3.3v max "exemple 47k+68k & 220k = 3.28v" )
A0 - Sensor MQ3 ( Alcohol ) [ Alcohol, Benzine, CH4, Hexane, LPG, CO ]
A1 - Sensor MQ4 ( CH4 ) [ LPG, CH4, H2, CO, Alcohol, Smoke ]
A2 - Sensor MQ5 ( LPG & CH4 ) [ H2, LPG, CH4, CO, Alcohol ]
A3 - Sensor MQ6 ( CH4 & LPG ) [ LPG, H2, Ch4, C), Alcohol ]
A4 - Sensor MQ9 ( CH4 & CO ) [ LPG, CO, CH4 ]
A5 - Sensor MQ8 ( H2 & Alcohol ) [ H2, LPG, CH4, CO, Alcohol ]
A6 - Sensor MQ135( NH4 Aire Quality ) [ CO2, CO, NH4, NH3, Toluene ]
A7 - Sensor MQ2 ( Propane & H2 ) [ H2, LPG, CH4, CO, Alcohol, Propane ]
B0 - Sensor MQ7 ( H2 & CO ) [ CO, H2, LPG, CH4, Alcohol ]
B1 - LDR ( LDR GL5528 )
B6 - OLED SCL ( OLED 1.3' 4P SH1106 I2C 128x64 )
B7 - OLED SDA
B8 - DHT22 ( Data TX -> RX avec pullup 10k)
B12- MicroSD cs ( MicroSD SPI )
B13- MicroSD sck
B14- MicroSD miso
B15- MicroSD mosi
CODES: j'ai essayé de faire le plus simple possible
V1.0 Affichages des valeurs analogiques
Résumé: u8g2.clearBuffer();
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,10);
u8g2.print("MQ3");
u8g2.setCursor(33,10);
u8g2.print(analogRead(PA0));
u8g2.setCursor(64,10);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PA1));
u8g2.setCursor(104,10);
u8g2.print("MQ4");
u8g2.sendBuffer();
// http://forum.bidouilleur.ca/
// v1.0 AirQ Analog Value
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <DHT.h>
#define DHTPIN PB8
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void setup(void) {
u8g2.begin();
dht.begin();
}
void loop(void) {
// Pour la temperature en Celsius
// float t = dht.readTemperature();
// Pour la temperature en Fahrenheit (isFahrenheit = true)
// float t = dht.readTemperature(true);
float h = dht.readHumidity();
float t = dht.readTemperature();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,10);
u8g2.print("MQ3");
u8g2.setCursor(33,10);
u8g2.print(analogRead(PA0));
u8g2.setCursor(64,10);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PA1));
u8g2.setCursor(104,10);
u8g2.print("MQ4");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,20);
u8g2.print("MQ5");
u8g2.setCursor(33,20);
u8g2.print(analogRead(PA2));
u8g2.setCursor(64,20);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PA3));
u8g2.setCursor(104,20);
u8g2.print("MQ6");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,30);
u8g2.print("MQ9");
u8g2.setCursor(33,30);
u8g2.print(analogRead(PA4));
u8g2.setCursor(64,30);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PA5));
u8g2.setCursor(104,30);
u8g2.print("MQ8");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,40);
u8g2.print("ArQ");
u8g2.setCursor(33,40);
u8g2.print(analogRead(PA6));
u8g2.setCursor(64,40);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PA7));
u8g2.setCursor(104,40);
u8g2.print("MQ2");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,50);
u8g2.print("MQ7");
u8g2.setCursor(33,50);
u8g2.print(analogRead(PB0));
u8g2.setCursor(64,50);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PB1));
u8g2.setCursor(104,50);
u8g2.print("LDR");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,60);
u8g2.print("Hum");
u8g2.setCursor(33,60);
u8g2.print(h);
u8g2.setCursor(64,60);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(t);
u8g2.setCursor(104,60);
u8g2.print("Temp");
u8g2.sendBuffer();
delay(1000);
}
V1.1 Affichages des valeurs analogiques + Alerte quand les limites établies sont dépassées 04-10-2020
Résumé: if (analogRead(PinMQ2) >LimitMQ2) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso32_tf);
u8g2.setCursor(0,32);
u8g2.print(MsgMQ2);
u8g2.setCursor(0,64);
u8g2.print(analogRead(PinMQ2));
u8g2.sendBuffer();
// http://forum.bidouilleur.ca/
// v1.1 AirQ Alert
// Merci a papyblue
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <DHT.h>
#define DHTPIN PB8
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// Menssage Alert
char MsgMQ2[]= "PropH2";
char MsgMQ3[] = "Alcoh.";
char MsgMQ4[] = "CH4";
char MsgMQ5[] = "LPGch4";
char MsgMQ6[] = "CH4lpg";
char MsgMQ7[] = "H2 CO";
char MsgMQ8[] = "H2 Alc";
char MsgMQ9[] = "CH4 CO";
char MsgMQ135[] = "AirQ";
char MsgHum[] = "HUMID.";
char MsgTemp[] = "TEMP.";
// analogRead(Pin Read Pin
int PinMQ2 = PA7;
int PinMQ3 = PA0;
int PinMQ4 = PA1;
int PinMQ5 = PA2;
int PinMQ6 = PA3;
int PinMQ7 = PB0;
int PinMQ8 = PA5;
int PinMQ9 = PA4;
int PinMQ135 = PA6;
int PinLDR = PB1;
// Limits Definied by User
int LimitMQ2 = 70;
int LimitMQ3 = 70;
int LimitMQ4 = 70;
int LimitMQ5 = 45;
int LimitMQ6 = 50;
int LimitMQ7 = 35;
int LimitMQ8 = 18;
int LimitMQ9 = 35;
int LimitMQ135 = 13;
int LimitSupHum = 75;
int LimitInfHum = 40;
int LimitSupTemp = 27;
int LimitInfTemp = 17;
void setup(void) {
u8g2.begin();
dht.begin();
}
void AllValue(){
/* Display show
MQ2 --- MQ7
MQ3 --- MQ8
MQ4 --- MQ9
MQ5 --- MQ135
MQ6 --- LDR
HUM --- TEMP
*/
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,10);
u8g2.print("MQ2");
u8g2.setCursor(33,10);
u8g2.print(analogRead(PinMQ2));
u8g2.setCursor(64,10);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PinMQ7));
u8g2.setCursor(104,10);
u8g2.print("MQ7");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,20);
u8g2.print("MQ3");
u8g2.setCursor(33,20);
u8g2.print(analogRead(PinMQ3));
u8g2.setCursor(64,20);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PinMQ8));
u8g2.setCursor(104,20);
u8g2.print("MQ8");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,30);
u8g2.print("MQ4");
u8g2.setCursor(33,30);
u8g2.print(analogRead(PinMQ4));
u8g2.setCursor(64,30);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PinMQ9));
u8g2.setCursor(104,30);
u8g2.print("MQ9");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,40);
u8g2.print("MQ5");
u8g2.setCursor(33,40);
u8g2.print(analogRead(PinMQ5));
u8g2.setCursor(64,40);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PinMQ135));
u8g2.setCursor(104,40);
u8g2.print("MQ135");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,50);
u8g2.print("MQ6");
u8g2.setCursor(33,50);
u8g2.print(analogRead(PinMQ6));
u8g2.setCursor(64,50);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PinLDR));
u8g2.setCursor(104,50);
u8g2.print("LDR");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,60);
u8g2.print("Hum");
u8g2.setCursor(33,60);
u8g2.print(dht.readHumidity(),0);
u8g2.setCursor(64,60);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(dht.readTemperature(),1);
u8g2.setCursor(104,60);
u8g2.print("Temp");
u8g2.sendBuffer();
}
void AlertFontLineFirst(){
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso32_tf);
u8g2.setCursor(0,32);
}
void AlertLineSecond(){
u8g2.setCursor(0,64);
}
void AlertShowDisplay(){
u8g2.sendBuffer();
}
void loop(void) {
if (analogRead(PinMQ2) >LimitMQ2) {
AlertFontLineFirst();
u8g2.print(MsgMQ2);
AlertLineSecond();
u8g2.print(analogRead(PinMQ2));
AlertShowDisplay();
}
else if (analogRead(PinMQ3) > LimitMQ3){
AlertFontLineFirst();
u8g2.print(MsgMQ3);
AlertLineSecond();
u8g2.print(analogRead(PinMQ3));
AlertShowDisplay();
}
else if (analogRead(PinMQ4) > LimitMQ4){
AlertFontLineFirst();
u8g2.print(MsgMQ4);
AlertLineSecond();
u8g2.print(analogRead(PinMQ4));
AlertShowDisplay();
}
else if (analogRead(PinMQ5) > LimitMQ5){
AlertFontLineFirst();
u8g2.print(MsgMQ5);
AlertLineSecond();
u8g2.print(analogRead(PinMQ5));
AlertShowDisplay();
}
else if (analogRead(PinMQ6) > LimitMQ6){
AlertFontLineFirst();
u8g2.print(MsgMQ6);
AlertLineSecond();
u8g2.print(analogRead(PinMQ6));
AlertShowDisplay();
}
else if (analogRead(PinMQ7) > LimitMQ7){
AlertFontLineFirst();
u8g2.print(MsgMQ7);
AlertLineSecond();
u8g2.print(analogRead(PinMQ7));
AlertShowDisplay();
}
else if (analogRead(PinMQ8) > LimitMQ8){
AlertFontLineFirst();
u8g2.print(MsgMQ8);
AlertLineSecond();
u8g2.print(analogRead(PinMQ8));
AlertShowDisplay();
}
else if (analogRead(PinMQ9) > LimitMQ9){
AlertFontLineFirst();
u8g2.print(MsgMQ9);
AlertLineSecond();
u8g2.print(analogRead(PinMQ9));
AlertShowDisplay();
}
else if (analogRead(PinMQ135) > LimitMQ135){
AlertFontLineFirst();
u8g2.print(MsgMQ135);
AlertLineSecond();
u8g2.print(analogRead(PinMQ135));
AlertShowDisplay();
}
else if (dht.readHumidity() > LimitSupHum){
AlertFontLineFirst();
u8g2.print(MsgHum);
AlertLineSecond();
u8g2.print(dht.readHumidity(),0); // decimal ,0
u8g2.print("%");
AlertShowDisplay();
}
else if (dht.readHumidity() < LimitInfHum){
AlertFontLineFirst();
u8g2.print(MsgHum);
AlertLineSecond();
u8g2.print(dht.readHumidity(),0);
u8g2.print("%");
AlertShowDisplay();
}
else if (dht.readTemperature() > LimitSupTemp){
AlertFontLineFirst();
u8g2.print(MsgTemp);
AlertLineSecond();
u8g2.print(dht.readTemperature(),1); // decimal ,1
u8g2.print("C");
AlertShowDisplay();
}
else if (dht.readTemperature() < LimitInfTemp){
AlertFontLineFirst();
u8g2.print(MsgTemp);
AlertLineSecond();
u8g2.print(dht.readTemperature(),1);
u8g2.print("C");
AlertShowDisplay();
}
else {
AllValue();
}
delay(1000);
}
V1.2 Affichages des valeurs analog + Alerte des limites établies + Dimming Oled 10-10-2020
Résumé: if (analogRead(PinLDR) < LimitInfLDR){
u8g2.setContrast(0);
u8g2.setContrast(255);
Comme le DHT est trop près, il m'a fallu faire des ajustements de Temp & Humd. pas top --> Je vous conseille de le situé plus à l'éxterieur !
int TempAdjust = -4;
int HumdAdjust = 7;
// http://forum.bidouilleur.ca/
// v1.2 AirQ Alert Dimming
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <DHT.h>
#define DHTPIN PB8
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
char MsgMQ2[]= "PropH2";// Menssage Alert
char MsgMQ3[] = "Alcoh.";
char MsgMQ4[] = "CH4";
char MsgMQ5[] = "LPGch4";
char MsgMQ6[] = "CH4lpg";
char MsgMQ7[] = "H2 CO";
char MsgMQ8[] = "H2 Alc";
char MsgMQ9[] = "CH4 CO";
char MsgMQ135[] = "AirQ";
char MsgHum[] = "HUMID.";
char MsgTemp[] = "TEMP.";
int PinMQ2 = PA7;// analogRead(Pin Read Pin
int PinMQ3 = PA0;
int PinMQ4 = PA1;
int PinMQ5 = PA2;
int PinMQ6 = PA3;
int PinMQ7 = PB0;
int PinMQ8 = PA5;
int PinMQ9 = PA4;
int PinMQ135 = PA6;
int PinLDR = PB1;
int TempAdjust = -4; // negative = substract / positive = add
int HumdAdjust = 7; // negative = substract / positive = add
int LimitMQ2 = 55;// Limits Definied by User
int LimitMQ3 = 64;
int LimitMQ4 = 64;
int LimitMQ5 = 38;
int LimitMQ6 = 42;
int LimitMQ7 = 32;
int LimitMQ8 = 13;
int LimitMQ9 = 33;
int LimitMQ135 = 11;
int LimitSupHum = 77;
int LimitInfHum = 40;
int LimitSupTemp = 27;
int LimitInfTemp = 17;
int LimitSupLDR = 450;
int LimitInfLDR = 93;
void setup(void) {
u8g2.begin();
dht.begin();
}
void AllValue(){
u8g2.clearBuffer();
if (analogRead(PinLDR) < LimitInfLDR){
u8g2.setContrast(0);
}
else{
u8g2.setContrast(255);
}
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,10);
u8g2.print("MQ2");
u8g2.setCursor(33,10);
u8g2.print(analogRead(PinMQ2));
u8g2.setCursor(64,10);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PinMQ7));
u8g2.setCursor(104,10);
u8g2.print("MQ7");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,20);
u8g2.print("MQ3");
u8g2.setCursor(33,20);
u8g2.print(analogRead(PinMQ3));
u8g2.setCursor(64,20);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PinMQ8));
u8g2.setCursor(104,20);
u8g2.print("MQ8");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,30);
u8g2.print("MQ4");
u8g2.setCursor(33,30);
u8g2.print(analogRead(PinMQ4));
u8g2.setCursor(64,30);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PinMQ9));
u8g2.setCursor(104,30);
u8g2.print("MQ9");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,40);
u8g2.print("MQ5");
u8g2.setCursor(33,40);
u8g2.print(analogRead(PinMQ5));
u8g2.setCursor(64,40);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PinMQ135));
u8g2.setCursor(104,40);
u8g2.print("M135");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,50);
u8g2.print("MQ6");
u8g2.setCursor(33,50);
u8g2.print(analogRead(PinMQ6));
u8g2.setCursor(64,50);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print(analogRead(PinLDR));
u8g2.setCursor(104,50);
u8g2.print("LDR");
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.setCursor(0,60);
u8g2.print("Hum");
u8g2.setCursor(33,60);
u8g2.print((dht.readHumidity()+HumdAdjust),0);
u8g2.setCursor(64,60);
u8g2.setFont(u8g2_font_haxrcorp4089_tr);
u8g2.print("/ ");
u8g2.print((dht.readTemperature()+TempAdjust),1);
u8g2.setCursor(104,60);
u8g2.print("Temp");
u8g2.sendBuffer();
delay(500);
}
void AlertFontLineFirst(){
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso30_tf);
u8g2.setCursor(0,32);
}
void AlertLineSecond(){
u8g2.setCursor(0,64);
}
void AlertShowDisplay(){
if (analogRead(PinLDR) < LimitInfLDR){
u8g2.setContrast(0);
u8g2.sendBuffer();
}
else{
u8g2.setContrast(255);
u8g2.sendBuffer();
}
delay(1000);
}
void loop(void) {
if (analogRead(PinMQ2) >LimitMQ2) {
AlertFontLineFirst();
u8g2.print(MsgMQ2);
AlertLineSecond();
u8g2.print(analogRead(PinMQ2));
AlertShowDisplay();
}
else if (analogRead(PinMQ3) > LimitMQ3){
AlertFontLineFirst();
u8g2.print(MsgMQ3);
AlertLineSecond();
u8g2.print(analogRead(PinMQ3));
AlertShowDisplay();
}
else if (analogRead(PinMQ4) > LimitMQ4){
AlertFontLineFirst();
u8g2.print(MsgMQ4);
AlertLineSecond();
u8g2.print(analogRead(PinMQ4));
AlertShowDisplay();
}
else if (analogRead(PinMQ5) > LimitMQ5){
AlertFontLineFirst();
u8g2.print(MsgMQ5);
AlertLineSecond();
u8g2.print(analogRead(PinMQ5));
AlertShowDisplay();
}
else if (analogRead(PinMQ6) > LimitMQ6){
AlertFontLineFirst();
u8g2.print(MsgMQ6);
AlertLineSecond();
u8g2.print(analogRead(PinMQ6));
AlertShowDisplay();
}
else if (analogRead(PinMQ7) > LimitMQ7){
AlertFontLineFirst();
u8g2.print(MsgMQ7);
AlertLineSecond();
u8g2.print(analogRead(PinMQ7));
AlertShowDisplay();
}
else if (analogRead(PinMQ8) > LimitMQ8){
AlertFontLineFirst();
u8g2.print(MsgMQ8);
AlertLineSecond();
u8g2.print(analogRead(PinMQ8));
AlertShowDisplay();
}
else if (analogRead(PinMQ9) > LimitMQ9){
AlertFontLineFirst();
u8g2.print(MsgMQ9);
AlertLineSecond();
u8g2.print(analogRead(PinMQ9));
AlertShowDisplay();
}
else if (analogRead(PinMQ135) > LimitMQ135){
AlertFontLineFirst();
u8g2.print(MsgMQ135);
AlertLineSecond();
u8g2.print(analogRead(PinMQ135));
AlertShowDisplay();
}
else if ((dht.readHumidity()+HumdAdjust) > LimitSupHum){
AlertFontLineFirst();
u8g2.print(MsgHum);
AlertLineSecond();
u8g2.print((dht.readHumidity()+HumdAdjust),0); // decimal ,0
u8g2.print("%");
AlertShowDisplay();
}
else if ((dht.readHumidity()+HumdAdjust) < LimitInfHum){
AlertFontLineFirst();
u8g2.print(MsgHum);
AlertLineSecond();
u8g2.print((dht.readHumidity()+HumdAdjust),0);
u8g2.print("%");
AlertShowDisplay();
}
else if ((dht.readTemperature()+TempAdjust) > LimitSupTemp){
AlertFontLineFirst();
u8g2.print(MsgTemp);
AlertLineSecond();
u8g2.print((dht.readTemperature()+TempAdjust),1); // decimal ,1
u8g2.print("C");
AlertShowDisplay();
}
else if ((dht.readTemperature()+TempAdjust) < LimitInfTemp){
AlertFontLineFirst();
u8g2.print(MsgTemp);
AlertLineSecond();
u8g2.print((dht.readTemperature()+TempAdjust),1);
u8g2.print("C");
AlertShowDisplay();
}
else {
AllValue();
}
delay(200);
}
INFO PRATIQUE:Library
https://github.com/olikraus/u8g2https://github.com/adafruit/DHT-sensor-libraryFonts du texte u8g2
https://github.com/olikraus/u8g2/wiki/fntgrplogisosoTuto STM32F103C8T6 par USB comme Arduino
https://www.youtube.com/watch?v=Myon8H111PQPour des lectures en ppm mgL et plus:
https://github.com/miguel5612/MQSensorsLibpour le zip MQUnifiedsensor.h directement
https://github.com/miguel5612/MQSensorsLib/archive/master.zipÀ bientôt !