Problème modif de script avec capteur grove CO2 Sensor

bonjour à tous,

je viens vers vous pour un problème sur une ligne de code dont je ne comprend pas l'impact de la modification.

je travaille avec un capteur grove CO2 sensor (https://wiki.seeedstudio.com/Grove-CO2_Sensor/)

voici le code que j'utilise et qui fonctionne sans problème :

#include <SoftwareSerial.h>

SoftwareSerial s_serial(2, 3);    

#define sensor s_serial

const unsigned char cmd_get_sensor[] =
{
    0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79
    // Read gas concentration
};

unsigned char data[9];
int temperature;
int CO2PPM;
 
void setup() {
    sensor.begin(9600);
    Serial.begin(9600);
    Serial.println("get a 'g', begin to read from sensor!");
    Serial.println("********************************************************");
    Serial.println();
  }
 
void loop() {
    if(dataReceive()){  
      Serial.print("T = ");
      Serial.print(temperature);
      Serial.print(" C");
      Serial.print("  CO2 = ");
      Serial.print(CO2PPM);
      Serial.print(" ppm ");
      Serial.println("");        
    }
    delay(1000);
}
 
bool dataReceive(void){
    byte data[9];
    int i = 0;
    for(i=0; i<sizeof(cmd_get_sensor); i++){
        sensor.write(cmd_get_sensor[i]);
    }
    delay(10);
    if(sensor.available()) { 
       Serial.println("capteur disponible");
       while(sensor.available()){
            for(int i=0;i<9; i++){
                data[i] = sensor.read();
            }
        }
    } 
 
    if((i != 9) || (1 + (0xFF ^ (byte)(data[1] + data[2] + data[3] + data[4] + data[5] + data[6] + data[7]))) != data[8]){
        return false;
    }
    
    CO2PPM = (int)data[2] * 256 + (int)data[3];
    temperature = (int)data[4] - 40;
 
    return true;
}

je souhaite apporté une modification en supprimant simplement le Serial.println("capteur disponible"); dans la fonction booléenne, pour n'avoir que les print présent dans la fonction loop.
mais pour une raison que j'ignore, la suppression de ce print semble faire la passer la fonction bool en false permanent, et n'affiche donc plus les valeurs de la fonction loop ensuite.

est-ce que quelqu'un aura une idée du pourquoi du comment ?

merci à vous

Bonjour jmtjmt

Pourrais tu mettre ton programme modifié qui pose problème?

A+
Cordialement
jpbbricole

en faite, je veux juste ça pour commencer :

#include <SoftwareSerial.h>

SoftwareSerial s_serial(2, 3);    

#define sensor s_serial

const unsigned char cmd_get_sensor[] =
{
    0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79
    // Read gas concentration
};

unsigned char data[9];
int temperature;
int CO2PPM;
 
void setup() {
    sensor.begin(9600);
    Serial.begin(9600);
    Serial.println("get a 'g', begin to read from sensor!");
    Serial.println("********************************************************");
    Serial.println();
  }
 
void loop() {
    if(dataReceive()){  
      Serial.print("T = ");
      Serial.print(temperature);
      Serial.print(" C");
      Serial.print("  CO2 = ");
      Serial.print(CO2PPM);
      Serial.print(" ppm ");
      Serial.println("");        
    }
    delay(1000);
}
 
bool dataReceive(void){
    byte data[9];
    int i = 0;
    for(i=0; i<sizeof(cmd_get_sensor); i++){
        sensor.write(cmd_get_sensor[i]);
    }
    delay(10);
    if(sensor.available()) { 
       while(sensor.available()){
            for(int i=0;i<9; i++){
                data[i] = sensor.read();
            }
        }
    } 
 
    if((i != 9) || (1 + (0xFF ^ (byte)(data[1] + data[2] + data[3] + data[4] + data[5] + data[6] + data[7]))) != data[8]){
        return false;
    }
    
    CO2PPM = (int)data[2] * 256 + (int)data[3];
    temperature = (int)data[4] - 40;
 
    return true;
}

la simple suppression de la ligne serial.print fait que tout les print de la fonction loop ne s'affiche plus

Le print ralentissait votre boucle suffisamment pour que vous lisiez tout le payload mais maintenant ce n’est plus le cas sans doute.

Si vous voulez attendre 9 octets de manière bloquante faite une boucle et testez le available avant de lire, et répétez cela 9 fois.

byte compteur = 0;
while(true) {
  if (sensor.available()) {
    data[compteur++] = sensor.read();
    if (compteur >= 9) break; // on sort du while
  }
}

C’est un peu comme le souci avec Serial, ou gérer un flux asynchrone genre keypad, vous pouvez jeter un oeil à mon petit tuto sur le sujet

Le mieux serait de faire cela en non bloquant

Notez aussi que vous pouvez sans doute remplacer

Par

sensor.write(cmd_get_sensor, sizeof cmd_get_sensor );

Ça va envoyer tous les octets pour vous.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.