近期家人生病, 忙于求医照料, 这几天抽了点时间做下结项实验. 后续再根据情况进行其他实验.
实验名称: 温湿度自动检测与调控
实验目的: 通过开发板实时监测环境温湿度, 当温湿度超出预设阀值时, 通过继电器启动外设(风扇), 以调控环境参数; 同时可通过点击用户按钮来调整此阀值.
实验材料:
GD32330C-START开发板. 为方便接线, 在引脚位置焊接了4块10PIN的排针插座
0.96寸OLED
DHT11模块
自焊继电器电路板
自接带开关USB延长线
USB小风扇及移动电源
实验步骤:
1.接线
将OLED及DHT11模块插到开发板插座上, 并将开发板的PB3,GND引脚用杜邦线连接至继电器电路板的基极与GND.
将USB延长线开关连接至继电器的常开引脚, 同时将移动电源与USB小风扇连接.
接通开发板电源, 此时OLED将实时显示当前温湿度及初始化阀值99. 此时PB3引脚输出低电平, 小风扇停止.
2.调整参数
通过按下用户按钮, 将阀值调整至80
3.触发条件
对着DHT11模块哈几口气, 使模块检测到的湿度上升并超过阀值.
4.观察结果
湿度超出预设阀值后, 开发板PB3输出高电平, 使三极管处于放大状态, 继电器吸合, 外设USB小风扇通电, 向DHT11模块吹风, 使模块湿度降低.
当湿度降至预设阀值以下时, PB3输出低电平, 继电器断开, 小风扇停止.
实验完毕. 以上为通过检测湿度进行调控, 温度同理.
GD32是个可以媲美 STM32的MCU, 其强大的功能还有待我们去学习, 去发现.
关键代码:
- void control_init();
- int main(void)
- {
- DHT11_Data_TypeDef data;
- u8 pos, cond;
- cond = 99;
- systick_config();
- OLED_Init();
- DHT11_GPIO_Config();
- control_init();
- gd_eval_key_init(KEY_USER, KEY_MODE_GPIO);
-
- //显示初始信息
- OLED_ShowString(0, 0, "GD32330C-START",16);
- OLED_ShowString(0,18, "FINAL TEST",16);
- OLED_ShowString(0,36, "T:",12);
- OLED_ShowString(64,36, "H:",12);
- OLED_ShowString(0,52, "COND: H > 99",12);
- OLED_Refresh_Gram();
-
- while(1)
- {
- //检测是否按下用户按钮, 按下时条件值-1
- if(SET == gd_eval_key_state_get(KEY_USER)){
- delay_1ms(50);
- if(SET == gd_eval_key_state_get(KEY_USER)){
- cond--;
- if(cond == 10)
- cond = 99;
- OLED_ShowNum(60, 52, cond, 2, 12);
- while(SET == gd_eval_key_state_get(KEY_USER));
- }
- }
- if(SUCCESS == Read_DHT11(&data))
- {
- //读温湿度并显示
- if(data.temp_int<10)
- {
- OLED_ShowNum(20, 36, data.temp_int, 1, 12);
- pos = 6;
- } else if(data.temp_int<100)
- {
- OLED_ShowNum(20, 36, data.temp_int, 2, 12);
- pos = 12;
- } else {
- OLED_ShowNum(20, 36, data.temp_int, 3, 12);
- pos = 18;
- }
- OLED_ShowString(20+pos,36,".",12);
- pos+=6;
- if(data.temp_deci<10)
- {
- OLED_ShowNum(20+pos, 36, data.temp_int, 1, 12);
- } else if(data.temp_deci<100)
- {
- OLED_ShowNum(20+pos, 36, data.temp_int, 2, 12);
- } else {
- OLED_ShowNum(20+pos, 36, data.temp_int, 3, 12);
- }
- if(data.humi_int<10)
- {
- OLED_ShowNum(84, 36, data.humi_int, 1, 12);
- pos = 6;
- } else if(data.humi_int<100)
- {
- OLED_ShowNum(84, 36, data.humi_int, 2, 12);
- pos = 12;
- } else {
- OLED_ShowNum(84, 36, data.humi_int, 3, 12);
- pos = 18;
- }
- OLED_ShowString(84+pos,36,".",12);
- pos+=6;
- if(data.humi_deci<10)
- {
- OLED_ShowNum(84+pos, 36, data.humi_deci, 1, 12);
- } else if(data.humi_deci<100)
- {
- OLED_ShowNum(84+pos, 36, data.humi_deci, 2, 12);
- } else {
- OLED_ShowNum(84+pos, 36, data.humi_deci, 3, 12);
- }
-
- //判定当湿度满足条件时输出引脚置高电平, 同时显示内容
- if(data.humi_int>=cond)
- {
- if(gpio_output_bit_get(GPIOB, OUT_CONTROL_PIN) == RESET)
- {
- gpio_bit_set(GPIOB, OUT_CONTROL_PIN);
- OLED_ShowString(84,52, "1",12);
- }
- }
- else
- {
- if(gpio_output_bit_get(GPIOB, OUT_CONTROL_PIN) == SET)
- {
- gpio_bit_reset(GPIOB, OUT_CONTROL_PIN);
- OLED_ShowString(84,52, "0",12);
- }
- }
- }
- OLED_Refresh_Gram();
- delay_1ms(100);
- }
- }
复制代码
实验过程视频:
|