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. IDEA试用期结束以后继续试用(全部失效就更新),IDEA 2018 LICENSE SERVER

    IDEA是一款收费的IDE,但是新用户可以免费试用一段时间,试用期结束可以购买,也可以通过填写License server address来继续使用. 打开IDEA以后,通过Help ----- Re ...

  2. 接口测试“八重天”---HttpClient

    HTTP协议在互联网无处不在,在前面的章节中记录了‘接口本质即协议’,因此,接口测试首先了解的便是协议,其发送数据包和接收数据包的过程,其次便是如何在测试中去发送去解析,不论是通过代码还是工具也好,抽 ...

  3. RMAN非归档

    改变归档模式到非归档模式: 1)SQL>SHUTDOWN IMMEDIATE; 2)SQL>STARTUP MOUNT; 3)SQL>ALTER DATABASE NOARCHIVE ...

  4. javascript中数组的强大用法·

    1 归并 var a = [{name: 'tom'},{name: 'aiscy'},{name: 'judy'},{name: 'mike'}];a.reduce(function(prev, i ...

  5. springboot 邮件服务

    springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了.准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5. ...

  6. 分布式锁实践(二)-ZooKeeper实现总结

    写在最前面 前几周写了篇 利用Redis实现分布式锁 ,今天简单总结下ZooKeeper实现分布式锁的过程.其实生产上我只用过Redis或者数据库的方式,之前还真没了解过ZooKeeper怎么实现分布 ...

  7. [think\exception\ErrorException] glob() has been disabled for security reasons

    今天同事开发 出现了这个错误 [think\exception\ErrorException] glob() has been disabled for security reasons 打开php. ...

  8. 535. Encode and Decode TinyURL

    ▶ 要求给出一种对 URL 网址进行压缩和解压的算法,例如 https://leetcode.com/problems/design-tinyurl ←→ http://tinyurl.com/4e9 ...

  9. echart改变legend样式及分页

    legend: { type: 'scroll', orient: 'horizontal', bottom:0, left:'center', itemGap: 0, itemWidth: 10, ...

  10. Rhythmk 学习 Hibernate 04 - Hibernate 辅助工具 之 JBoos Tool

    1.安装JBoos Tool Help -> Install new Software 然后添加: http://download.jboss.org/jbosstools/updates/de ...