read from mh-z19 CO2 sensor with LPC1114

Dependencies:   SoftSerial mbed

main.cpp

Committer:
kohacraft
Date:
2017-09-29
Revision:
1:c7a36fa2c772
Parent:
0:963c0badad70

File content as of revision 1:c7a36fa2c772:

/* 
 Read from MH-Z19 CO2 Sensor by serial
 and show data to PC throw the softserial
 for LPC1114FN28
 
 MH-Z19B Datasheet http://www.winsen-sensor.com/d/files/infrared-gas-sensor/mh-z19b-co2-ver1_0.pdf
 Also reference https://github.com/nara256/mhz19_uart
 
 please see the blog in detail
 http://kohacraft.com/archives/1068007971.html
 
*/

#include "mbed.h"
#include "SoftSerial.h" // by Erick Olieman https://os.mbed.com/users/Sissors/code/SoftSerial/

SoftSerial pc(dp18,dp17); //Tx,Rx to USB serial (mbed cat)
Serial co2sensor(USBTX, USBRX); //Tx,Rx to mh-z19 CO2 sensor

int main() {
    
    pc.baud(9600);
    co2sensor.baud(9600); 
    
    char command[] = { 0xff , 0x01 , 0x86 , 0 , 0 , 0 , 0 , 0 , 0x79 }; //command of Read CO2 concentration
    char responds[9];
    
    
    while( co2sensor.readable() ) // throw received data away
        responds[0] = co2sensor.getc();
    while( pc.readable() ) // throw received data away
        responds[0] = pc.getc();
        
    long time=0;
   
    while(1) {
        
        //send command
        for( int i=0 ; i<9 ; i++ ) {
            while( co2sensor.writeable() == 0 );   //wait for writable a data
            co2sensor.putc( command[i] );
        }
        
        //receve responds
        unsigned char csm=0;    //clear check sum
        for( int i=0 ; i<9 ; i++ )  //clear responds variable
            responds[i] = 0;
        pc.printf("responds:");
        int i=0;
        for( int timeout = 0 ; timeout < 10000 ; timeout++ ) {        

            if( co2sensor.readable() ) {
                responds[i] = co2sensor.getc(  );
                pc.printf("%x ",responds[i]);
            
                if( responds[0] == 0xff ) {  // wether the first data is 0xff 
                    // sdd check sum
                    csm += responds[i];
                    timeout = 0;
                    i++;
                    if( i>8 )
                        break; // received all data
                }
            }
        }
        
        //check the check sum and show to PC
        csm -= responds[8];
        csm = ( 0xff - csm );
        if( responds[8] == csm ) {  // compare with check sum 
            pc.printf("csm:%x CO2:%dppm temp:%dC stat:%d," , csm , responds[2]*256 + responds[3] , responds[4]-40 , responds[5]);
            pc.printf("%d,%d,%d,%d\r" , time , responds[2]*256 + responds[3] , responds[4]-40 , responds[5]);
        }
        
        wait(1);
        time++;

    }
}