AM2321是采用I2C总线或单总线通讯的国产温湿度传感器。在AM2321手册中,当采用I2C通讯时,手册指定了多处需要主机等待的时间间隔,包括:

(1)唤醒传感器时,从机不回复ACK,但主机主要等待800us~3ms再发送STOP信号;

(2)主机发送读/写指令后,需等待至少1.5ms再发送读取时序;

(3)读返回数据时,主机发送I2C地址后,需等待至少30us以上才能发送下一个串行时钟。

由于Arduino标准库Wire中的函数不支持指定(1)和(3)中的等待间隔,因此在之前的日志中,采用关闭I2C并采用bit-banging的方式唤醒传感器。

然而,就我手头的传感器测试发现,即使(3)的等待时间降低到10us左右(即100kHz速率正常通讯),并且将(1)改成“发送STOP信号后等待800us”,器件也是可以正常工作的。

这样的话,利用Wire库自带的函数,就可以实现对AM2321的操作。我利用手头的传感器分别在5V和3.3V供电下测试,都可以正常读写。

测试代码

 /*
Measurement of temperature and humidity using the AM2321 sensor
Attention:
Use functions in Wire library to wake up the sensor.
Although the sequence is different with the datasheet, it indeed works.
Connection:
AM2321 UNO
VDD <---------> 5V
GND <---------> GND
SCL <---------> SCL(A5)
SDA <---------> SDA(A4)
*/ #include <Wire.h> #define ADDRESS_AM2321 0x5C //not 0xB8
#define SDA_PIN A4
#define SCL_PIN A5 byte fuctionCode = ;
byte dataLength = ;
byte humiHigh = ;
byte humiLow = ;
byte tempHigh = ;
byte tempLow = ;
byte crcHigh = ;
byte crcLow = ; int humidity = ;
int temperature = ;
unsigned int crcCode = ; void setup()
{
Wire.begin();
Serial.begin();
} void loop()
{
//step 1. wake up the sensor
Wire.beginTransmission(ADDRESS_AM2321);
Wire.endTransmission(); delayMicroseconds(); //step 2. send command
Wire.beginTransmission(ADDRESS_AM2321);
Wire.write(0x03);
Wire.write(0x00);
Wire.write(0x04);
Wire.endTransmission(); delayMicroseconds(); //step 3. read data
Wire.requestFrom(ADDRESS_AM2321, );
fuctionCode = Wire.read();
dataLength = Wire.read();
humiHigh = Wire.read();
humiLow = Wire.read();
tempHigh = Wire.read();
tempLow = Wire.read();
crcLow = Wire.read();
crcHigh = Wire.read(); //get the result
humidity = (humiHigh<<) | humiLow;
temperature = (tempHigh<<) | tempLow;
crcCode = (crcHigh<<) | crcLow; Serial.print(temperature/10.0, ); Serial.println(" `C");
Serial.print(humidity/10.0, ); Serial.println(" \%RH");
CheckCRC(); delay();
} void CheckCRC() //from the datesheet
{
byte backValues[] = {fuctionCode, dataLength, humiHigh, \
humiLow, tempHigh, tempLow};
unsigned int crc = 0xFFFF;
int i;
int len = ;
int j = ;
while (len--)
{
crc ^= backValues[j];
j++;
for (i=; i<; i++)
{
if (crc & 0x01)
{
crc >>= ;
crc ^= 0xA001;
}
else
{
crc >>= ;
}
}
}
if (crc == crcCode)
{
Serial.println("CRC checked.");
}
else
{
Serial.println("CRC Error!");
}
}

器件介绍、电路连接可参见之前的日志

使用Arduino Wire Library读取温湿度传感器AM2321的更多相关文章

  1. Arduino I2C + 温湿度传感器AM2321

    (2015.5.17:本日志的内容有所更新,参见<使用Arduino Wire Library读取温湿度传感器AM2321>.) AM2321是广州奥松电子生产的数字式温湿度传感器.虽是国 ...

  2. STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题

    1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...

  3. Arduino从DHT11读取温湿度数据并显示在1602LCD

    硬件清单 Arduino NANO1602LCD + PCF8574T模块YL-47 DHT11模块 连线 1. 连接LCD: PCF8574T模块4pin(Gnd, Vcc, SDA i2c数据, ...

  4. [转载] 树莓派读取温湿度传感器DHT11

    原文地址: http://blog.csdn.net/liang890319/article/details/8739683 硬件: 树莓派 2.0 DHT模块  接树莓派5V GND GPIO1 功 ...

  5. Arduino和C51开发DHT11温湿度传感器

    技术:51单片机.Arduino.DHT11.温湿度传感器.传感器   概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...

  6. Arduino I2C + 温湿度传感器Si7021

      Si7021是Silicon Labs生产的温湿度传感器芯片.其主要特性: 湿度精度:误差典型值+/-2%RH,最大值+/-3%RH(0~80%RH),出厂已校正 温度精度:误差典型值+/-0.3 ...

  7. Arduino I2C + 温湿度传感器HTS221

    主要特性 HTS221是意法半导体(STMicroelectronics)生产的小体积.数字式温湿度传感器IC.该IC目前在官网仍处在“评估”状态.其主要特性: 工作电压:1.7~3.6V 数据输出频 ...

  8. Arduino连接SHT10温湿度传感器--返回值不正常解决办法

    如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Ar ...

  9. STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载

    //为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 ​ //************************** //程序说明:stc ...

随机推荐

  1. pythonNet day02

    网络收发缓冲区 1.协调读写速度.减少和磁盘交互 2.recv和send实际上是从缓冲区获取内容,和向缓冲区发送内容 recv()特性 1.如果连接断开,recv会立即结束阻塞返回空字符串 2.当接收 ...

  2. PHP生产二维码

    1.引入phpqrcode包 <?php include 'phpqrcode.php'; QRcode::png('http://www.learnphp.cn',"code.png ...

  3. win7/64+python3.4+pyinstall3+tkinter+smtp=图形界面群发邮件客户端

    #file:   GUI_MAIL.py#Date:   2016/01/07#Author: lao_wan import tkinterimport smtplibfrom email.mime. ...

  4. Python实践练习:疯狂填词

    题目 创建一个疯狂填词(Mad Libs)程序,它将读入文本文件,并让用户在该文本文件中出现 ADJECTIVE.NOUN.ADVERB 或 VERB 等单词的地方,加上他们自己的文本. 例如,一个文 ...

  5. C++Builder STL 泛型

    STL(Standard Template Library)标准模板库, 包括了算法,容器,迭代器.就是泛型. 向量(vector) 连续存储的元素<vector>列表(list) 由节点 ...

  6. vs读取ini文件

    读取string类型: DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTR ...

  7. SpringMVC 中xml 配置多数据源

    1,配置jdbc.properties jdbc.driver_one=... jdbc.url_one=..... jdbc.username_one=... jdbc.password_one=. ...

  8. 探究Linux进程及线程堆栈专题<一>

    “你定义了那么多全局变量,系统才给你分配了几百KB,这样做是不是太耗内存了?”,一同学问道. 老早就听说嵌入式系统各种资源有限啊,不能分配大空间啊要注意节约资源之类的(...貌似米神4的配置要完爆我的 ...

  9. AABB和平面的相交性检测

    [AABB和平面的相交性检测]

  10. Mac 下输入特殊字符

    [Mac 下输入特殊字符] 快捷键是 Control + Commans + Space