使用Arduino Wire Library读取温湿度传感器AM2321
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的更多相关文章
- Arduino I2C + 温湿度传感器AM2321
(2015.5.17:本日志的内容有所更新,参见<使用Arduino Wire Library读取温湿度传感器AM2321>.) AM2321是广州奥松电子生产的数字式温湿度传感器.虽是国 ...
- STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题
1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...
- Arduino从DHT11读取温湿度数据并显示在1602LCD
硬件清单 Arduino NANO1602LCD + PCF8574T模块YL-47 DHT11模块 连线 1. 连接LCD: PCF8574T模块4pin(Gnd, Vcc, SDA i2c数据, ...
- [转载] 树莓派读取温湿度传感器DHT11
原文地址: http://blog.csdn.net/liang890319/article/details/8739683 硬件: 树莓派 2.0 DHT模块 接树莓派5V GND GPIO1 功 ...
- Arduino和C51开发DHT11温湿度传感器
技术:51单片机.Arduino.DHT11.温湿度传感器.传感器 概述 学习单片机离不开对传感器的学习,本文主要介绍DHT11温湿度传感器的使用方法,同学也可以了解更多的传感器,这对你以后开发产 ...
- Arduino I2C + 温湿度传感器Si7021
Si7021是Silicon Labs生产的温湿度传感器芯片.其主要特性: 湿度精度:误差典型值+/-2%RH,最大值+/-3%RH(0~80%RH),出厂已校正 温度精度:误差典型值+/-0.3 ...
- Arduino I2C + 温湿度传感器HTS221
主要特性 HTS221是意法半导体(STMicroelectronics)生产的小体积.数字式温湿度传感器IC.该IC目前在官网仍处在“评估”状态.其主要特性: 工作电压:1.7~3.6V 数据输出频 ...
- Arduino连接SHT10温湿度传感器--返回值不正常解决办法
如题目,arduino中连接温湿度传感器,用的是一个github开源项目,地址:点击打开,其实这个就是一个封装好的库,下载后把解压的文件夹复制到Arduino目录下的librarys文件夹内,重启Ar ...
- STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载
//为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 //************************** //程序说明:stc ...
随机推荐
- [转]Android-Studio 常用配置项
更多内容可参考:http://www.cnblogs.com/smyhvae/p/4390905.html 1. 想要和 Eclipse 一样,Alt + / 出现自动提示列表:在如下位置修改 2. ...
- [maven] 实战笔记 - maven 安装配置
1.下载地址http://maven.apache.org/download.html 2.windows下安装maven(1)下载 apache-maven-3.0-bin.zip 解压到任意目录下 ...
- 关于在github上 下载源码 clone 非 master 分支的代码
https://blog.csdn.net/u012302552/article/details/80680497
- socket_简单报头
client--------------------- #!/usr/bin/python3# -*- coding: utf-8 -*-# @Time : 2018/6/6 14:53# @F ...
- css字体中英文对照表(转)
在css文件中,我们常看到有些字体名称变成了乱码,这是由于网页开发者将中文字体的名字直接写成了中文,而css文件本身没有声明字符编码方式,查看时就出现了乱码.为了避免这种乱码状况出现,可以将css文 ...
- ruby gem install rails 错误解决
最近打算看ruby. 今天用命令gem install rails的时候碰到这样的错误提示: ERROR: Error installing XXXXXXXXXXX: The ...
- WPF DataGrid实现分页显示
主要代码如下 /// <summary> /// 读取指定页面的数据 /// </summary> /// <param name="pagePerCount& ...
- 如何连接并处理 sdf 数据库文件(便捷数据库处理)
如何连接并处理 sdf 数据库文件 SqlCeConnection cc = new SqlCeConnection(); DataTable dt = new DataTable(); ...
- Oracle Tip: Choosing an efficient design for Boolean column values
Takeaway: When designing a database table structure, it's important to choose an efficient strategy ...
- 迷你MVVM框架 avalonjs 1.1发布
本版本添加了许多有用的功能,得益于用户量的增大,一些隐性BUG也暴露出来Fix掉了.强烈建议升级! 优化扫描流程: ms-skip(0) --> ms-important(1) --> m ...