DHT11 温湿度传感器

smallcracker 2021-01-31 00:00:00
Categories: Tags:

DHT11温湿度传感器

一、外观

image-20210131194115189

二、参数特性

image-20210131194217788

三、引脚说明

s端是信号端,串行数据,负号端是负极,中间是正极,正极供电电压要求在3.5-5.5V之间

四、数据格式

一次传送40位数据,高位先出。格式规定如下

8位湿度整数数据+8位湿度小数数据+8位温度整数数据+8位温度小数数据+8位校验位

其中校验位数据的定义是前四组数据和的后8位

image-20210131195059673

五、数据时序

DHT11的总体通信流程。第一步:主机先发送开始信号,从机会返回一个相应信号进行应答。 第二步:主机信号线拉高准备接收数据。 第三部:开始接收数据(一次接收40位)。

六、例程

下面是温湿度传感器的相关代码:half success

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_pwm.h"
#include "inc/hw_timer.h"
#include "driverlib/debug.h"
#include "driverlib/timer.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "driverlib/systick.h"
#include "driverlib/interrupt.h"
#include "driverlib/pwm.h"

#define delay(ms) ROM_SysCtlDelay(clock*ms/3000)

int clock;
void ConfigureUART();

bool odd=true;
int last_cap=0,cap_duration[1000];
bool date[110];
int gffg=0;
void Timer2AIntHandler(){
unsigned long ulstatus = TimerIntStatus(TIMER2_BASE, TIMER_CAPA_EVENT|TIMER_TIMA_TIMEOUT);
TimerIntClear(TIMER2_BASE, ulstatus);
odd=1-odd;
if(odd){
cap_duration[gffg++]=TimerValueGet(TIMER2_BASE, TIMER_A)-last_cap;
/*
if(cap_duration<=0) cap_duration+=255*65536;
UARTprintf("duration is ");
prt_f((float)cap_duration/40000000);
UARTprintf("s.\n");
*/
}
last_cap=TimerValueGet(TIMER2_BASE, TIMER_A);
return ;
}


void prt_f(float w){
if(w>0){
UARTprintf("%d.",(int)w);
}else{
UARTprintf("0.");
}
int tem=(int)(w*10000000)%1000000;
if(tem<1000000)UARTprintf("0");
if(tem<100000)UARTprintf("0");
if(tem<10000)UARTprintf("0");
if(tem<1000)UARTprintf("0");
if(tem<100)UARTprintf("0");
if(tem<10)UARTprintf("0");
if(tem<1)UARTprintf("0");
UARTprintf("%d",tem);
return ;
}


void ConfigureDHT11(){
gffg=0;
odd=true;
ROM_SysCtlDelay(clock*1500/3000);
//UARTprintf("start to prepare....\n");
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, 0);
ROM_SysCtlDelay(240000);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2);
GPIOPinConfigure(GPIO_PF4_T2CCP0);
GPIOPinTypeTimer(GPIO_PORTF_BASE, GPIO_PIN_4);
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
TimerPrescaleSet(TIMER2_BASE, TIMER_A, 255);
TimerConfigure(TIMER2_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP);
TimerControlEvent(TIMER2_BASE, TIMER_A, TIMER_EVENT_BOTH_EDGES);
TimerLoadSet(TIMER2_BASE, TIMER_A, 65535);
TimerIntRegister(TIMER2_BASE, TIMER_A, Timer2AIntHandler);
IntMasterEnable();
TimerIntEnable(TIMER2_BASE, TIMER_CAPA_EVENT|TIMER_TIMA_TIMEOUT);
IntEnable(INT_TIMER2A);
TimerEnable(TIMER2_BASE,TIMER_A);
int i=0;
delay(1500);
for(i=0;i<gffg;i++){
if(cap_duration[i]<=0) cap_duration[i]+=255*65536;
date[i]=(cap_duration[i]>2000)?1:0;
//UARTprintf("%d",date[i+1]==1?1:0);
//if(i%8==0)UARTprintf("\n");
/*
UARTprintf("duration is %d\n",cap_duration[i]);

prt_f((float)cap_duration[i]/40000000);
UARTprintf("s.\n");
*/
}
float hum=0,temp=0,cnt=128;
for(i=1;i<=16;i++){
if(date[i+1])hum+=cnt;
if(date[i+1+16])temp+=cnt;
cnt/=2;
}
//UARTprintf("\n");
if(hum<200){
prt_f(hum);
UARTprintf("\n");
prt_f(temp);
UARTprintf("\n finish!\n");
}

return ;
}



bool detection_queue[110];
int detection_index=0;
bool state=false;
long long duration[110];
int message_index=0;
long long tick=0;
int threshold=12;


void WTimer1AIntHandler(){
unsigned long ulstatus = TimerIntStatus(WTIMER1_BASE,TIMER_TIMA_TIMEOUT);
TimerIntClear(WTIMER1_BASE, ulstatus);
int ReadPin1 = GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4);//检测
int flag=((ReadPin1&GPIO_PIN_4) != GPIO_PIN_4);
detection_queue[detection_index]=flag;
int i=0,sum=0;
for(i=0;i<=threshold;i++)sum+=(int)detection_queue[detection_index-i];
if(tick>threshold){
if(sum==threshold&&state==false){
state=true;
duration[message_index]=tick;
}
if(sum==0&&state==true){
state=false;
duration[message_index]=tick-duration[message_index];
UARTprintf("bottom up. message index is %d\nduration:%d\n",message_index,duration[message_index]);
message_index++;
message_index%=110;
}
}
tick++;
detection_index++;
detection_index%=110;
return ;
}


void Configurebottom(){
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
SysCtlPeripheralEnable(SYSCTL_PERIPH_WTIMER1);
TimerConfigure(WTIMER1_BASE,TIMER_CFG_PERIODIC);
TimerLoadSet64(WTIMER1_BASE, clock/500);
TimerIntRegister(WTIMER1_BASE, TIMER_A, WTimer1AIntHandler);
IntMasterEnable();
TimerIntEnable(WTIMER1_BASE, TIMER_TIMA_TIMEOUT);
IntEnable(INT_WTIMER1A);
TimerEnable(WTIMER1_BASE, TIMER_A);
}


void ConfigureEverything(){
FPUEnable();
FPULazyStackingEnable();
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
clock=SysCtlClockGet();
ConfigureUART();
//Configurebottom();
for(;;){
ConfigureDHT11();
}
}


int main(){
ConfigureEverything();
UARTprintf("configuration finish.\n");
for(;;);
}


void ConfigureUART(){
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 115200, 16000000);
}