STM32-DHT11温湿度传感器寄存器版本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32-DHT11温湿度传感器寄存器版本相关的知识,希望对你有一定的参考价值。
参考技术A #include <stm32f4xx.h>#include "DHT11.h"
#include "TIM6.h"
/*
函数功能:GPIO输出配置
函数参数:
返 回 值:
说 明:PC0 -DATA
*/
void DHT11_OUT1()
//时钟使能
RCC->AHB1ENR |= (1 << 2);
//设置GPIO工作模式
GPIOC->MODER &= ~(3 << 0);
GPIOC->MODER |= (1 << 0);
//设置输出模式(TW)
GPIOC->OTYPER &= ~(1 << 0);
//速度(50MHZ)
GPIOC->OSPEEDR &= ~(0x3 << 0);
GPIOC->OSPEEDR |= (0x2 << 0);
//设置上下拉(上)
GPIOC->PUPDR &= ~(0x3 << 0);
GPIOC->PUPDR |= (0x1 << 0);
TIM6_delayms(1000);
//设置初始状态(空闲状态)
GPIOC ->ODR |= (1 << 0);
/*
函数功能:GPIO输入配置
函数参数:
返 回 值:
说 明:PC0 -DATA
*/
void DHT11_IN()
RCC->AHB1ENR |= (1 << 2);
//设置GPIO工作模式
GPIOC->MODER &= ~(3 << 0);
GPIOC->PUPDR &= ~(0x3 << 0);
GPIOC->PUPDR |= (0x1 << 0);
/*
函数功能:DHT11 开始信号 & 接收应答
函数参数:
返 回 值:0:有应答 1:无应答
说 明:
*/
u8 DHT11_Start_ACK()
u8 overtime = 0;
//设置GPIO为输出模式
DHT11_OUT1();
//拉低总线
DHT11_DATA_L;
// (GPIOC->ODR &= ~(1 << 0));
//延时18ms以上
TIM6_delayms(20);
//拉高总线
DHT11_DATA_H;
// (GPIOC->ODR |= (1 << 0));
//切换为输入模式
DHT11_IN();
//等待应答
while(DHT11_DATA)
TIM6_delayus(1);
overtime ++;
if(overtime > 50)
return 1;
//等待应答结束
overtime = 0;
while(!DHT11_DATA)
TIM6_delayus(1);
overtime ++;
if(overtime > 90)
return 1;
return 0;
/*
函数功能:DHT11 接收一个字节
函数参数:
返 回 值:接收到的数据
说 明:
*/
u8 DHT11_Read_byte()
u8 data = 0;
u8 i;//循环变量
for(i=0;i<8; i++)
//等待时隙结束
while(!DHT11_DATA);
//判断当前位是0还是1
TIM6_delayus(40);
if(DHT11_DATA)
data |= (0x80 >> i);
// TIM6_delayus(30);
while(DHT11_DATA);
return data;
/*
函数功能:DHT11 读取温湿度数据
函数参数:double *temp:温度存储单元
double *humi:湿度存储单元
返 回 值:0:采集成功 1:采集失败
说 明:
*/
u8 DHT11_Read_data(double *temp,double *humi)
u8 data[5];
u8 ack;
ack = DHT11_Start_ACK();
//发送开始信号并接收应答
if(ack != 0)
return 1;//应答错误
//等待接收数据
while(DHT11_DATA);
//接收5个数据
data[0] = DHT11_Read_byte();
data[1] = DHT11_Read_byte();
data[2] = DHT11_Read_byte();
data[3] = DHT11_Read_byte();
data[4] = DHT11_Read_byte();
//校验数据
if(data[4] != ((data[0]+data[1]+data[2]+data[3]) & 0xFF))
return 1;//
//计算温湿度值
*temp = data[2] + data[3] / 10.0;
*humi = data[0] + data[1] / 10.0;
return 0;
需要声明头文件
通过串口打印出温度和湿度值
if(DHT11_Read_data(&humi_val,&temp_val) == 0)
printf("humi = %5.2f temp=%5.2f\r\n",humi_val,temp_val);
else
printf("humi temp read error\r\n");
S
温湿度传感器DHT11
如果想使用 Arduino 开发板驱动 DHT11 来获取温湿度的时候建议使用第三方的库,这样可以加快程序的开发速度,而且不容易出错,下面的代码我已经安转了第三方的库了。详细的安装方法请参考极客先锋的博客:http://www.cnblogs.com/jikexianfeng/p/6290203.html 作者安装的为最低版本(1.0.0)。这样为了更好的兼容。
1 /********************************* 2 代码功能:温湿度传感器DHT11 3 使用函数: 4 simple_dht11_read(DHT11传感器引脚,存放湿度数据地址,存放温度数据地址,存放40位01数据的地址); //获取温湿度数据函数 5 使用头文件: 6 #include <SimpleDHT.h> //需要安装库,具体安装方法见:http://www.cnblogs.com/jikexianfeng/p/6290203.html 7 创作时间:2017*1*18 8 作者邮箱:[email protected] 9 ********************************/ 10 #include <SimpleDHT.h> 11 int pinDHT11 = 2; 12 13 void setup() 14 { 15 Serial.begin(115200); 16 } 17 18 void loop() 19 { 20 Serial.println("================================="); 21 Serial.println("Sample DHT11..."); 22 byte temperatyre = 0; //温度 23 byte humidity = 0; //湿度 24 byte data[40]; 25 if (simple_dht11_read(pinDHT11, &temperatyre, &humidity, data)) { 26 Serial.print("Read DHT11 failed."); 27 return; 28 } 29 Serial.print("Humidity (%):"); 30 Serial.println(humidity); 31 Serial.print("Temperatyre(oC)"); 32 Serial.println(temperatyre); 33 Serial.print("Temperatyre(oF)"); 34 Serial.println(Fahrenheit(temperatyre)); 35 Serial.print("Temperatyre(k)"); 36 Serial.println(Kelvin(temperatyre)); 37 Serial.print("Dew point(oC):"); 38 Serial.println(dewPoint(temperatyre,humidity)); 39 //Serial.print("Dew PointFast(oC):"); 40 //Serial.println(dewPointFast(temperatyre,humidity)); 41 delay(1000); 42 } 43 44 double Fahrenheit(byte celsius) 45 { 46 return 1.8*celsius+32; 47 } 48 49 double Kelvin(byte celsius) 50 { 51 return celsius+273.15; 52 } 53 54 double dewPoint(byte celsius,byte humidity) 55 { 56 double A0 =373.15/(273.15+celsius); 57 double SUM = -7.90298*(A0-1); 58 SUM+=5.02808*log10(A0); 59 SUM+=-1.3816e-78*(pow(10,(11.344*(1-1/A0)))-1); 60 SUM+=8.1328e-3*(pow(10,(-3.49149*(A0-1)))-1); 61 SUM+=log10(1013.246); 62 double VP=pow(10,SUM-3)*humidity; 63 double T =log(VP/0.61078); 64 return (241.88*T)/(17.558-T); 65 } 66 67 double dewPointFast(byte celsius,byte humidity) 68 { 69 double a=17.271; 70 double b=273.7; 71 double temp=(a*celsius)/(b+celsius)+log(humidity/100); 72 double Td=(b*temp)/(a-temp); 73 return Td; 74 }
如果采集回来的数据没有没有浮点型数据,所以浮点段字符数据为全部为0,这是传感器的问题,不能进行时代码为题。
/////////////////////////
参考网页:http://www.cnblogs.com/jikexianfeng/p/6290203.html
参考网页:http://wenku.baidu.com/view/dcdc9efa700abb68a982fbe0.html?re=view
以上是关于STM32-DHT11温湿度传感器寄存器版本的主要内容,如果未能解决你的问题,请参考以下文章
stm32+dht11温湿度数据实验-stm32将采集dht11温湿度通过usart1在串口助手打印
STM32实例——基于STM32开发板实现传感数据采集-DHT11温湿度采集