LoRa终端设备ASR6505驱动DHT11
时间:2022-07-25
本文章向大家介绍LoRa终端设备ASR6505驱动DHT11,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在本篇将使用普通GPIO来驱动DHT11,不过本篇使用STM8L的库函数。
1、DHT11
DHT11是一款比较典型的温湿度传感器,温度0-50°±2°,湿度:20-90%RH。几乎是开发板绕不开的东西,读写时序也是比较经典的。
2、接线
DHT11 开发板
VCC <-----------> +5V
GND <-----------> GND
DOUT <------------>GPIO4(PE7)
这里要注意一下:DHT11如果接3.3V,在线较长的时候,驱动能力不足,因此建议接5V)。
3、STM8L库函数
使用的是标准库函数,这也是ST最开始推广的时候用的库,于HAL库是有区别的。
4、应用
间隔5s读取DHT11的数据,计算出当前温湿度,并通过串口打印。
5、代码实现
periph_dht11.h/c部分代码:
#define DHT11_PORT (GPIOE)
#define DHT11_PIN (GPIO_Pin_7) //可通过这两句宏定义,修改引脚
#define DHT11_CLR GPIO_ResetBits(DHT11_PORT,DHT11_PIN);
#define DHT11_SET GPIO_SetBits(DHT11_PORT,DHT11_PIN);
#define DHT11_IN GPIO_Init(DHT11_PORT,DHT11_PIN, GPIO_Mode_In_PU_No_IT);
#define DHT11_OUT GPIO_Init(DHT11_PORT,DHT11_PIN, GPIO_Mode_Out_PP_High_Fast);
//us延时函数,误差不能太大
void DelayUs( uint32_t nCount)
{
volatile uint8_t i=0; //加了volatile关键字,防止编译器优化
do
{
i++;
}
while (i<(nCount*2));
}
void DHT11_Start(void)
{
DHT11_OUT; //设置端口方向
DHT11_CLR; //拉低端口
DelayMs(19); //持续最低18ms
DHT11_SET; //释放总线
DelayUs(30); //总线由上拉电阻拉高,主机延时30uS;
DHT11_IN; //设置端口方向
while(!GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN));//DHT11 等待80us低电平响应信号结束
while(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)); //DHT11 将总线拉高80us
}
uint8_t DHT11_ReadValue(void)
{
uint8_t i,sbuf=0;
for(i=8;i>0;i--)
{
sbuf<<=1;
while((!GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)));//50us的开始低电平
DelayUs(30);// 延时 30us 后检测数据线是否还是高电平
if(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN))
{
sbuf|=1;
}
else
{
sbuf|=0;
}
while(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN));
}
return sbuf;
}
uint8_t DHT11_ReadTemHum(uint8_t *buf)
{
uint8_t check;
buf[0]=DHT11_ReadValue();
buf[1]=DHT11_ReadValue();
buf[2]=DHT11_ReadValue();
buf[3]=DHT11_ReadValue();
check =DHT11_ReadValue();
if(check == buf[0]+buf[1]+buf[2]+buf[3])
return 1;
else
return 0;
}
主函数部分代码:
uint8_t DHT11Data[4]={0};
uint8_t Temp, Humi;
int main( void )
{
BoardInitMcu( );
BoardInitPeriph( );
printf("ASR6505 DHT11 test!rn");
while(1)
{
DHT11_Start();
if(DHT11_ReadTemHum(DHT11Data))
{
Temp=DHT11Data[2];
Humi=DHT11Data[0];
printf("Temp=%d, Humi=%drn",Temp,Humi);
}
else
{
printf("DHT11 Error!rn");
}
Delay(5);
}
}
6、实验现象
《从0到1搭建LoRa物联网》系列文章:
- CSS3动画,为你带来极致的视觉体验!
- 【高级编程】linux进程间通信总结
- JS 吸顶导航,告别“回到顶部”
- 用AlphaGo来做股票交易会怎样?机器学习预测股票靠谱么?
- 开发 | 深度神经网络可视化工具集锦
- CSS3三维变形,其实很简单!
- 使用 pandas处理股票数据并作分析
- 用R语言做时间序列分析(附数据集和源码)
- 【android开发】Android GUI系统学习1:Gralloc
- 【kaggle实战】从KNN,LR,SVM,RF到深度学习
- 开发 | 训练一个AI给颜值打分,公平公正!
- 【android开发】Android HAL模块实现
- 让剁手党洞察物体细节,“放大镜”当之无愧
- CSS3过渡,不再为JS动画而犯愁
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法