资讯专栏INFORMATION COLUMN

温湿度传感器

mushang / 2442人阅读

摘要:由于温湿度传感器对时间要求比较高,所以延时函数,我这边采用的是大佬正点原子编写的。根据时序图可知应答信号为低电平,高电平。后续会逐步分块更新,并会在最后一篇文章上传源代码。若是该文章对你有作用或是觉得文章写得还行,帮忙点点赞,三连

温湿度传感器

硬件使用

  • STM32F103 RCT6
  • DHT11 (温湿度传感器)

软件使用

  • keil5 MDK环境
  • 串口调试助手

实现说明

​ 根据 DHT11 温湿度传感器手册

1. 初始化 DHT11

 复位 DHT11 ,根据时序图写出设置 ``` void dht_Rst(void) { 	dht_output();             //设置 dht11 为普通推挽输出 	dht_low_input();		  //设置 dht11 为低电平 	delay_ms(20);			  //延时20ms  时间根据时序图应该定义为18ms到30ms之间 	dht_high_input();		  //设置 dht11 为高电平 	delay_us(30);			  //延时30us,少量延时,不易出错	 } ``` **==注意:==** 部分代码为博主自己编写的函数,都很==简单!== 例如设置引脚模式,设置引脚高低电平等。由于温湿度传感器 DHT11 对时间要求比较高,**所以延时函数,我这边采用的是==大佬正点原子编写的==** 。

根据时序图可知

应答信号为:低电平 83 us,高电平 87 us。

所以代码编写为:

 ``` u8 dht_Check(void) { 	u8 k = 0;							//设置 参数 k,防止程序卡死 	dht_input();						//定义 dht11 为输入 	while(dht_read_input && k < 100)  	//判断是否有低电平输入(dht11回应信号),或是 超出 83 us 	{ 		k++;							//延时等待 		delay_us(1); 	} 	if(k >= 100 )return 1;				//超时退出 	else k = 0; 	while(!dht_read_input && k<100 )		//同理,87us 高电平退出while循环 	{ 		k++; 		delay_us(100);					//延时等待 	} 	if(k>=100)return 1;					//超时退出 	return 0;							//成功监测应答信号,返回0 } ```

所以 DHT11 初始化代码为:

 u8 dht_Init(void) { 	dht_output();				 	dht_Rst(); 	return dht_Check(); }

2. DHT11 读取数据信息

由 DHT11手册 可以得到,DHT11 会输出40位数据

每位数据 格式如下图所示:

所以每位数据获取代码为:

 u8 dht_ReadBit(void) { 	u8 k = 0;							//定义 参数k ,防止超时 	while(dht_read_input && k<100)		//一检测出低电平跳出循环 或 超时跳出 	{ 		k++; 		delay_us(1);					//延时等待 	} 	k = 0; 	while(!dht_read_input && k<100)		//一检测出高电平跳出循环 或 超时跳出 	{ 		k++;	 		delay_us(1);					//延时等待 	} 	delay_us(40);						//这时候为刚检测出高电平,由于数据格式 数据为 和数据位 只在高电平的时间不同,所以延时 40us ,如果还为高电平,则为 数据位 1 	if(dht_read_input) return 1; 	else return 0; }

由于手册下关于数据位描述为下图:

可知:应该把代码分为8位一组,并且先测出的为 高位
代码为:

u8 dht_ReadByte(void){	u8 i,dat;	dat = 0;					for(i=0;i<8;i++)				{		dat<<=1;					//数据左移 不够补0		dat|=dht_ReadBit();			// | 字符	与0相或,结果为 后面的那个,即只取决于dht_ReadBit() 得到的数据	}	return dat;						//返回数据}

3. DHT11 具体读取数据代码

u8 dht_ReadData(u8 *t,u8 *h){	u8 temp[5];								//存放40位数据,每8位一组,总共5组	u8 i;	dht_Rst();								//复位 DHT11,防止传感器处在其他状态	if(dht_Check() == 0)					//判断是否应答成功	{		for(i=0;i<5;i++)		{			temp[i] = dht_ReadByte();		//取出数值		}		if(temp[0]+temp[1]+temp[2]+temp[3] == temp[4])		//判断检验和		{			*h = temp[0];									//传出参数,只传整数值,0和2为整数值,1和3位小数值			*t = temp[2];		}	}else return 1;	return 0;}

4.通过串口发送到串口调试助手

​  (1)初始化串口

GPIO_InitTypeDef GPIO_InitStrue;	USART_InitTypeDef USART_InitStrue;	NVIC_InitTypeDef NVIC_InitStrue;		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能 USART1		GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出								//USART1_Tx  USB Rx  STM32中为 Tx,需要接到 USB转TTL串口中的 Rx	GPIO_InitStrue.GPIO_Pin = GPIO_Pin_9;	GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz;		GPIO_Init(GPIOA,&GPIO_InitStrue);		//USART1_Rx  USB Tx	GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入						GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10;	GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz;		GPIO_Init(GPIOA,&GPIO_InitStrue);		USART_InitStrue.USART_BaudRate = 115200;	USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	USART_InitStrue.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;			USART_InitStrue.USART_Parity = USART_Parity_No; 	USART_InitStrue.USART_StopBits = USART_StopBits_1; 	USART_InitStrue.USART_WordLength = USART_WordLength_8b;		USART_Init(USART1,&USART_InitStrue);		USART_Cmd(USART1,ENABLE);															USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); 		NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn;//设置中断	NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;	   	NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1	NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1;			//子优先级1		NVIC_Init(&NVIC_InitStrue);

 (2)中断发送数据

void USART1_IRQHandler(void)                {			  u8 s;	  while(*s!="/0")	{ 		while(USART_GetFlagStatus(USART1,USART_FLAG_TC )==RESET);			USART_SendData(USART1,*s);		s++;	}} 

最后

 第一次尝试编写博客,若是有什么建议,欢迎批评指出。

后续会逐步分块更新,并会在最后一篇文章上传源代码。

 若是该文章对你有作用或是觉得文章写得还行,帮忙点点赞,三连!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121370.html

相关文章

  • 4G DTU+MODBUS温湿传感+MQTT连接电信云

    摘要:温湿度传感器的对应转的将温湿度传感器接入中,根据下图提示,完成和温湿度传感器的连接。 4G DTU+MODBUS温湿度传感器+MQTT连接电信云 一、材料准备 二、...

    jsyzchen 评论0 收藏0
  • [ Ruff 开发套件 ] Lesson 4 - LCD 温湿

    摘要:向项目中添加名为的温湿度传感器模块,选择,驱动版本选择最新版。使用温湿度传感器模块的函数获取当前湿度温湿度模块的函数用法如下设置光标到第二行第二个字符处打印和当前湿度使用函数每秒钟重新检测和显示当前湿度。 showImg(https://segmentfault.com/img/bVC3uE?w=2552&h=1418); 谁将登场 LCD 模块 温湿度传感器 你将学会 ...

    since1986 评论0 收藏0
  • 02_基于西门子CM1241的ModbusRTU串口通讯实现

    摘要:但是我对此协议并不熟悉,本文便以测试为目的基于西门子模块主站,采用通讯协议与温湿度传感器从站通讯获取数据。 文章目录 前言 一、前期准备 二、编写通讯程序 1.通讯测试工具和软件 2.编写TIA Portal程序 三、基于OPC UA的通讯传输 总结 前言 最近作者在...

    不知名网友 评论0 收藏0
  • (超简单)ESP8266深度睡眠模式下远程采集温湿信息

    摘要:超简单深度睡眠模式下远程采集温湿度信息项目背景相关技术深度睡眠模式温湿度采集数据收发前后端实现后端前端项目背景自己用收纳箱做了一个用于存放打印耗材的干燥箱,想用闲置的开发板和温湿度传感器做一个远程温湿度监测的小项目。 ...

    pkhope 评论0 收藏0
  • 基于STM32的OLED屏显示AHT20采集的温湿数据

    摘要:三小结本次实验在实现了温湿度数据采集并通过串口显示和利用屏数据显示代码的基础上,完成屏显示采集的温湿度数据也并不复杂,其中,温湿度数据采集的过程使用的是模拟,屏的数据显示采用的是。 ...

    vincent_xyb 评论0 收藏0

发表评论

0条评论

mushang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<