본문 바로가기
Projects/센서 모니터링 시스템

[센서 모니터링 시스템] 4. CCS811(공기질 센서) 모듈 개발

by DevJaewoo 2022. 8. 17.
반응형

CCS811 모듈 개발

2가지 센서 중 첫번째인 공기질 센서 모듈을 개발할 것이다.

이 센서는 공기 중 이산화탄소, 유해물질을 측정한다.

 

아래 사이트에서 데이터시트를 다운로드 받을 수 있다.

https://www.alldatasheet.co.kr/datasheet-pdf/pdf_kor/1047395/AMSCO/CCS811.html

 

CCS811 Datasheet(PDF) - ams AG

Ultra-Low Power Digital Gas Sensor for Monitoring Indoor Air Quality, CCS811 Datasheet

www.alldatasheet.co.kr

 

우선 각 레지스터와 비트들에 대한 값을 변수에 넣어줘야 한다.

그냥 상수로 써도 되지만, 변수에 넣는게 나중에 알아보기 쉽다.

 

예전에 STM32로 개발하면서 C언어로 작성했던 라이브러리가 있어서 복사해왔다.

 

CCS811_ADDRESS                  = 0x5B

CCS811_STATUS                   = 0x00
CCS811_MEAS_MODE                = 0x01
CCS811_ALG_RESULT_DATA          = 0x02
CCS811_RAW_DATA                 = 0x03
CCS811_ENV_DATA                 = 0x05
CCS811_NTC                      = 0x06
CCS811_THRESHOLDS               = 0x10
CCS811_BASELINE                 = 0x11
CCS811_HW_ID                    = 0x20
CCS811_HW_VERSION               = 0x21
CCS811_FW_BOOT_VERSION          = 0x23
CCS811_FW_APP_VERSION           = 0x24
CCS811_ERROR_ID                 = 0xE0
CCS811_APP_START                = 0xF4
CCS811_SW_RESET                 = 0xFF

CCS811_MEAS_MODE0               = 0x00
CCS811_MEAS_MODE1               = 0x10
CCS811_MEAS_MODE2               = 0x20
CCS811_MEAS_MODE3               = 0x30
CCS811_MEAS_MODE4               = 0x40

CCS811_MEAS_DATARDY             = 0x08
CCS811_MEAS_THRESH              = 0x04

CCS811_HW_ID_CODE               = 0x81

CCS811_BOOTLOADER_APP_ERASE     = 0xF1
CCS811_BOOTLOADER_APP_DATA      = 0xF2
CCS811_BOOTLOADER_APP_VERIFY    = 0xF3
CCS811_BOOTLOADER_APP_START     = 0xF4

 

그 다음 파이썬 클래스와 데이터 송수신 메서드를 작성했다.

이제 self.i2c.write~data(CCS811_ADDRESS, ~)를 일일이 작성할 필요 없이 함수만 호출하면 된다.

class CCS811:
        def __init__(self, i2c):
                self.i2c = i2c

        def writeBytes(self, reg, data):
                self.i2c.write_i2c_block_data(CCS811_ADDRESS, reg, data)

        def readBytes(self, reg, len):
                return self.i2c.read_i2c_block_data(CCS811_ADDRESS, reg, len)

 

다음으로 센서 초기화 함수를 작성했다.

데이터시트를 보면 알 수 있듯이 센서는 처음 부팅 시 BOOT_MODE로 들어가는데,

이걸 APPLICATION 모드로 바꿔주지 않으면 데이터가 하나도 안나온다.

이를 해결하기 위해 CCS811_BOOTLOADER_APP_START 레지스터에 빈 데이터를 넣었다.

 

CCS811_MEAS_MODE는 데이터를 1초 주기로 받기 위해 0x10으로 설정했다.

 

while문은 설정이 변경되기까지 시간이 걸리는데, 이를 기다려주는 것이다.

CCS811_STATE_READY = 0x88

class CCS811:
        def __init__(self, i2c):
                self.i2c = i2c
                self.writeBytes(CCS811_BOOTLOADER_APP_START, []) 	# APPLICATION MODE
                self.writeBytes(CCS811_MEAS_MODE, [0x10])		# 1sec Interval

                self.readBytes(CCS811_ERROR_ID, 1)			# Clear Errors

		# Until Device boot complete and data is ready
                while(self.readBytes(CCS811_STATUS, 1)[0] & CCS811_STATE_READY != CCS811_STATE_READY):
                        print(self.readBytes(CCS811_STATUS, 1))
                        sleep(0.5)

 

마지막으로 실제 센서 데이터를 측정하는 함수를 작성했다.

가끔 16번째 비트가 1로 잘못 읽혀서 값이 3만 이상이 나오길래 마스킹 처리해줬다.

CCS811_STATE_READY = 0x88

class CCS811:
        def readData(self):
                data = self.readBytes(CCS811_ALG_RESULT_DATA, 6)

                eCO2 = (data[0] << 8 | data[1]) & (~0x8000)
                tvoc = (data[2] << 8 | data[3]) & (~0x8000)

                return [eCO2, tvoc]

 

테스트용 main 코드를 작성하고 돌려보면 잘 작동하는 것을 볼 수 있다.

import smbus
from time import sleep
from CCS811 import CCS811

i2c = smbus.SMBus(1)

ccs811 = CCS811(i2c)

while True:
        [eco2, tvoc] = ccs811.readData()
        print('eCO2: {} TVOC: {}'.format(eco2, tvoc))
        sleep(1)

 

평소엔 400, 0 정도의 값이 나오다가 내가 입김을 불면 갑자기 값이 4~5배 정도 늘어난다.

양치 했는데도 저 정도 나왔다.

CCS811 측정 결과

 

다음은 MPU6050 모듈을 개발할 차례이다.

반응형