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在串口助手打印

玩转传感器——DHT11温湿度传感器(STM32版)

STM32实例——基于STM32开发板实现传感数据采集-DHT11温湿度采集

基于STM32开发板实现传感数据采集-DHT11温湿度采集

STM32实例——基于STM32开发板实现传感数据采集-DHT11温湿度采集

STM32实例——基于STM32开发板实现传感数据采集-DHT11温湿度采集