STM32F1驱动AM2302温湿度传感器
先来个AM2302的自我介绍:
AM2302数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个AM2302传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。
重要的来了啊:AM2302时序图
单总线通信特殊说明:
1.典型应用电路中建议连接线长度短于30米时用5.1K上拉电阻,大于30米时根据实际情况降低上拉电阻的阻值。
2.使用3.3V电压供电时连接线长度不得大于30cm。否则线路压降会导致传感器供电不足,造成测量偏差。
3.读取传感器最小间隔时间为2S;读取间隔时间小于2S,可能导致温湿度不准或通信不成功等情况。
4.每次读出的温湿度数值是上一次测量的结果,欲获取实时数据,需连续读取两次, 建议连续多次读取传感器,且每次读取传感器间隔大于2秒即可获得准确的数据。
看到这里相信对AM2302有了一定了解了。下面开始贴出程序,共同驱动AM2302吧。
先来主函数把
/************************************************************************************ 文件名 :main.c* 描述 : * 实验平台:神舟III号* 库版本 :ST3.5* 作者 :xiayufeng xiayufeng90520@163.com * 博客 :http://hi.baidu.com/xiayufeng520
**********************************************************************************/
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "usart1.h"
#include "am2302.h"AM2302_Data_TypeDef AM2302_Data;/*
************************************************************************
函 数 名: int main(void)功 能: 主函数入口参数: None返 回 值: None其他说明: None调用形式: None
************************************************************************
*/
int main(void)
{unsigned int RH_Value,TEMP_Value;unsigned char RH_H,RH_L,TP_H,TP_L;Led_Init(); //LED初始化Delay_Init();//Delay初始化USART1_Init();//串口初始化AM2302_GPIO_Config();//AM2302管脚初始化 while(1){/*调用Read_AM2302读取温湿度,若成功则输出该信息*/if( Read_AM2302(&AM2302_Data)==SUCCESS){ //计算出实际湿度值的10倍RH_Value= AM2302_Data.humi_int*256 + AM2302_Data.humi_deci;RH_H = RH_Value/10;RH_L = RH_Value%10;//计算出时间温度值的10倍TEMP_Value = AM2302_Data.temp_int*256 + AM2302_Data.temp_deci;TP_H = TEMP_Value/10;TP_L = TEMP_Value%10;printf("\r\n读取AM2302成功!\r\n\r\n湿度为%d.%d %RH \,温度为 %d.%d℃ \r\n",RH_H,RH_L,TP_H,TP_L);//“\”表示转向一下行}elseprintf("Read AM2302 ERROR!\r\n");Led_Turn(LED2,LED_ON);Delay_ms(1100);Led_Turn(LED2,LED_OFF);Delay_ms(1100);}
}
再来AM2302的头文件部分:
#ifndef __AM2302_H
#define __AM2302_H#include "stm32f10x.h"
#include "delay.h"#define RCC_GPIO_AM2302 RCC_APB2Periph_GPIOF
#define GPIO_AM2302 GPIOF
#define PIN_AM2302 GPIO_Pin_6
#define HIGH 1
#define LOW 0typedef struct
{uint8_t humi_int; //湿度的整数部分uint8_t humi_deci; //湿度的小数部分uint8_t temp_int; //温度的整数部分uint8_t temp_deci; //温度的小数部分uint8_t check_sum; //校验和}AM2302_Data_TypeDef;//带参宏,可以像内联函数一样使用,输出高电平或低电平
#define AM2302_DATA_OUT(a) if (a) \GPIO_SetBits(GPIO_AM2302,PIN_AM2302);\else \GPIO_ResetBits(GPIO_AM2302,PIN_AM2302)//读取引脚的电平
#define AM2302_DATA_IN() GPIO_ReadInputDataBit(GPIO_AM2302,PIN_AM2302)void AM2302_GPIO_Config(void);
static void AM2302_Mode_IPU(void);
static void AM2302_Mode_Out_PP(void);
uint8_t Read_AM2302(AM2302_Data_TypeDef *AM2302_Data);
static uint8_t Read_Byte(void);#endif /* __AM2302_H */
最后来AM2302的实现函数部分:
#include "am2302.h"/** 函数名:AM2302_GPIO_Config* 描述 :配置AM2302用到的I/O口* 输入 :无* 输出 :无*/
void AM2302_GPIO_Config(void)
{ /*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启GPIOF的外设时钟*/RCC_APB2PeriphClockCmd( RCC_GPIO_AM2302, ENABLE); /*选择要控制的GPIOF引脚*/ GPIO_InitStructure.GPIO_Pin = PIN_AM2302; /*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIO_AM2302*/GPIO_Init(GPIO_AM2302, &GPIO_InitStructure); /* 拉高PIN_AM2302 */GPIO_SetBits(GPIO_AM2302, PIN_AM2302);
}/** 函数名:AM2302_Mode_IPU* 描述 :使AM2302-DATA引脚变为输入模式* 输入 :无* 输出 :无*/
static void AM2302_Mode_IPU(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*选择要控制的GPIOD引脚*/ GPIO_InitStructure.GPIO_Pin = PIN_AM2302;/*设置引脚模式为浮空输入模式*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; /*调用库函数,初始化GPIOD*/GPIO_Init(GPIO_AM2302, &GPIO_InitStructure);
}/** 函数名:AM2302_Mode_Out_PP* 描述 :使AM2302-DATA引脚变为输出模式* 输入 :无* 输出 :无*/
static void AM2302_Mode_Out_PP(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*选择要控制的GPIOD引脚*/ GPIO_InitStructure.GPIO_Pin = PIN_AM2302; /*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/*调用库函数,初始化GPIOD*/GPIO_Init(GPIO_AM2302, &GPIO_InitStructure);
}static uint8_t Read_Byte(void)
{ uint8_t i, temp=0;for(i=0;i<8;i++) {/*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/ while(AM2302_DATA_IN()==Bit_RESET);/*AM2302 以22~30us的高电平表示“0”,以68~75us高电平表示“1”,通过检测60us后的电平即可区别这两个状态*/Delay_us(5); //延时50us if(AM2302_DATA_IN()==Bit_SET)//60us后仍为高电平表示数据“1”{/*轮询直到从机发出的剩余的 30us 高电平结束*/while(AM2302_DATA_IN()==Bit_SET);temp|=(uint8_t)(0x01<<(7-i)); //把第7-i位置1 }else //60us后为低电平表示数据“0”{ temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0}}return temp;
}uint8_t Read_AM2302(AM2302_Data_TypeDef *AM2302_Data)
{ /*输出模式*/AM2302_Mode_Out_PP();/*主机拉低*/AM2302_DATA_OUT(LOW);/*延时2ms*/Delay_ms(2);/*总线拉高 主机延时30us*/AM2302_DATA_OUT(HIGH); Delay_us(3); //延时30us/*主机设为输入 判断从机响应信号*/AM2302_Mode_IPU();/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/ if(AM2302_DATA_IN()==Bit_RESET) //T ! {/*轮询直到从机发出 的80us 低电平 响应信号结束*/ while(AM2302_DATA_IN()==Bit_RESET);/*轮询直到从机发出的 80us 高电平 标置信号结束*/while(AM2302_DATA_IN()==Bit_SET);/*开始接收数据*/ AM2302_Data->humi_int= Read_Byte();AM2302_Data->humi_deci= Read_Byte();AM2302_Data->temp_int= Read_Byte();AM2302_Data->temp_deci= Read_Byte();AM2302_Data->check_sum= Read_Byte();/*读取结束,引脚改为输出模式*/AM2302_Mode_Out_PP();/*主机拉高*/AM2302_DATA_OUT(HIGH);/*检查读取的数据是否正确*/if(AM2302_Data->check_sum == AM2302_Data->humi_int + AM2302_Data->humi_deci + AM2302_Data->temp_int+ AM2302_Data->temp_deci)return SUCCESS;elsereturn ERROR;}else{ return ERROR;}}/*************************************END OF FILE******************************/
好了,到此AM2302驱动算完全结束了。
驱动AM2302的过程磕磕绊绊的,分享出来希望和我一样走在STM32路上的人能少走些弯路。
给一个新鲜器件时,一定要先仔细研究它的手册,深刻的探究器件的要求,这样才能在实现器件功能上少遭受一些挫折,也算这次驱动AM2302温湿度传感器的一些心得吧。
STM32F1驱动AM2302温湿度传感器相关推荐
- SRM32fx103驱动AM2302温湿度传感器
我的自己做的硬件时直接用STM32f103的最小板外界AM2302实现的温湿度采集,证实不用上拉电阻也可以实现温湿度采集功能. 但不知道为什么效验位≠湿度高8位+湿度低8位+温度高8位+温度低8位. ...
- NORDIC52832 TWI(I2C) 特点 (2)驱动CHT8305C 温湿度传感器
1. nRF52832 TWI特点 本章描述的是 TWIM (带 EasyDMA 的 TWI 主机) ),本章中的 TWI 均指的是 TWIM 即 TWI 主机. nRF 52832 片内集成的 TW ...
- STM32驱动 HTU21D温湿度传感器
STM32驱动 HTU21D温湿度传感器 温湿度传感器模块HTU21D产品简介 基于法国Humirel公司高性能的湿度感应元件制成,新一代HTU21D温度和湿度传感器在尺寸与智能方面建立了新的标准:它 ...
- 51单片机驱动AHT10温湿度传感器
51单片机驱动AHT10温湿度传感器 AHT10温湿度传感器 AHT10参数 工作原理 数据转换 驱动 接线 驱动代码 实验结果 AHT10温湿度传感器 AHT10是新一代温湿度传感器,传感器输出经过 ...
- ⑦ ESP8266 开发学习笔记_By_GYC 【ESP8266 驱动 DHT11 温湿度传感器】
目录 一.准备材料 二.硬件连接 三.软件编程 1.修改工程名 2.添加组件 3.编程 4.反馈结果 5.核心代码 四.总结 ⑦ ESP8266 开发学习笔记_By_GYC [ESP8266 驱动 D ...
- STM32F103使用硬件IIC驱动SHT30温湿度传感器
文章目录 前言 一.SHT30温湿度传感器原理图 二.代码部分 1.SHT30.c文件 2.SHT30.h文件 总结 前言 SHT30是一种常见的温湿度传感器,该传感器广泛应用于各种场景,小米的温湿度 ...
- [单片机芯片]CH32V307驱动单总线温湿度传感器DHT22
手头有一个DHT22温湿度传感器和CH32V307开发板,可玩性极强.DHT22是已校准的数字温湿度传感器,用于检测环境温湿度,采用DHT22(AM2302),标准单总线接口.拥有比常见的DHT11更 ...
- 【STM32】【STM32CubeMX】STM32CubeMX的使用之四:IIC总线协议驱动SHT30温湿度传感器
文章目录 0.前言 1.传感器介绍 1.1.传感器简介 1.2.传感器板原理图 1.3.传感器引脚定义 1.4.数据采集工作流程 1.4.1.单次数据采集模式 1.4.2.周期型数据采集模式 1.5. ...
- STM32模拟IIC驱动sht30温湿度传感器
最近有在使用sht30这个传感器,相比于新手常用的dht11传感器,sht30更精确,自己花了半小时调好了 所以拿出来分享给大家. sht30外观 驱动不是自己写的, 是采用CSDN上的一位朋友的 , ...
最新文章
- “我只需一个周末就可以构建出这个应用!”
- 业余无线电通信_登山与业余无线电的完美结合,便携式电台参加VHF比赛心得体会...
- 世界AI大会三马纵论:马云乐观、马斯克悲观,马化腾认为技术孤立主义有大危害...
- Mac OS X下使用C++ JSON库
- 来个邪恶假说,假如有人把支付宝所有存储服务器炸了,我们在里边的钱是不是都丢了?
- SpringCloud个人笔记-01-Eureka初体验
- 面向对象 封装 集成 特性
- python的os模块使用_Python学习笔记之os模块使用总结
- 分享无限:偷拍IBM power 720内部外部图片
- python redis模块常用_Python基础-redis模块使用
- AspNetPager使用方法
- 大学计算机基础上机实践报告,大学计算机基础上机实践报告书册.doc
- 【操作系统笔记】中断和异常
- Shell 获取进程号
- 零基础学习C++系列课程(二) 持续更新中
- 《触动人心—设计优秀的iPhone应用》读书笔记(二)
- EXCEL 打印设置公共表头
- 【精华帖】使用PS将图片背景变透明
- 为什么WIFI信号较差的时候,网速会比较慢
- dataframe交换某两行(多行)的数据
热门文章
- ML机器学习基于树的家族
- codevs4438 YJQ Runs Upstairs
- matlab图片差异度的比较,Matlab进行图像相似度比较,使用欧式距离
- 微信上线新表情且微信可以直接向QQ转账啦!
- MATLAB算法实战应用案例精讲-【数模应用】朴素贝叶斯(NB)(附Java、R语言、Python和MATLAB代码)
- 如何用76行代码写一个AI微信机器人......
- 机器学习(一) 拟合
- 贝塞尔曲线(Bezier)之水波纹的手机充电动画效果(一)
- BNO055数据读取之二:USART
- 企业直播营销的商业价值是什么?