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배 정도 늘어난다.
양치 했는데도 저 정도 나왔다.
다음은 MPU6050 모듈을 개발할 차례이다.
'Projects > 센서 모니터링 시스템' 카테고리의 다른 글
[센서 모니터링 시스템] 6. Spring 서버 기본환경 설정 (0) | 2022.08.17 |
---|---|
[센서 모니터링 시스템] 5. MPU6050(가속도 센서) 모듈 개발 (0) | 2022.08.17 |
[센서 모니터링 시스템] 3. I2C 포트 제어하기 (0) | 2022.08.17 |
[센서 모니터링 시스템] 2. 라즈베리파이 개발환경 구성 (0) | 2022.08.17 |
[센서 모니터링 시스템] 1. 프로젝트 시작 (0) | 2022.08.17 |