CozIR-LP2
GSS CO2 Sensor CozIR-LP2 제품의 사용 방법, 통신 프로토콜에 대한 내용을 공유하고있습니다.
1.특징
최첨단 Solid-State LED 광학 기술 이용한 초 저전력 NDIR CO2 센서
디지털(UART) 및 I2C 출력
높은 CO2 측정 정확도 유지하면서 전력 소비 줄일 수 있음
내장형 자동 영점 조정
30 ppm(일반) 정확도
2.애플리케이션
난방, 환기 및 공기 조절(HVAC)
건물 관리 시스템(BMS)
환기 조절 시스템(DCV)
차량 내 공기 질
무선 장비를 이용한 IoT 및 Smart Technology
실내 공기 질(IAQ)
계측
농업
항공우주
3.사양

측정 범위
CozIR-LP2-2000: 0-2000ppm CozIR-LP2-5000: 0-5000ppm CozIR-LP2-1: 0-10,000ppm (1%)
센서 내부
Solid-State, 가열된 필라멘트 없음
통신 방식
UART 또는 I²C
전원 전압
3.25-5.5V
소모 전류
측정 모드: 15mA 절전 모드: 0.01mA
응답 시간
30.5ms
센서 치수 및 무게
L x W x H(31mm x 19.5mm x 8.7mm), Weight(2.5g)
센서 내구성
진동 및 충격에 강하고 비가열성
센서 교정
자동 영점교정 기능 내장
센서 수명
15년
헤더 핀 크기
1.27mm
4.제품 크기 및 핀 특성

GND
VSS
VDD
Positive Supply
Rx_In
Digital Input
Tx_out
Digital Output
I2C_ENABLE
Digital Input
I2C_SCL
I2C clock
I2C_SDA
I2C data
5.디바이스 연결 방법
Connection DIAGRAM (UART)
Connection DIAGRAM (I2C)
연결 예시
VCC
5V or 3.3V
VCC
GND
GND
GND
TX
13
RX
RX
12
TX
VCC
5V or 3.3V
VCC
GND
GND
GND
TX
A5
SCL
RX
A4
SDA
VCC
5V or 3.3V
VCC
GND
GND
GND
TX
13
RX
RX
12
TX

VCC
5V or 3.3V
VCC
GND
GND
GND
TX
D11
SCL
RX
D12
SDA
VCC
5V or 3.3V
VCC
GND
GND
GND
TX
5
RX
RX
6
TX

VCC
5V or 3.3V
VCC
GND
GND
GND
TX
13
SCL
RX
12
SDA
VCC
3.3V
VCC
GND
GND
GND
TX
15
RX
RX
13
TX

VCC
5V or 3.3V
VCC
GND
GND
GND
TX
D5
SCL
RX
D6
SDA
6.통신 환경 및 명령어
통신 환경
Buad Rate
9600
Bits/s
Data Bits
8
Parity
None
Stop Bits
1
Hardware Flow Control
None
통신 명령어
K 0
Command를 기다리는 상태, 측정 X
K 00000
K 1
연속적으로 값을 측정
K 00001
K 2
센서 값 요청시에만 응답
K 00002
Z
가장 최근에 측정한 CO2 필터 된 값
Z 00521
z
가장 최근에 측정한 CO2 필터 되지 않은 값
z 00521
A ###
CO2 필터 값 설정
A 00016
a
CO2 필터 값 확인
a 00016
U
질소를 사용하여 제로 교정
U 33000
u
초기 설정 값으로 제로 교정
u
G
Fresh Air를 사용하여 제로 교정
G 33000
X #####
현재 값으로 스팬 교정
X 11000
P 10### P 11###
Fresh Air에서 사용할 대기 중 농도를 설정 (default 400ppm)
Fresh Air에서 사용할 대기 중 농도를 설정 (default 400ppm)
S ###
고도 설정
S 08192
s
고도 설정 값 확인
s 08192
M ###
측정 데이터 문자열로 전송
M 6
7.모드 설정 및 CO2 값 읽기
COMMAND 모드: COMMAND를 기다리는 상태, 측정 X
Streaming 모드(default): 연속적으로 값을 측정함(초당 2회 측정), 측정 외 다른 Command시 100ms delay가 필요함
Polling 모드: 센서 값 요청 시에만 응답, 센서 값 요청하지 않을 때에는 백그라운드에서 계속 측정을 수행함
Command
K 0
명령어 기다리는 상태
K 00000
Streaming
K 1
연속적으로 값 측정
K 00001
Polling
K 2
센서 값 요청 시에만 응답
K 00002
Streaming mode에서 CO2 값 읽기
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //Uno Rx Tx (12 13) = SoftwareSerial
const char* Polling_mode = "K 2\r\n";
const char* Stream_mode = "K 1\r\n";
const char* Standby_mode = "K 0\r\n";
bool tx_ready;
bool rx_ready;
String str;
void setup() {
Serial.begin(9600); //시리얼 통신 초기화
mySerial.begin(9600);
while(!mySerial){} //시리얼 통신 포트가 연결되기 전까지 대기
delay(14); // power on data ready
mySerial.print(Stream_mode); //Polling 모드로 변경
mySerial.print("Z\r\n"); //CO2값 읽기 명령
}
void loop()
{
if(rx_ready == 0) // overflow 처리
{
delay(31); // Measurement data ready
if(mySerial.available()>0) //수신받은 데이터가 0 초과, 즉 데이터가 존재한다면
{ //버퍼에서 읽어드린 char의 데이터를 String 형태로 반환
str = "";
str = mySerial.readStringUntil('\n');
Serial.println(str);
rx_ready = 1;
tx_ready = 1;
}
}
else if(tx_ready == 1)
{
mySerial.print("Z\r\n"); //CO2값 읽기 명령
tx_ready = 0;
rx_ready = 0;
}
}
Polling mode에서 CO2값 읽기
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //Uno Rx Tx (12 13) = SoftwareSerial
const char* Polling_mode = "K 2\r\n";
const char* Stream_mode = "K 1\r\n";
const char* Standby_mode = "K 0\r\n";
String str;
void setup() {
Serial.begin(9600); //시리얼 통신 초기화
mySerial.begin(9600);
while(!mySerial){} //시리얼 통신 포트가 연결되기 전까지 대기
delay(14); // power on data ready
mySerial.print(Polling_mode); //Polling 모드로 변경
}
void loop()
{
if(Serial.read() == 'R')
{
mySerial.print("Z\r\n"); //CO2값 읽기 명령
}
if(mySerial.available()>0) //수신받은 데이터가 0 초과, 즉 데이터가 존재한다면
{ //버퍼에서 읽어드린 char의 데이터를 String 형태로 반환
str = "";
str = mySerial.readStringUntil('\n');
Serial.println(str);
}
}시리얼 모니터에 'R' 입력 후 엔터

응답

8.UART,I2C CO2값 읽기
I2C
#include <Wire.h>
#define Slave_adddress 0x41
#define CO2_READ_command 0x34
#define CO2_READ_and_test_command 0x02
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop() {
int CO2_value = 0;
Wire.beginTransmission(Slave_adddress); // transmit to slave address
Wire.write(CO2_READ_and_test_command); // transmit to register address
Wire.endTransmission(); // stop transmitting
Wire.requestFrom(Slave_adddress, 3); //from slave request 2byte
while ( Wire.available()) {
int CO2_high_value = Wire.read();
int CO2_low_value = Wire.read();
/* CO2_Self_test value = 85(DEC) : Sensor is nominal ,
CO2_Self_test value = 170(DEC): Sensor error */
int CO2_self_test = Wire.read();
CO2_high_value = CO2_high_value <<8;
CO2_value = CO2_high_value + CO2_low_value;
Serial.print("CO2_value : ");
Serial.print(CO2_value); //reading CO2 value
Serial.println(" PPM ");
}
delay(1000);
}UART
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //Uno Rx Tx (12 13) = SoftwareSerial
const char* Polling_mode = "K 2\r\n";
const char* Stream_mode = "K 1\r\n";
const char* Standby_mode = "K 0\r\n";
bool tx_ready;
bool rx_ready;
String str;
void setup() {
Serial.begin(9600); //시리얼 통신 초기화
mySerial.begin(9600);
while(!mySerial){} //시리얼 통신 포트가 연결되기 전까지 대기
delay(14); // power on data ready
mySerial.print(Stream_mode); //Polling 모드로 변경
mySerial.print("Z\r\n"); //CO2값 읽기 명령
}
void loop()
{
if(rx_ready == 0) // overflow 처리
{
delay(31); // Measurement data ready
if(mySerial.available()>0) //수신받은 데이터가 0 초과, 즉 데이터가 존재한다면
{ //버퍼에서 읽어드린 char의 데이터를 String 형태로 반환
str = "";
str = mySerial.readStringUntil('\n');
Serial.println(str);
rx_ready = 1;
tx_ready = 1;
}
}
else if(tx_ready == 1)
{
mySerial.print("Z\r\n"); //CO2값 읽기 명령
tx_ready = 0;
rx_ready = 0;
}
}I2C
UART
9.Digital filter
필터(Filtered)된 값과 필터 되지 않은(Unfiltered) CO2 값의 차이는 아래 그림과 같음

필터된(Filtered) CO2 값은 노이즈를 제거하여 더 정확한 값을 제공함
Digital filter 설정
필터 설정 범위: 1~255( 1= Unfiltered)
필터의 설정 값이 증가하면 측정 출력 응답 시간이 늘어남

A=필터 설정 값
A = 32 가 A = 16(default) 보다 T90에 도달하는 시간이 늘어남
Digital filter Command
A ###
CO2 필터 값 설정
A 16
A 00016
a
CO2 필터 값 확인
a
a 00016
예제코드
CO2 필터 값 확인
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //Uno Rx Tx (12 13) = SoftwareSerial
const char* Polling_mode = "K 2\r\n";
const char* Stream_mode = "K 1\r\n";
const char* Standby_mode = "K 0\r\n";
bool tx_ready;
bool rx_ready;
String str;
void setup() {
Serial.begin(9600); //시리얼 통신 초기화
mySerial.begin(9600);
while(!mySerial){} //시리얼 통신 포트가 연결되기 전까지 대기
delay(14); // power on data ready
mySerial.print(Stream_mode); //Polling 모드로 변경
}
void loop()
{
if(rx_ready == 0) // overflow 처리
{
delay(31); // Measurement data ready
if(mySerial.available()>0) //수신받은 데이터가 0 초과, 즉 데이터가 존재한다면
{ //버퍼에서 읽어드린 char의 데이터를 String 형태로 반환
str = "";
str = mySerial.readStringUntil('\n');
Serial.println(str);
rx_ready = 1;
tx_ready = 1;
}
}
else if(tx_ready == 1)
{
mySerial.print("a\r\n"); //현재 설정된 필터 값 읽기 명령어
tx_ready = 0;
rx_ready = 0;
}
}시리얼 모니터

CO2 필터 값 설정
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13); //Uno Rx Tx (12 13) = SoftwareSerial
const char* Polling_mode = "K 2\r\n";
const char* Stream_mode = "K 1\r\n";
const char* Standby_mode = "K 0\r\n";
bool tx_ready;
bool rx_ready;
String str;
void setup() {
Serial.begin(9600); //시리얼 통신 초기화
mySerial.begin(9600);
while(!mySerial){} //시리얼 통신 포트가 연결되기 전까지 대기
delay(14); // power on data ready
mySerial.print(Stream_mode); //Polling 모드로 변경
}
void loop()
{
if(rx_ready == 0) // overflow 처리
{
delay(31); // Measurement data ready
if(mySerial.available()>0) //수신받은 데이터가 0 초과, 즉 데이터가 존재한다면
{ //버퍼에서 읽어드린 char의 데이터를 String 형태로 반환
str = "";
str = mySerial.readStringUntil('\n');
Serial.println(str);
rx_ready = 1;
tx_ready = 1;
}
}
else if(tx_ready == 1)
{
mySerial.print("A 32\r\n"); //필터 값 변경 명령어
tx_ready = 0;
rx_ready = 0;
}
}시리얼 모니터

Last updated