본문 바로가기
모두의 아두이노 환경 센서/3장 실대 대기 측정 센서

C302 MH-Z19B 이산화탄소(CO2) 아두이노 센서[Node js]

by 로니킴 2021. 3. 17.


[모두의 아두이노 환경 센서] 책에서 설명하지 않았지만, PC프로그램을 이용해 실시간으로 [MH-Z19B 이산화탄소 아두이노 센서]의 측정값을 Node js를 이용해 PC 화면에 표시할 수 있다. CH340G 모듈을 사용한 COVERTER 이용하면 센서의 동작 확인이 가능하다.

 

 

 

 

 

MH-Z19B 아두이센소 Node JS 제어하기

USB to TTL Serial Convert 를 이용해 아두이노 없이 직접 MH-Z19B 센서의 UART(Tx, Rx)와 PC를 연결하여 데이터를 읽을 수 있다. 

 

MH-Z19B-아두이센소-CONVERT
MH-Z19B-아두이센소-CONVERT

 

 

 


 

 

 

 


[실행순서] 
(1) PC ↔ USB to Serial Convert ↔ MH-Z19B 센서를 연결한다.  
(2) Node js 를 설치한다.  
(3) Node js 시리얼 모듈을 설치한다. 

C:\> npm install serialport 

 


(4) 소스에서 연결된 시리얼 포트를 변경한다. Notepad 에서 편집하면 된다.  
‘COM13’ 으로 설정된 PORT를 PC환경에 맞추어 변경한다. 

 

이산화탄소센서-JS코드-화면
이산화탄소센서-JS코드-화면

 

 

소스는 다음과 같다. 

const SerialPort = require('serialport');
const internalBus = new (require('events'))();

const {
    APP_PORT,
    STORAGE_FILENAME,
    PUBLIC_PATH,
    UART_ADAPTER,
    MH_REQUEST_INTERVAL,
    MESSAGE_NAME,
} = require('./const');

const GET_CO2_REQUEST = Buffer.from([
    0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79
]);


const port = new SerialPort(
    'COM13',  {
        baudRate: 9600,
    }
);

port.on('data', onPortData);
port.on('open', onPortOpen);
port.on('error', onPortError);


function calculateCrc(buffer) {
    const sumOfBytes1to7 = buffer
        .slice(1, 8)
        .reduce((sum, intVal) => sum + intVal, 0);
    const sumWithInvertedBits = parseInt(
        sumOfBytes1to7
            .toString(2)
            .split('')
            .map(ch => ch === '1' ? '0' : '1')
            .join(''),
        2
    );
    return sumWithInvertedBits + 1;
}

function sendCO2Request() {
    console.log('sent bytes: ', GET_CO2_REQUEST);
    port.write(GET_CO2_REQUEST, function(err) {
        if (err) {
            console.log('write error: ', err);
        }
    });
}

function onPortData(buffer) {

    console.log('received bytes: ', buffer);

    const crc = calculateCrc(buffer);

    const receivedCrc = buffer[8];

    const startByte = buffer[0];
    const sensorNum = buffer[1];
    const co2HighByte = buffer[2];
    const co2LowByte = buffer[3];
    const temperatureRaw = buffer[4];

    if (startByte === 0xFF && sensorNum === 0x86) {

        if (receivedCrc === crc) {

            const ppm = (256 * co2HighByte) + co2LowByte;

            const temperature = temperatureRaw - 40;

            console.log(`measured ppm: ${ppm} and temperature: ${temperature}`);

            const timestamp = new Date();


            internalBus.emit(MESSAGE_NAME, {
                timestamp: timestamp.getTime(),
                ppm,
                temperature,
            });

        } else {

           console.log(`checksum error`);
           console.log('crc', crc);
           console.log('receivedCrc', receivedCrc);

       }

    } else {
        console.log(`unexpexted first two bytes of response`);
    }
}

function onPortOpen() {
    console.log(`serial port was opened`);
    sendCO2Request();
    setInterval(sendCO2Request, MH_REQUEST_INTERVAL);
}

function onPortError(err) {
    console.error(err);
}

 

 

(5) Window CMD 창에서 다음을 실행한다.

node mhz19b.js

이산화탄소-JS코드-실행화면
이산화탄소-JS코드-실행화면

 

 

 

 

 


 

모두의 아두이노 환경 센서 책

[모두의 아두이노 환경 센서] 책은 예스24, 인터넷 교보문고, 알라딘, 인터파크도서, 영풍문고, 반디앤루니스 , 도서11번가 등에서 구입할 수 있다. 이 책에서는 PMS7003, GP2Y1010AU0F, PPD42NS, SDS011 미세먼지 센서, DHT22 온습도 센서, MH-Z19B 이산화탄소 센서, ZE08-CH2O 포름알데히드 센서, CCS811 총휘발성유기화합물 TVOC, GDK101 방사선(감마선) 센서, MQ-131 오존(O3) 센서, MQ-7 일산화탄소, MICS-4514 이산화질소 센서, MICS-6814 암모니아 센서, DGS-SO2 아황산가스(SO2) 센서, BME280 기압 센서, GUVA-S12SD 자외선(UV) 센서, MD0550 기류 센서, QS-FS01 풍속 센서(Wind speed) 를 사용한다.  

 

 

모두의 아두이노 환경 센서

아두이노와 센서로 내 건강을 지킬 수 있다!다양한 환경 센서를 실생활 프로젝트에 응용해보자!시중에 판매되고 있는 간이측정기도 센서로 값을 측정합니다. 똑같은 센서를 아두이노에 연결하

book.naver.com

 



댓글