`实验名称: DHT11温湿度检测与继电器控制实验
实验目的: 通过开发板及DHT11模块实时监测显示环境温湿度, 当温湿度超出预设阀值时, 通过继电器启动外设(风扇), 以对环境温湿度进行调控; 同时可通过点击用户按钮来调整温湿度预设阀值.
实验材料:
精英STM32F103开发板
DHT11温湿度传感器
自焊继电器电路板
自接带开关USB延长线
USB小风扇及移动电源
3.5寸LCD液晶屏
实验步骤:
1.接线
将LCD及DHT11模块连接到开发板, 并将开发板的PE12,GND引脚用杜邦线连接至继电器电路板的三极管基极与GND.
将USB延长线开关连接至继电器的常开引脚, 同时将移动电源与USB小风扇连接.
接通开发板电源, 此时LCD屏将实时显示当前环境温湿度预设阀值(温度>=40 OR 湿度>=90),输出状态等参数. 此时输出引脚输出低电平,外设(小风扇)停止, LCD显示无输出. 当前温度29.1,湿度75%
2.调整参数
通过按下Key0及Key1按钮, 将温度阀值调整为30
3.触发条件
手指覆盖在DHT11模块上, 使模块检测到的温度上升并超过阀值. 此时温度达到30.3.
4.观察结果
温度超出预设阀值后, 开发板输出引脚输出高电平, 使三极管处于放大状态, 继电器吸合, 外设USB小风扇通电, 向DHT11模块吹风, 使模块温湿度降低.
当温湿度降至预设阀值以下时, PB3输出低电平, 继电器断开, 小风扇停止. 温度降至29.7
同样将湿度阀值设置为80后, 重复上述3&4步骤可达到相似结果.
实验完毕.
主程序代码:
- #define OUTPUT_CLOCK RCC_APB2Periph_GPIOE
- #define OUTPUT_PORT GPIOE
- #define OUPTPUT_PIN GPIO_Pin_12
- void initmainconfig(void);
- u8 getnumlen(uint8_t num);
- void LCDShowTempCond(u8 temp);
- void LCDShowHumiCond(u8 humi);
- int main(void)
- {
- u8 key = 0, tempCond = 40, humiCond = 90, checkKeytimes = 0;
- DHT11_Data_TypeDef data;
- delay_init();
- DHT11_GPIO_Config();
- LCD_Init();
- KEY_Init();
- initmainconfig();
- LCDShowTempCond(tempCond);
- LCDShowHumiCond(humiCond);
-
- while(1)
- {
- checkKeyTimes = 0;
- while(checkKeyTimes++<10)
- {
- key=KEY_Scan(0);
- if(key)
- {
- switch(key)
- {
- case KEY0_PRES:
- tempCond--;
- if(tempCond<=10)
- tempCond=40;
- LCDShowTempCond(tempCond);
- break;
- case KEY1_PRES:
- humiCond--;
- if(humiCond<=60)
- humiCond=90;
- LCDShowHumiCond(humiCond);
- break;
- }
- break;
- }
- delay_ms(10);
- }
- if(SUCCESS == Read_DHT11(&data))
- {
- LCD_ShowNumA(106,60,RED,BLACK,data.temp_int,getnumlen(data.temp_int),16);
- LCD_ShowNumA(106,90,RED,BLACK,data.humi_int,getnumlen(data.humi_int),16);
- LCD_ShowNumA(130,60,RED,BLACK,data.temp_deci,getnumlen(data.temp_deci),16);
- LCD_ShowNumA(130,90,RED,BLACK,data.humi_deci,getnumlen(data.humi_deci),16);
- if(data.temp_int>=tempCond || data.humi_int>=humiCond)
- {
- if(GPIO_ReadOutputDataBit(OUTPUT_PORT,OUPTPUT_PIN) == 0)
- {
- GPIO_SetBits(OUTPUT_PORT,OUPTPUT_PIN);
- Show_Str(110,150,YELLOW,BLACK,"有",16,0);
- }
- }
- else
- {
- if(GPIO_ReadOutputDataBit(OUTPUT_PORT,OUPTPUT_PIN) != 0)
- {
- GPIO_ResetBits(OUTPUT_PORT,OUPTPUT_PIN);
- Show_Str(110,150,YELLOW,BLACK,"无",16,0);
- }
- }
- }
- delay_ms(100);
- }
- }
- void initmainconfig(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(OUTPUT_CLOCK, ENABLE);
- GPIO_InitStructure.GPIO_Pin = OUPTPUT_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(OUTPUT_PORT, &GPIO_InitStructure);
- GPIO_ResetBits(OUTPUT_PORT,OUPTPUT_PIN);
-
- DrawTestPage("精英STM32开发板");
- Show_Str(20,30,YELLOW,BLUE,"LCD&DHT11&继电器控制实验",16,1);
- Show_Str(20,60,RED,BLUE,"当前温度: . 度",16,1);
- Show_Str(20,90,RED,BLUE,"当前湿度: . %",16,1);
- Show_Str(20,120,RED,BLUE,"输出条件: 温度 ≥ OR 湿度 ≥",16,1);
- Show_Str(20,150,RED,BLUE,"输出状态:",16,1);
- Show_Str(110,150,YELLOW,BLACK,"无",16,0);
- Show_Str(20,200,BLUE,BLUE,"LCD Info: 3.5' ILI9486 320X480",16,1);
- delay_ms(1000);
- }
- u8 getnumlen(uint8_t num)
- {
- if(num>99)
- return 3;
- else if(num>9)
- return 2;
- return 1;
- }
- void LCDShowTempCond(u8 temp)
- {
- LCD_ShowNumA(172,120,RED,BLACK,temp,getnumlen(temp),16);
- }
- void LCDShowHumiCond(u8 humi)
- {
- LCD_ShowNumA(300,120,RED,BLACK,humi,getnumlen(humi),16);
- }
复制代码
`
|