Problème avec ce capteur UART

Bonjour ;

Je joins ici l’erreur. Quelqu’un a-t-il rencontré ce problème ? Je communique avec le capteur Co2 via UART à l’ESP32 mais je ne peux pas lire le code.
Mais il affiche toujours la même erreur.
Je ne sais pas si vous avez des pistes pour résoudre ce problème…
"‹  ›’ Reading from UART timed out at byte 4! issue ‹  ›‹  ›‹  ›

Merci

Bonjour

Pas de code…
quel capteur CO²

difficile de t’aider

mon petit doigt me dit cependant que c’est une erreur de vitesse de com.ou inversion TXRX

Ton Code est … ILLISIBLE
pas de code lisible
pas de volonté de repondre.

on veux bien aider…
Mais j’suis pas madame IRMA ni les autres non plus

donc republie correctement ton code avec les balises qui vont bien

</>

n’oublie pas le test.h et ainsi que le code source associé

et la peut être que quelqu’un prendra la peine de te répondre positivement

juste pour rappel sur la page principale du forum

[

Entraide Home Assistant
](Entraide Home Assistant - Home Assistant Communauté Francophone)

Un problème avec home Assistant, c’est ici. N’oubliez pas de faire une recherche avant d’ouvrir un sujet. Remplissez les informations demandées et n’hésitez pas à donner un maximum de détails. NOTA : Nous vous rappelons que nous sommes tous des bénévoles et que nous essayons d’aider à résoudre les p…

Bonjour,

Il est vrai que lire un code pareil, comment dire… Ça pique les yeux!!!

C’est quoi le critère pour dire que le câblage est correct?
C’est quoi le critère pour dire que le code est correct?
Quelle est donc la sonde? Câblée, alimentée comment?

Avec autant d’elements, c’est clair qu’il est impossible de deviner la source du problème…

1 « J'aime »

Bonjour ;
En fait, j’ai modifié le code en fonction du modèle de capteur.
Je joins ici la référence du code sur github. Veuillez y jeter un coup d’œil. Il a utilisé ce code pour le capteur de CO2. Mais j’utilise le modèle mis à jour du même capteur de CO2. Je joindrai la fiche technique. Aidez-moi…
ESPHome_Nodes/CM1106_CO2_Sensor at main · LeoDJ/ESPHome_Nodes · GitHub

(CM1106SL-NS Low Power Single Channel NDIR CO2 Sensor – Innovaer technologies)

Bonjour Remo

Justement si tu as modifié le code, il est est nécessaire de pouvoir s’assurer des modifications:
Merci de publier les codes .yaml et .h ET avec des balises sinon c’est totalement illisible et ne sert a rien… :face_with_raised_eyebrow:

Également un schéma pour s’assurer du câblage entre l’ESP(lequel?) et la sonde…

Cordialment

Édit:
La sonde elle sort d’où??? Tu l’as acheté sur ce site, Illinois,USA? Tu es sûr qu’il s’agit de celle là???

… Suite…

En plus les hardware entre ces deux sondes n’est pas le même…
Il est donc clair qu’avec si peu d’information, ton ‹ projet › va vite tomber à l’eau…

Merci .J’ai connecté l’UART à l’ESP32 en utilisant les broches TX et RX.
Je n’arrive pas à obtenir de réponse du capteur.
Pourriez-vous me dire où je dois modifier le code matériel ?

Bonjour
Quel ‹ code matériel ›?

Il est ou le câblage?
Il est ou le logiciel chargé dans l’ESP? Quel ESP? Quelle est la sonde (photo?!)?

Sans réponse ce n’est pas la peine de poser des questions, non? :face_exhaling:

Cordialement

The ESP32’s operating voltage range is 2.2 to 3.6V. Under normal operation the ESP32 Thing will power the chip at 3.3V. The I/O pins are not 5V-tolerant ! If you interface the board with 5V (or higher) components, you’ll need to do some level shifting.

tu es en train de cramer tes entrées uart
Fin de l’aide pour ma part

1 « J'aime »

Bonjour,

Normalement, la sonde n’a pas du ‹ cramer ›

Si la sonde est bien « -SL », ce n’est pas du tout le même câblage: l’alimentation se trouve sur le connecteur 5 broches, avec le RX et TX. Il y a en plus une ligne’Enable ’ a gèrer, sur le connecteur 4 points.

Il EST impérativement d’avoir le type de la sonde: une photo avec la réf!
Dans le cas contraire cela va cramer, et cela ne fonctionnera plus( je le demande si c’est pas déjà le cas!!)

Pour le code, je n’ai pas vu le code… Uniquement un truc immonde, illisible et incomplet un peu plus haut!

Merci de mettre le code,.yaml et .h utilisés ici, mais avec des balises, sinon c’est illisible…

Cordialement

Je n’arrive pas à ajouter des tags mais j’ai joint un lien… Vérifiez-le une fois… Dois-je garder la broche d’activation EN à GND… ?
Mon module ESP32 a +5V et le capteur a besoin de +5V pour s’alimenter.
sensor ---- ESp32
VCC (+5)---- 5v
gnd ---- gnd
TX---- RX
RX – TX
EN — ?? (gnd/vcc)
code :
ESPHome_Nodes/cm1106.h at main · LeoDJ/ESPHome_Nodes · GitHub

Re bonjour Remo,
Sans connaitre le module exact je ne peux rien faire…
Je ne pourrais probablement que donner des informations erronées qui pourrait détruire les équipements, les sondes n’ayant pas les mêmes interfaces électriques…
Donc je re-itere les demandes: type de sonde et code associé.

Pour les balises, c’est dans le bandeau en haut lors de l’édition des messages( je ne pas en faire plus, je suis sur téléphone, pas adapté pour faire des croquis ou schéma ou copie d’écran, mais il doit très certainement y avoir des messages sur le forum qui expliquent comment faire…)

Merci, en attendant les informations demandées pour avancer sur le sujet :upside_down_face:

bonjour ;

Le module est un capteur de CO2 CM1106SL-NS et la fiche technique est jointe. J’ai connecté le capteur via UART au nodemcu Esp32.

saisissez ou collez du code iciesphome:
 YAML 

  name: cm1106
  platform: ESP32
#esp32:
  board: esp32dev
 # framework:
 #   type: arduino
    
  includes:
   - "test.h"
   
   

# Enable logging
logger:
 # level: VERY_VERBOSE


# Enable Home Assistant API
api:
ota:
  password: "cd5c3b809fce86720a8de50155bc2e17"
wifi:
  ssid: "****"
  password: "****"
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Cm1106 Fallback Hotspot"
    password: "9sBOW8YOVRO4"

captive_portal:

# Enable Web server.
web_server:
  port: 80
# Sync time with Home Assistant.
time:
  - platform: homeassistant
    id: homeassistant_time

uart:
  rx_pin: GPIO16
  tx_pin: GPIO17
  baud_rate: 9600
  id: cm1106_uart
 
      
sensor:

- platform: custom                                                          
  lambda: |-
    auto cm1106Sensor = new CM1106Sensor(id(cm1106_uart), 10000);      
    App.register_component(cm1106Sensor);
    return {cm1106Sensor};
  sensors:
  - name: " CO₂ Sensor"                                       
    unit_of_measurement: "ppm"
    accuracy_decimals: 0
    


Low Power CO2 Sensor Module-CM1106SL-N - Cubic Sensor and Instrument Co.,Ltd - PDF Catalogs | Technical Documentation | Brochure (directindustry.com)

custom.h

saisissez ou collez du code ici #include "esphome.h"

class CM1106 : public UARTDevice    {      
  public:
    CM1106(UARTComponent *parent) : UARTDevice(parent)   {}     

void setCo2CalibValue(uint16_t ppm = 400)   {                                                         

        uint8_t cmd[6];
        memcpy(cmd, CM1106_CMD_SET_CO2_CALIB, sizeof(cmd));
        cmd[3] = ppm >> 8;
        cmd[4] = ppm & 0xFF;
        uint8_t response[4] = {0};
         
bool success = sendUartCommand(cmd, sizeof(cmd), response, sizeof(response));             

        if(!success) {    
            ESP_LOGW(TAG, "Reading data from CM1106 failed!");
            return;
        }    
                      

        
        if(memcmp(response, CM1106_CMD_SET_CO2_CALIB_RESPONSE, sizeof(response)) != 0) {
        
            ESP_LOGW(TAG, "Got wrong UART response: %02X %02X %02X %02X", response[0], response[1], response[2], response[3]);
            return;
            
        }

        ESP_LOGD(TAG, "CM1106 Successfully calibrated sensor to %uppm", ppm);

    }
    



int16_t getCo2PPM()  {                                                                         // Get CO2 value in ppm   
    
    
        uint8_t response[8] = {0};                      // response: 0x16, 0x05, 0x01, DF1, DF2, DF3, DF4, CRC. PPM: DF1*256+DF2
        
bool success = sendUartCommand(CM1106_CMD_GET_CO2, sizeof(CM1106_CMD_GET_CO2), response, sizeof(response));
        
        if(!success) {
            ESP_LOGW(TAG, "Reading data from CM1106 failed!");
            return -1;
        }

        if(!(response[0] == 0x16 && response[1] == 0x05 && response[2] == 0x01)) {
            ESP_LOGW(TAG, "Got wrong UART response: %02X %02X %02X %02X...", response[0], response[1], response[2], response[3]);
            return -1;
        }
        
        uint8_t checksum = calcCRC(response, sizeof(response));
        
                  // DF3 and DF4 are reserved 
        
         if(response[6] != checksum) {
            ESP_LOGW(TAG, "Got wrong UART checksum: 0x%02X - Calculated: 0x%02X", response[6], checksum);
            return -1;
        }
        if(response[7] != checksum) {
            ESP_LOGW(TAG, "Got wrong UART checksum: 0x%02X - Calculated: 0x%02X", response[7], checksum);
            return -1;
        }

int16_t ppm = response[3] << 8 | response[4];
        ESP_LOGD(TAG, "CM1106 Received CO₂=%uppm DF3=%02X DF4=%02X", ppm, response[5], response[6]);
        return ppm;
    }


private:

    const char *TAG = "cm1106";
    uint8_t CM1106_CMD_GET_CO2[4] = {0x11, 0x01, 0x01, 0xED};                        // head, len, cmd, [data], crc
    uint8_t CM1106_CMD_SET_CO2_CALIB[3] = {0x11, 0x03, 0x03 };
    uint8_t CM1106_CMD_SET_CO2_CALIB_RESPONSE[2] = { 0x01, 0x03 };  
    
    

    
   
                              //    Checksum: 256-(HEAD+LEN+CMD+DATA)%256

    uint8_t calcCRC(uint8_t* response, size_t len) {

        uint8_t crc = 0;
                                  
            
        for(int i = 0; i < len - 1; i++) {
            crc -= response[i];
        }
        return crc;
        
}

bool sendUartCommand(uint8_t *command, size_t commandLen, uint8_t *response = nullptr, size_t responseLen = 0)  {
    
                                     // Empty RX Buffer
                                 
        while (available()) {
        
            read();
            
        }
                                      // Calculate CRC
                 
        command[commandLen - 1] = calcCRC(command, commandLen);

        write_array(command, commandLen);
        
        flush();
        
        if(response == nullptr) {
        
            return true;
            
        }
        
        return read_array(response, responseLen);
        
    }
    
};



  
class CM1106Sensor : public PollingComponent, public Sensor   {  
  private:
    CM1106 *cm1106;

  public:
    CM1106Sensor(UARTComponent *parent, uint32_t update_interval) : PollingComponent(update_interval) { 
        cm1106 = new CM1106(parent);
    }

    float get_setup_priority() const { return setup_priority::DATA; }

    void setup() override {
    }

    void update() override {
        int16_t ppm = cm1106->getCo2PPM();                                   
        if(ppm > -1) {
            publish_state(ppm);                                             
        }
    }
};

Je suis confronté à l’erreur suivante
Screenshot 2023-03-29 160301

Aaahhhhh…
Bon bref , si tu confirmes que que c’est cette sonde ( cela ne correspond pas au câblage que tu as donné un peu plus haut, faudrait pas que cela bouge comme ça… :face_with_raised_eyebrow:)
Il manque un état haut sur le ‹ enable ›: relier les broches 1 et 2 sur le connecteur 4 pts…
Tous les autres raccodeemnts sont sur le 5 pts, vcc, gnd RX et TX.

Cordialement

Désolé, je les connecte à l’aide de fils. Sonde : USB

«  » Il manque un état haut sur le ’ enable ’ : relier les broches 1 et 2 sur le connecteur 4 pts…
Ma question est de savoir si je dois connecter les broches 1 et 2 à quelles broches de l’ESp32 ? «  »«  »«  »

Merci …

IMG_2570


Nulle part!!

Ce n’est pas la sonde mentionnée!!

Elle est déjà intégré sur une platine!!!

Cela n’a rien avoir!!!