2016/01/26

AOSONG AM2320 使用心得

AOSONG是一間中國製造溫濕度Sensor的廠商,有很多產品被maker 拿來做為溫度感測用,
其中像是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




image
圖片來自原廠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