Capteur de CO2 SCD30 : Notation "Big-Endian"

Résolu/Fermé
quattro46 Messages postés 6 Date d'inscription jeudi 24 mars 2022 Statut Membre Dernière intervention 12 mai 2022 - Modifié le 13 avril 2022 à 18:10
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 14 avril 2022 à 16:29
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

mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 7 802
Modifié le 13 avril 2022 à 19:19
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
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
13 avril 2022 à 12:05
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
quattro46 Messages postés 6 Date d'inscription jeudi 24 mars 2022 Statut Membre Dernière intervention 12 mai 2022
14 avril 2022 à 15:15
Le capteur fonctionne ! Merci beaucoup !
0
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 7 802
14 avril 2022 à 16:29
Félicitations et bonne continuation :-)
0