capteur de CO2 COZIR et communication RS232 UART

papaof2

Senior Member
Je regret. Je ne parle Francais. One semester in college 20 years ago.

Datasheet: https://raw.githubusercontent.com/SeeedDocument/Grove-CO2_Sensor/master/res/MH-Z16_CO2_datasheet_EN.pdf

Interface: 3.3V
Output: PWM, UART
Average current: 85ma
Preheat: 3 minutes

1.General Settings
Baud rate 9600
Date byte 8 byte
Stop byte 1byte
Calibrate byte no

2.Command
Each command or return:
Contains 9 bytes (byte 0 ~ 8)
starting byte fixed 0 XFF
command contains sensor number (factory default to 0 x01)
to check and end

Command List:
0x86 Gas concentration
0x87 Calibrate zero point(ZERO)
0x88 Calibrate span point(SPAN)

Read gas concentration
Send command
Byte0 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 Byte8

You need the datasheet.
 

spheris

Senior Member
Papaof2,
Thanks you for data sheet.
In fact, I search code to dialog with this sensor with picaxe 20m2 and UART.
Do you have in your old archives from school?
Bye.

Edit:
If i understand your message correctly, to send command to read could be:

Serout C.0,T_9600,(0xFF,0x86,b0,b0,b0,b0,b0,b0,0x01)

And to receive:
Serin C.1,T_9600,b0,b1,b2,b3,b4,b5,b6,b7,b8

Is it exact?
 
Last edited:

papaof2

Senior Member
I have not used the sensor so I do not know if your code is correct.

Hserin and Hserout are more accurate if the PICAXE you are using supports them.
 

PieM

Senior Member
If i understand your message correctly, to send command to read could be:
Non lire la doc PDF envoyée par Papaof2:

la lecture doit comporter le N°du capteur avant le 0x86
Le serout se termine par un cheksum : checksum = (invert (byte 1 +... + 7)) + 1

Except byte 0 ,add the other bytes together
0x1 + 0x86 + 0 + 0 + 0 + 0 + 0 = 0x87
Get the value from the first step, then invert it.
0xff – 0x87 = 0x78
The second value plus one
0x78 + 0x01 = 0x79


Le résultat sera 0xFF, 0x86, b3, b2, .....
concentration en gaz : 256*b3 + b2 soit w1
 

spheris

Senior Member
PieM,
Je fais une synthèse donc de ce que vous me dites :
En résumé, pour lire la concentration sur le capteur, voici le code :

Code:
Serout C.0,T_9600,(0xFF,0x01,0x86,b0,b0,b0,b0,0x79) 'envoie requete capteur

Serin C.1,T_9600,b5,b4,b3,b2,b1,b0,b6,b7,b8 'lecture capteur

w8=(256*b3)+b2
est-ce exact?
Un grand merci pour votre aide.
 

PieM

Senior Member
Oui, maintenant c'est au Picaxe de le dire ...
attention à la syntaxe T9600 et non T_9600 !
Si le résultat est souhaité être dans w8 qui est formé de b16 et b17, alors:
Serin C.1,T9600,b5,b4,b17,b16,b1,b0,b6,b7,b8

Si il n'y a pas de contrôle de parité lors de la lecture, n'utiliser qu'un seul octet pour lire les infos inutiles:
Serin C.1,T9600,b1,b1,b17,b16,b1,b1,b1,b1,b1

Et lors de la requête lecture:

High C.0 (si Txxxx)
Serout C.0,T9600,($FF,$01,$86,$00,$00,$00,$00,$79) car b0 peut prendre une autre valeur que 0 dans le programme.

J'ai un doute que la logique soit un T9600 ... essayer avec N9600.

Attention aussi que l'interface Rx Tx du capteur est en 3.3V !!
Si le picaxe est alimenté en 5V mettre un diviseur 1.8 / 3.3 en sortie C.0
 
Last edited:

spheris

Senior Member
PieM,
Merci pour ces infos, mais il y a un truc que je ne comprends pas.

A)En mettant T9600 cela me donne une erreur.
Par contre si j'écris T9600_8, la syntaxe est correcte.
Pourtant dans la doc, on peut mettre simplement T9600. Pourquoi donc?

B) un serout envoi bien les données à travers le pont diviseur( 3 resistance de 10K)
Par contre je pense que le serin tourne en boucle et ne renvoi rien, si je mets un timeout de 1500, alors je débloque mais reçois 0 dans b17 et b16.

Voici mon code pour un 08M2 :

Code:
do
    high C.2
    Serout C.2,T9600_8,($FF,$01,$86,$00,$00,$00,$00,$79)
    Serin [1500],C.1,T9600_8,b5,b4,b17,b16,b1,b0,b6,b7,b8
    sertxd ("info je suis après le serin")
    sertxd (#b17,";",#b16,"#")
pause 2000
loop
Edit : J'ai tout essayé : T9600_8, T9600_16, 32, 64 ou N9600_8 etc... b17 et b16 sont toujours à zéro quelque soit le pourcentage de co2 injecté sur le capteur.
 

PieM

Senior Member
Pour 9600 bauds, le Picaxe doit tourner à 8 MHz!
Donc setfreq m8 en début de prg.
Quand il y a des problèmes, merci de donner la totalité du programme....

Ensuite tester avec avec T9600_8 , et N9600_8
Pourtant dans la doc, on peut mettre simplement T9600. Pourquoi donc?
Si on ne met rien, c'est que c'est à la fréquense de base du picaxe, ici, 4 MHz
 
Top