Capteur de CO2 SCD30 : Notation "Big-Endian"

Résolu
quattro46 Messages postés 6 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je suis actuellement en train de mettre en œuvre le SCD30, celui-ci me retourne bien la valeur du CO2 mais sous la notation "Big-Endian" en décimal

J'obtiens : 1144590981 dans le terminal

Je programme en Python, j'utilise un ESP8266 comme microcontrôleur.

Mon code ci-dessous est le suivant :

from machine import Pin, I2C
import time

adressSCD30 = 0x61
GET_DATA_READY = 0x0202

i2c = I2C(sda=Pin(4), scl=Pin(5), freq=100000)
i2c.writeto(0x61,b'\x03\x00')

while True :
    i2c.writeto(0x61, b'\x02\x02')
    var = i2c.readfrom(0x61, 3)
    dataready = list(var)
    print(dataready)
    ready = dataready[1]
    time.sleep(1)
    if ready == 1:
        i2c.writeto(0x61, b'\x03\x00')
        time.sleep(0.0001)
        var= i2c.readfrom(0x61, 18)
        data = list(var)
        print(data)
        strucco2 = var[0] << 24 | var[1] << 16 | var[3] << 8 | var[4]
        DataT = int(strucco2)
        print(DataT)
        time.sleep(2) 


Je ne vois pas comment je pourrais convertir la valeur en "Big-Endian" en décimal...

Dans la datasheet du composant, nous avons comme exemple :


Example: The CO2 concentration 400 ppm corresponds to 0x43c80000 in Big-Endian notation. Je ne vois pas comment ils sont arrivés à trouver 400 ppm.

Lien de la documentation complète

Configuration: Windows / Chrome 100.0.4896.75

3 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 942
     
    Bonjour,

    Pour faire une conversion little endian - big endian, il faut réordonner les octets (bytes) comme expliqué dans cet article. En python, cela peut se faire à l'aide d'un
    bytearray
    comme expliqué dans cette discussion.

    Cependant il y a un autre piège, et c'est sans doute ce qui t'empêche de comprendre l'exemple. Les 4 octets, une fois réordonnés, servent à encoder un
    float
    et non un
    int
    (il m'a moi même fallu un peu de temps pour comprendre, car l'exemple est mal choisi et omet la partie décimale). J'ai pu recoller les bouts grâce à la documentation complète (p19) qui donne un exemple en C, donc il m'a suffit de traduire cela en python en m'inspirant de cette discussion.

    Méthode 1 : en passant par un
    bytearray


    import struct
    
    def le_hex_to_co2_ppm(le_hex):
        ba = bytearray.fromhex("%x" % le_hex) # Conversion string -> bytearray
        ba.reverse() # Conversion big endian -> little endian
        tup = struct.unpack("f", ba) # Conversion 4 octets -> float
        return tup[0]
    
    print(le_hex_to_co2_ppm(0x43c80000)) # Exemple que tu as cité
    print(le_hex_to_co2_ppm(0x43DB8C2E)) # Exemple p19


    (Note que dans cette implémentation, je dois convertir
    le_hex
    sous forme de chaîne de caractère pour initialiser
    ba
    , c'est assez inélégant mais je n'ai pas trouvé mieux.

    Résultat :

    400.0
    439.09515380859375


    Méthode 2 : en passant par
    to_bytes


    Face à l'inélégance du constructeur de
    bytearray
    , j'ai creusé et j'ai trouvé la méthode
    to_bytes
    qui permet de faire la même chose de manière bien plus directe :

    def le_hex_to_co2_ppm(le_hex):
        tup = struct.unpack("f", le_hex.to_bytes(4, byteorder="little"))
        return tup[0]


    Bonne chance
    1
  2. Dalfab Messages postés 638 Date d'inscription   Statut Membre Dernière intervention   102
     
    Bonjour,

    Le code ne peut pas être lu si tu n'utilises pas la balise [ <> ] pour le poster.
    Néanmoins on peut y lire:
    strucco2 = var[0]<<24 | var[1]<<16 | var[3]<<8 | var[4]
    
    Qui correspond à lire les 4 octets pour en faire un nombre issu de données Big-endian. Il te faut modifier cette ligne pour qu'elle devienne : lire les 4 octets pour en faire un nombre issu de données Little-endian.
    0
  3. quattro46 Messages postés 6 Statut Membre
     
    Le capteur fonctionne ! Merci beaucoup !
    0
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 942
       
      Félicitations et bonne continuation :-)
      0