温湿度(DHT11)+雨滴检测——LCD显示(TFT液晶)
生活随笔
收集整理的這篇文章主要介紹了
温湿度(DHT11)+雨滴检测——LCD显示(TFT液晶)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
溫濕度(DHT11)+雨滴檢測——LCD顯示(TFT液晶)
- 效果展示:
- 一、硬件連接
- 二、代碼
- 1、DHT11
- 2、雨滴傳感器
- 3、LCD
- 4、main.c
- 三、完整工程
- 鏈接:
效果展示:
視頻:
溫濕度采集(DHT11)+雨滴檢測——LCD顯示(TFT液晶)
一、硬件連接
溫濕度傳感器:
3.3V 供電DATA ——> PB12雨滴傳感器:
3.3V 供電DATA ——> PA0二、代碼
1、DHT11
/* 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;//輸出50MHzGPIO_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;//輸出50MHzGPIO_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,還是0temp = 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); //延時40usSTM_In_DHT11_Out(); //方向設置為輸入delay_us(20); //延時20usif(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; //校驗正確,返回1elsereturn 0; //校驗錯誤,返回0 }2、雨滴傳感器
/* 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); }3、LCD
完整工程:溫濕度+雨滴檢測——TFT液晶顯示.zip
4、main.c
#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); //串口初始化為9600LED_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
總結
以上是生活随笔為你收集整理的温湿度(DHT11)+雨滴检测——LCD显示(TFT液晶)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电子显微镜数据格式MRC
- 下一篇: 最全电路图