Qualité de l'air SDS011

Bonjour,
Tout d'abord je tiens à préciser que je suis un grand débutant (de quelques mois) et que je fais cela par curiosité.
J'ai le projet de faire une petite station meteo, à ce stade j'arrive à remonter Temp Hum et Pression avec 2 capteurs et je fais des moyennes le tout avec une carte DUBEUYEW ESP32S
Je viens d'ajouter un capteur pour la qualité de l'air SDS011 en me servant de ce tuto :
https://www.wikidebrouillard.org/wiki/Item:Capteur_de_particules_SDS011

Et là je bute sur les déclarations de pins,


#include "SdsDustSensor.h"
int rxPin = D5;
int txPin = D6;
SdsDustSensor sds(rxPin, txPin);

J'ai systématiquement les messages d'erreur suivants :
J'ai essayé différente variante mais toujours un pb

C:\Users\frXXXXXXXX 2diodeAir.ino:16:13: error: 'D5' was not declared in this scope
int rxPin = D5;
^~
C:\Users\freva\Docxxxxxxxir\BMEDHT22diodeAir.ino:16:13: note: suggested alternative: 'T5'
int rxPin = D5;
^~
T5
.....

Merci pour l'aide

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans "Les bonnes pratiques du Forum Francophone".

Merci faute d'inattention

Bonjour,

Est ce que ta carte a des pins marquées D5 et D6?
Quelle est la carte que tu as sélectionner dans l'IDE?

Sélectionne la bonne carte dans l'IDE (ou la carte la plus approchante) et indique le nom des pins sur lesquelles est connecté le capteur.

Bonjour,
J'ai changé un peu la config
image
Mais rien n'y fait :
Compilation error: 'D2' was not declared in this scope

PS : peut être rine à voir mais quand je branche la carte SDS011 une diode bleue s'allume sur la carte

C'est cette carte?

remplace

par

const int rxPin = 2;
const int txPin = 4;

Toujours pas !!

:\Users\freva\Documents\Arduino\BMEDHT22diodeAir\BMEDHT22diodeAir.ino:21:31: error: cannot bind non-const lvalue reference of type 'HardwareSerial&' to an rvalue of type 'HardwareSerial'
 SdsDustSensor sds(rxPin, txPin);
                               ^
In file included from C:\Users\freva\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.11\cores\esp32/Arduino.h:184,
                 from C:\Users\freva\AppData\Local\Temp\arduino\sketches\FC3FB74AE7F7DDC61B3BA33750732554\sketch\BMEDHT22diodeAir.ino.cpp:1:
C:\Users\freva\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.11\cores\esp32/HardwareSerial.h:74:5: note:   after user-defined conversion: 'HardwareSerial::HardwareSerial(int)'
     HardwareSerial(int uart_nr);
     ^~~~~~~~~~~~~~
In file included from C:\Users\freva\Documents\Arduino\BMEDHT22diodeAir\BMEDHT22diodeAir.ino:6:
c:\Users\freva\Documents\Arduino\libraries\Nova_Fitness_Sds_dust_sensors_library\src/SdsDustSensor.h:60:3: note:   initializing argument 1 of 'SdsDustSensor::SdsDustSensor(HardwareSerial&, int, int)'
   SdsDustSensor(HardwareSerial &hardwareSerial,
   ^~~~~~~~~~~~~
C:\Users\freva\Documents\Arduino\BMEDHT22diodeAir\BMEDHT22diodeAir.ino:24:42: error: expected primary-expression before ')' token
 DHT dht(brocheDeBranchementDHT, typeDeDHT);
                                          ^
C:\Users\freva\Documents\Arduino\BMEDHT22diodeAir\BMEDHT22diodeAir.ino: In function 'void loop()':
C:\Users\freva\Documents\Arduino\BMEDHT22diodeAir\BMEDHT22diodeAir.ino:158:1: error: expected '}' at end of input
 }
 ^
C:\Users\freva\Documents\Arduino\BMEDHT22diodeAir\BMEDHT22diodeAir.ino:72:13: note: to match this '{'
 void loop() {
             ^

exit status 1

Compilation error: cannot bind non-const lvalue reference of type 'HardwareSerial&' to an rvalue of type 'HardwareSerial'

Branchement sur ces broches :

image

Ce n'est pas clairement dit dans le readme mais c'est visible dans le code ce constructeur n'est pas valide pour les processeur SAMD et ESP32.
Il faut utiliser celui-ci

SdsDustSensor sds(Serial1); // passing HardwareSerial as parameter, you can tune retry mechanism with additional parameters: retryDelayMs and maxRetriesNotAvailable

Cela signifie que le SDS011 n'est pas compatible ou que je dois modifier quelque chose dans mon code
SdsDustSensor sds(Serial1); à la place de SdsDustSensor sds(rxPin, txPin); ?? je dois admettre que je suis un peu perdu
Merci pour ton aide en tout cas

Dans ton setup(), tu mets

Serial1.begin(BAUD, SERIAL_8N1, rxPin, txPin);

Ca progresse j'ai configuré comme ceci :

const int rxPin = 2;
const int txPin = 4;
SdsDustSensor sds(Serial1);

set up :

sSerial1.begin(115200,SERIAL_8N1,rxPin,txPin);
 Serial1.println(sds.queryFirmwareVersion().toString());
 Serial1.println(sds.setActiveReportingMode().toString());
 Serial1.println(sds.setContinuousWorkingPeriod().toString());
PmResult pm = sds.readPm();
  if (pm.isOk()) {
    Serial.print("PM2.5 = ");
    Serial.print(pm.pm25);
    Serial.print(", PM10 = ");
    Serial.print(pm.pm10);
    Serial.print(pm.toString());
    Serial.println();
  } 

Je passe désormais le compilateur mais dans la console je n'ai pas remonté d'infos

Pourquoi tu utilise Serial1.queryFirmwareVersion au lieu de sds.queryFirmwareVersion
Serial1 est l'objet qui gère le port série, il n'a pas de fonction queryFirmwareVersion
Je suppose que cette fonction appartient plutôt à la classe SdsDustSensor?

EDIT: non effectivement j'ai zappé ton code :slight_smile:
tu as quand même les saut de ligne des println ?
je ne vois pas le sds.begin ?

Effectivement j'ai corrigé mais entre les 2 modifs tu as lu mon message

Bon alors comment dire avec tous mes essais j'avais zappé sds.begin, désolé erreur de ma part :
Désormais j'ai cela sur le moniteur :

ets Jul 29 2019 12:21:46

rst:0x8 (TG1WDT_SYS_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1344
load:0x40078000,len:13964
load:0x40080400,len:3600
entry 0x400805f0
  Et cela en continue

La version finale du code :

SdsDustSensor sds(Serial1);

Set up

sds.begin();
 Serial1.begin(115200, SERIAL_8N1, rxPin, txPin);
 //Serial1.println(sds.queryFirmwareVersion().toString());
 //Serial1.println(sds.setActiveReportingMode().toString());
 //Serial1.println(sds.setContinuousWorkingPeriod().toString());

loop

// Affichage mesures particules
PmResult pm = sds.readPm();
  if (pm.isOk()) {
     Serial.print("Message: ");
    Serial.print("PM2.5 = ");
    Serial.print(pm.pm25);
    Serial.print(", PM10 = ");
    Serial.print(pm.pm10);
    Serial.print(pm.toString());
    Serial.println();
  } 
  else {
    Serial.print("Could not read values from sensor, reason: ");
    Serial.print(pm.statusToString());
    Serial.println();

}


Dés que je supprime la ligne de code mes autres infos mais bien sûr pas celles concernant la qualité de l'air

 //sds.begin();

image

Peut être est ce un conflit avec un autre serial begin plus bas???

void setup() {

  pinMode(pinDEL, OUTPUT);  // on veut piloter la DEL
  dht.begin();
// Initialisation particules

 //sds.begin();
 //Serial1.begin(115200, SERIAL_8N1, rxPin, txPin);
 //Serial1.println(sds.queryFirmwareVersion().toString());
 //Serial1.println(sds.setActiveReportingMode().toString());
 //Serial1.println(sds.setContinuousWorkingPeriod().toString());

  Serial.begin(115200);

Le programme au complet :


// V1 Mesure particule



#include "SdsDustSensor.h"                   


const int rxPin = 2;
const int txPin = 4;
SdsDustSensor sds(Serial1);

// Instanciation des  librairies
void setup(){

 sds.begin();
 Serial1.begin(9600, SERIAL_8N1, rxPin, txPin);
 Serial1.println(sds.queryFirmwareVersion().toString());
 Serial1.println(sds.setActiveReportingMode().toString());
 Serial1.println(sds.setContinuousWorkingPeriod().toString());


  }
// ======================================
// Boucle principale (boucle perpétuelle)
// ======================================
void loop() {

// Affichage mesures particules
PmResult pm = sds.readPm();
  if (pm.isOk()) {
     Serial.print("Message: ");
    Serial.print("PM2.5 = ");
    Serial.print(pm.pm25);
    Serial.print(", PM10 = ");
    Serial.print(pm.pm10);
    Serial.print(pm.toString());
    Serial.println();
  } 
  else {
    Serial.print("Could not read values from sensor, reason: ");
    Serial.print(pm.statusToString());
    Serial.println();
}
  // ... et on répète ce cycle à l'infini !
  
  delay(3000);                // Avec x secondes d'attente, avant chaque rebouclage
  Serial.println();                                     
}

Message dans l'afficheur :

22:57:04.907 -> configsip: 0, SPIWP:0xee
22:57:04.907 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
22:57:04.958 -> mode:DIO, clock div:1
22:57:04.958 -> load:0x3fff0030,len:1344
22:57:04.958 -> load:0x40078000,len:13964
22:57:04.958 -> load:0x40080400,len:3600
22:57:04.958 -> entry 0x400805f0
22:57:05.685 -> ets Jul 29 2019 12:21:46

Je n'ai pas l'habitude de ce composant, mais j'aurais inversé l'ordre des lignes.

Bonjour
J’ai inversé les 2 lignes mais sans succès

Re bonjour,
Je travaille toujours sur l'intégration de mon analyseur d'aire j'ai repris toutes les remarques mais j'ai toujours un retour sur moniteur très étrange :
J'ai branché mon SDS011 sur ces 2 broches :
image

J'ai désormais suite à tes conseils ce programme :


#include <DHT.h>
#define brocheDeBranchementDHT            23 
#define typeDeDHT                         DHT22
#include "SdsDustSensor.h"


int led = 13; 

const int rxPin = 2;
const int txPin = 4;
SdsDustSensor sds(Serial1);


DHT dht(brocheDeBranchementDHT, typeDeDHT);


void setup() {

pinMode(led, OUTPUT); 

 Serial.begin(115200);
 dht.begin(); 

 sds.begin();
 Serial1.begin(115200, SERIAL_8N1, rxPin, txPin);
 Serial1.println(sds.queryFirmwareVersion().toString());
 Serial1.println(sds.setActiveReportingMode().toString());
 Serial1.println(sds.setContinuousWorkingPeriod().toString());
}

void loop() {

digitalWrite(led, HIGH); 

// ****Mesure Temp****  
float h = dht.readHumidity();
float t = dht.readTemperature();
 
Serial.print("{\"humidity\": ");
Serial.print(h);
Serial.print(", \"temp\": ");
Serial.print(t);
Serial.print("}\n");

//***Mesure de particules
PmResult pm = sds.readPm();
  if (pm.isOk()) {
    Serial.print("PM2.5 = ");
    Serial.print(pm.pm25);
    Serial.print(", PM10 = ");
    Serial.println(pm.pm10);
    Serial.println(pm.toString());
  } 
  else {
    Serial.print("Could not read values from sensor, reason: ");
    Serial.println(pm.statusToString());
  }
digitalWrite(led, LOW); 
delay(4000);

}

J'ai sur le moniteur suivant les infos suivantes :

8:38:26.940 -> entry 0x400805f0
18:38:27.702 -> ets Jul 29 2019 12:21:46
18:38:27.702 ->
18:38:27.702 -> rst:0x8 (TG1WDT_SYS_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
18:38:27.702 -> configsip: 0, SPIWP:0xee
18:38:27.702 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
18:38:27.702 -> mode:DIO, clock div:1
18:38:27.702 -> load:0x3fff0030,len:1344
18:38:27.702 -> load:0x40078000,len:13964
18:38:27.702 -> load:0x40080400,len:3600
18:38:27.702 -> entry 0x400805f0

Je me perds peut être dans les serial ou serial1
Serial1.println(sds.queryFirmwareVersion().toString());
ou
Serial.println(sds.queryFirmwareVersion().toString());

Je n'arrive même plus à avoir les infos concernant les temprétaures avec le DHT

Merci pour le coup de main