视频:
温湿度采集(DHT11)+雨滴检测——LCD显示(TFT液晶)
温湿度传感器:
3.3V 供电
DATA ——> PB12
雨滴传感器:
3.3V 供电
DATA ——> PA0
/* dht11.c */
#include "stm32f10x.h"
#include "dht11.h"
#include "delay.h"
uint8_t dat[5]={0x00,0x00,0x00,0x00,0x00}; //存储读取的温湿度信息
uint32_t sum=0; //存放校验时的求和
/****************************************
设置PB12端口为输出
*****************************************/
void STM_Out_DHT11_In(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/****************************************
设置PB12端口为输入
*****************************************/
void STM_In_DHT11_Out(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/****************************************
函数名称:void DHT_Read_Byte()
函数功能:对DHT的数据中的一个字节读取函数
输入参数:无
返回值:无
*****************************************/
uint8_t DHT_Read_Byte(void){
uint8_t temp; //存放读取到的位数据
uint8_t ReadDat = 0;
uint8_t i;
uint8_t retry = 0; //防止死机
for(i=0; i<8; i++){
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==0 && retry<100){ //等待DHT11输出高电平
delay_us(1);
retry++;
}
retry = 0; //防止死机,清零
delay_us(40); //延时30us,由于‘0’代码高电平时间26~28us,'1'代码高电平时间70us,延时30us可判断出是1,还是0
temp = 0; //先将寄存器清零
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 1) //延时30us之后如果还是高电平,证明为1代码
temp = 1; //将1存储
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1 && retry<100){ //等待信号被拉低,跳出
delay_us(1);
retry++;
}
retry = 0;
ReadDat <<= 1; //数据左移1位,存放新得到的数据
ReadDat |= temp; //新得到的数据放到最后1位
}
return ReadDat;
}
/*********************************************
函数名称:unsigned char DHT_Read()
函数功能:读取DHT11的温湿度
输入参数:无
返回值: flag--数据读取、校验成功标志
GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)
GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
*********************************************/
uint8_t DHT_Read(void){
uint8_t i;
uint8_t retry = 0;
STM_Out_DHT11_In(); //端口方向设置为输出
GPIO_ResetBits(GPIOB, GPIO_Pin_12); //输出低电平
delay_ms(18); //延时18ms,时序要求
GPIO_SetBits(GPIOB, GPIO_Pin_12); //端口数据拉高
delay_us(40); //延时40us
STM_In_DHT11_Out(); //方向设置为输入
delay_us(20); //延时20us
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0){ //如果读取到低电平,证明DHT11响应
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==0 && retry<100){ //等待变高电平
delay_us(1);
retry++;
}
retry = 0;
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1 && retry<100){ //等待变低电平
delay_us(1);
retry++;
}
retry = 0;
for(i=0; i<5; i++){ //循环5次将40位读出
dat[i] = DHT_Read_Byte(); //读出1个字节
}
delay_us(50); //最后延时等待50us
}
sum = dat[0]+dat[1]+dat[2]+dat[3]; //前4个字节数据的和
if(dat[4] == (u8)(sum)) //前4个数据和的末8位要和第5个数据相等,才算读取正确
return 1; //校验正确,返回1
else
return 0; //校验错误,返回0
}
/* water.c */
/*
1 有水
0 没水
*/
#include "water.h"
void WATER_Check_Init(void){ //设为输入
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
完整工程:温湿度+雨滴检测——TFT液晶显示.zip
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "dht11.h"
#include "water.h"
extern uint8_t dat[5];
int main(void){
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init();
POINT_COLOR = RED; //画笔颜色,可更改颜色
while(1){
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0){ // 0:没水 1:有水
LCD_ShowString(30, 100, 200, 20, 16, "water security"); //没水,安全
}
else{
LCD_ShowString(30, 100, 200, 20, 16, "water warning"); //有水,警告
}
if( DHT_Read() ){ //有温度数据
LCD_ShowString(30,60,200,10,16,"shidu:");
LCD_ShowxNum(90,60,dat[0],2,16,0x80);
LCD_ShowString(30,80,200,10,16,"wendu:");
LCD_ShowxNum(90,80,dat[2],2,16,0x80);
}
}
}
温湿度+雨滴检测——TFT液晶显示.zip