簡介
SCD41 是Sensirion製造的一款環境感測器,內部含有二氧化碳溫度以及濕度感測,可供電範圍是DC 2.4V~5.5V,也可以設定大氣壓而做參數調整,適合各類型的領域應用。
介面使用是I2C方式與感測器溝通,可以使用微控制器或是有I2C host 能力的裝置就可以對二氧化碳感測器做讀取/設定的動作。
目前這款SCD41是比較符合真實我們人體對於二氧化碳的真實濃度,某些廠牌所主打的大氣二氧化碳的數據確實是讓人困惑。
他們家使用PASens技術在於此SCD41感測器身上,原理是使用光和聲音的感測。
目前市面上比較微型可用於環境偵測的感測器目前是剩下他們家了,大部分都看到偏向機台。這市場其實真的就他們在做,產品我看了也是很有競爭力,可以做到如此小真的不簡單,而且又很容易讀取設定,但價格就不是很親民,那時候上Digikey購買,一顆就需要1600台幣以上,若要拿來做專題實驗,價錢就是會很考慮的一點,不過通常這種產品會用在自動化控制設備上,會用來做生產監控之類的應用使用,當時在跟這間公司的台灣業務聯絡時,他們都問會:「你們有幾百K的需求量?」,顯然不是會服務小眾maker,為了測試只能上Digikey買開發版自己回來研究。
主要這產品真的很好,寫篇文章交流交流,有任何問題可以一起討論
使用I2C介面讀取感測器數值,介面可參考NXP I2C SPEC
規格https://www.nxp.com/docs/en/user-guide/UM10204.pdf
詳細關於PASens技術在此https://www.sensirion.com/en/about-us/company/pasensr-technology/
性能
SCD41內部含有二氧化碳、溫度、濕度,介紹範圍與限制。
CO2
範圍 |
400ppm~5000ppm |
每年飄移 |
5ppm +-0.5% |
濕度
範圍 |
0%RH~100%RH |
每年飄移 |
<0.25%RH |
溫度
範圍 |
-10~60度 |
溫度誤差 |
15~35度 +-0.8度 -10~60度 +-1.5度 |
每年飄移 |
<0.003度/每年 |
電器特性
溫度濕度範圍
電路
IC內部電路:
裡面感測CO2的原理我大概看了的理解如下,若有錯誤可以互相交流。
https://www.sensirion.com/en/about-us/company/pasensr-technology/
IC 腳位說明
1.封裝是LGA。
2.電源要注意低noise,ripple要小於30mvp-p。
3.interface使用I2C(I2C "standard-mode),需要接pull high 電阻,建議為10K。
4.這邊要注意I2C clock僅支援100Khz。
5.上電後、Reset需要等待1000ms再讀取資料。
如果是maker最好是購買開發版,可以來這邊訂購,或者可以留言跟我聯絡購買
如果是購買開發版,只需要接四隻pin
Green cable = SDA
Red cable = VDD
Yellow cable = SCL
black cable = GND
通訊協定
I2C address 為0x62
有四種流程,
read I2C sequences
write I2C sequences
send I2Ccommand
send command and fetch result
指令
如下圖,為指令的設定表,若要設定start_periodic_measurement ,hex code是0x21b1,並且protocol為send command
指令流程
1.電源上電
2.發送start_periodic_measurement command (hex code = 0x21b1),感測器數值會五秒後開始更新
3.使用CMD取得Co2 溫度 濕度資料 read command (hex code = 0xec05)
start_periodic_measurement command指令說明
使用這個指令流程
Start |
0x62 |
W |
ACK |
0x21 |
ACK |
0xb1 |
ACK |
STOP |
讀取溫度指令說明
使用這個指令流程
Start |
0x62 |
W |
ACK |
0xEC |
ACK |
0x05 |
ACK |
RS |
0x62 |
R |
ACK |
Data MSB |
ACK |
Data LSB |
ACK |
CRC |
NACK |
STOP |
其它的指令有用到再補上來,目前要抓取二氧化碳這樣就可
CRC check
I2c封包內有CRC的地方,手冊上把算法都寫好了,我也試過ok。主要是使用CTC-8這個規格
Keil C
#define CRC8_POLYNOMIAL 0x31
#define CRC8_INIT 0xFF
uint8_t sensirion_common_generate_crc(const uint8_t* data, uint16_t count) {
uint16_t current_byte;
uint8_t crc = CRC8_INIT;
uint8_t crc_bit;
/* calculates 8-Bit checksum with given polynomial */
for (current_byte = 0; current_byte < count; ++current_byte) {
crc ^= (data[current_byte]);
for (crc_bit = 8; crc_bit > 0; --crc_bit) {
if (crc & 0x80)
crc = (crc << 1) ^ CRC8_POLYNOMIAL;
else
crc = (crc << 1);
}
}
return crc;
}