其中像是DHT11, DHT22都蠻常見到arduino的使用者拿來當analog input 的範例。
在淘寶的零售價,DHT11大概5元,DHT22(AM2302)因為感測範圍比DHT11廣,所以大概要20元人民幣。至於我使用的這顆AM2320,價格介於兩者之間,大約10元左右。
DHT11 | DHT22 | AM2320 | |
濕度範圍 | 20~90% | 0~100% | 0~100% |
溫度範圍 | 0~50 | -40~125 | -40~80 |
圖片來自原廠datasheet
http://www.aosong.com/cn/products/details.asp?id=152
後來東拼西湊,湊出一段可用的code如下
比較奇怪的地方是要先送一次I2C write之後,才能再下一次I2C write去取值,今天花了好長一段時間在這邊,如果沒先做一次無資料的I2C write,那後面取到的值可能都是暫存的值或是0...因為這顆感測器會進入省電模式,當Sensor進入省電模式時,必須要連續下兩次I2C write,才能在第二次取到值。
原廠設計中是有提供checksum機制來驗證所獨到的值是否正確。但我只是為了快速測試sensor,所以就沒把這段checksum計算跟比對加進去。
#include<Wire.h> void setup() { Wire.begin(); Serial.begin(9600); } uint8_t addr = 0xb8 >> 1; uint8_t data_buffer[8]; uint8_t data_count = 0x08; uint8_t stop_bit = 0x01; float temp = 0.0; float humi = 0.0; void loop() { Wire.beginTransmission(addr); Wire.endTransmission(stop_bit); delay(1); Wire.beginTransmission(addr); Wire.write(0x03); Wire.write(0x00); Wire.write(0x04); Wire.endTransmission(stop_bit); delay(2); Wire.requestFrom(addr, data_count,stop_bit); for (int i = 0; i < 8; i++) { while(!Wire.available()); data_buffer[i] = Wire.read(); } humi = (data_buffer[2] * 256 + data_buffer[3]) / 10.0; Serial.print(humi); Serial.print(' '); temp = data_buffer[5] / 10.0; Serial.print(temp); Serial.print(' '); Serial.println(""); delay(2000); }
優點: I2C通訊取值,僅需做簡單的換算。
缺點:
1. I2C非慣用方式
2. 準確性僅供參考
3. AM2320屬於DIP件,雖然配合一般排針設計為2.54mm間距,但實際上接腳太細,和杜邦端子或是一般麵包板連接時會顯得非常的鬆垮,端子頭無法咬著接腳。若是直接焊在電路板上則無此困擾。
關於DHT11, DHT22可以參考外國Maker分享的文章
http://howtomechatronics.com/tutorials/arduino/dht11-dht22-sensors-temperature-and-humidity-tutorial-using-arduino/
No comments:
Post a Comment