미세먼지 센서
SPS30
센서 명세
변수 | 조건 | 값 | 단위 |
---|---|---|---|
농도 정확도 | 0 ~ 100 μg/m³ 100 ~ 1000 μg/m³ | ± 10 ± 10 | μg/m³ % |
농도 범위 | - | 0 ~ 1000 | μg/m³ |
농도 분해능 | - | 1 | μg/m³ |
측정 먼지 크기 | PM 0.5 | 0.3 ~ 0.5 | μm |
측정 먼지 크기 | PM 1.0 | 0.3 ~ 1.0 | μm |
측정 먼지 크기 | PM 2.5 | 0.3 ~ 2.5 | μm |
측정 먼지 크기 | PM 4 | 0.3 ~ 4.0 | μm |
측정 먼지 크기 | PM 10 | 0.3 ~ 10.0 | μm |
농도 (개수) | - | 0 ~ 3000 | 1/cm³ |
샘플링 간격 | - | 1 | 초 |
시동 시간 | - | < 8 | 초 |
수명 | 24 h/day 작동 | > 8 | 년 |
소음 | 0.2 m | 25 | dB(A) |
무게 | - | 26 | g |
10 만원 대 센서 중, 수명이 긴 편에 속합니다. 기본 설정은 1 주에 한 번 10 초간 팬을 최대 속도로 돌려 청소를 하게 되어 있습니다. 상황에 따라 청소주기를 바꿔 주는 것이 좋습니다.
8 년 이상 써본적이 없어서 모르겠으나, 센서 특성상 먼지가 계속 유입되다가 측정부를 막게되면 수명에 관계 없이 뜯어서 청소하거나 교체해주어야합니다.
커넥터가 ZHR-5고, 센서 자체도 마운트할 방법이 없어서 불편합니다.
전기적 특성
변수 | 조건 | 값 | 단위 |
---|---|---|---|
전원 | - | 4.4 ~ 5.5 | V |
대기 전류 | idle-mode | < 8 | mA |
평균 전류 | measurement-mode | 60 | mA |
최대 전류 | measurement-mode 시작 후 ~ 200 ms | 80 | mA |
Low 입력 | - | < 0.99 | V |
High 입력 | - | > 2.31 | V |
Low 출력 | - | < 0.4 | V |
High 출력 | - | > 2.9 | V |
최대 최소 범위
변수 | 값 |
---|---|
SEL pin | -0.3 ~ 4.0 V |
RX/SDA, TX/SCL | -0.3 ~ 5.5 V |
± 16 mA | |
작동 온도 | -10 ~ 60 ℃ |
작동 습도 | 0 ~ 95 %RH |
ESD CDM | ± 4 kV contact, ± 8 kV air |
인터페이스
핀 | 이름 | 값 |
---|---|---|
1 | VDD | 4.5 ~ 5.5 V |
2 | RX/SDA | 3.3, 5 V 호환 |
3 | TX/SCL | 3.3, 5 V 호환 |
4 | SEL | 플로팅- UART GND - I2C |
5 | GND |
UART
- 115200 bit/s, 8 bits, None parity, 1 stop bit
- MOSI 프레임: 0x7E, 0x00(ADR), CMD(1 byte), L(1 byte), Data(0 ~ 255 bytes), CHK(1 byte), 0x7E
- MISO 프레임: 0x7E, 0x00, CMD, State(1 byte), L, Data, CHK, 0x7E
- Escape(except start and stop)
- 0x7E <-> 0x7D 0x5E
- 0x7D <-> 0x7D 0x5D
- 0x11 <-> 0x7D 0x31
- 0x13 <-> 0x7D 0x33
- CHK: ((ADR + ... + Data) & 0xFF) ^ 0xFF
I2C
- Slave 주소: 0x69
- 최대 통신 속도: 100 kbit/s (standard mode)
- Write Reg: 2 byte Reg, LSB, MSB, CHK, LSB, MSB, CHK, ...
- Read Reg: write 2 byte Reg -> read LSB, MSB, CHK, ...
- CHK
- CRC-8
- polynormial 0x31(x⁸ + x⁵ + x⁴ + 1)
uint8_t calc_crc_8(uint8_t *data) {
uint8_t crc = 0xFF;
for(int i = 0; i < 2; i++) {
crc ^= data[i];
for(uint8_t bit = 0; bit < 8; bit++) {
if(crc & 0x80) {
crc = (crc << 1) ^ 0x31;
} else {
crc = (crc << 1);
}
}
}
return crc;
}
메모리가 넉넉하면 CRC 테이블을 만들어서 계산하면 됩니다.