问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于STM32的智能加湿器设计(新版本)

创作时间:
2025-03-24 16:53:13
作者:
@小白创作中心

基于STM32的智能加湿器设计(新版本)

引用
CSDN
1.
https://blog.csdn.net/qq_44987481/article/details/145388731

智能加湿器作为智能家居生态系统的一部分,可以与其他智能设备(如智能灯泡、智能窗帘等)进行联动,实现全屋智能化控制,提升家居生活的智能化水平。该项目的成功实施可以为其他智能家居产品的开发提供技术参考和示范,推动智能家居技术的普及和应用。

系统功能

本设计是基于STM32单片机的智能加湿器系统设计,主要内容如下:

  1. 主控芯片:主控芯片采用STM32F103C8T6,通过此芯片实现加湿器传感器信息的采集以及外设的控制。
  2. DHT11温湿度传感器:通过本传感器可以检测室内的湿度信息。
  3. 加湿模块:通过继电器控制加湿模块。
  4. HC-05蓝牙模块:实现远程控制加湿模块。
  5. 语音识别模块:语音识别模块核心芯片采用LD3320芯片,是一种非特定人“语音识别”专用芯片。通过“启动加湿器”和“关闭加湿器”等关键语句实现对加湿模块的语音控制。
  6. 时钟模块:实现定时功能加湿功能。
  7. OLED显示模块:OLED显示模块采用0.96寸液晶显示屏,该模块用来实时显示室内湿度和加湿器的工作状态。
  8. 按键模块:按键模块用来控制模式选择和控制加湿器的开启与关闭。可通过单片机上按键设置湿度的上下限报警值并具有掉电保存功能,保存在单片机内部,上电无需重新设置参数。
  9. 蜂鸣器模块:湿度太低和太高报警。

演示视频和实物

系统设计框图

软件设计流程图

加湿器控制系统设计的主程序主要是对相关硬件环境初始化,只有在系统硬件环境初始化成功后,系统才能够正常的工作。初始化过程涵盖了多个方面,主要包括蓝牙通信模块初始化、语音识别模块初始化、外部中断初始化、采集模块初始化、输入模块初始化和显示模块初始化。程序完成初始化后,单片机将采集到温湿度的值显示在OLED屏幕上,显示完成后单片机会将当前湿度值与设置的湿度阈值进行比较,控制加湿器。

原理图

主程序

#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "delay.h"
#include "OLED.h"
#include "Key.h"
#include "Serial.h"
#include "Serial3.h"
#include "LED.h"
#include "Buzzer.h"
#include "MyRTC.h"
#include "string.h"
#include "dht11.h"
#include "Serial2.h"

uint16_t RTC_Time1[] = {7, 0, 0};    //3个定时时间
uint16_t RTC_Time2[] = {11, 0, 0};
uint16_t RTC_Time3[] = {19, 0, 0};
uint8_t KeyNum;      //存储按键值
uint8_t RxData;      //蓝牙接收到的数据
uint32_t bufe[4];     //存储温湿度
u8 temp, humi;
u8 t = 0;          //温湿度读取值的间隔
u8 state = 1;  //设备开关
u8 state1 = 1; //模式选择
u8 state2,state3,state4,state5; //模式选择
u8 ShiYu_Xia=20,ShiYu_Shang=60;     //湿度阈值设置

void Jia_ON(void)
{
    JiaShi_ON();
    LED1_ON();
}

void Jia_OFF(void)
{
    JiaShi_OFF();
    LED1_OFF();
}

void YuYingMode()   //先说小杰唤醒,然后说打开窗户和关闭窗户
{
    if (Serial2_RxFlag == 1)        //串口接收到数据包的标志位,若是收到数据包,会置1
    {
                if (strcmp(Serial2_RxPacket, "JIASHI_ON") == 0)
        {
          Jia_ON();
        }
        else if (strcmp(Serial2_RxPacket, "JIASHI_OFF") == 0)
        {
           Jia_OFF();
        }
        Serial2_RxFlag = 0; //将标志位清零,不清零就接收不到下一个数据包了
    }
}

void ctrlue()
{
      if(bufe[1]<ShiYu_Xia)
        {
           Jia_ON();
        }else
        {
           Jia_OFF();
        }
        
        if(bufe[1]>ShiYu_Shang)
        {
           Buzzer_Turn();
             LED2_ON();
        }else
        {
           Buzzer_OFF();
             LED2_OFF();
        }
        if (KeyNum == 2 )            //阈值设置
        {
                delay_ms(20);
                if (KeyNum == 2)
                {
                        state3++;
                        if (state3 > 1)
                        {
                                state3 = 0;
                        }
                }
        }
        if (state3 == 0)                
        {
             if(KeyNum == 3) ShiYu_Xia++;
             if(KeyNum == 4) ShiYu_Xia--;
        }
        if (state3 == 1)                   
        {
             if(KeyNum == 3) ShiYu_Shang++;
             if(KeyNum == 4) ShiYu_Shang--;			 
        } 		
}

void shoudong()
{
    Buzzer_OFF();	 
       if (KeyNum == 2 )            //手动模式控制
            {
                    delay_ms(20);
                    if (KeyNum == 2)
                    {
                            state2++;
                            if (state2 > 1)
                            {
                                    state2 = 0;
                            }
                    }
            }
            if (state2 == 1)                
            {
         Jia_ON();
            }
            if (state2 == 0)                   
            {
         Jia_OFF();
            } 		
}	
void LanYa()
{
    if (Serial_GetRxFlag() == 1)      //蓝牙接收部分
    {
        RxData = Serial_GetRxData();     //蓝牙接收
        switch (RxData)        //蓝牙控制选择
        {
        case 1:
                        Jia_ON();
            break;
        case 2:
                        Jia_OFF();
            break;
        case 3:
                        Buzzer_ON();
            break;
        case 4:
                        Buzzer_OFF();
        case 5:
                        ShiYu_Xia++;
            break;
        case 6:
                        ShiYu_Xia--;
            break;
        case 7:
                        ShiYu_Shang++;
            break;
        case 8:
                        ShiYu_Shang--;
            break;  				
        default:
            break;
        }
    }
}

void dingshi()
{
    if ((MyRTC_Time[3] == RTC_Time1[0]) && (MyRTC_Time[4] == RTC_Time1[1]) && (MyRTC_Time[5] == RTC_Time1[2]))//开启时间
        {
             Jia_ON();
         }
        if ((MyRTC_Time[3] == RTC_Time3[0]) && (MyRTC_Time[4] == RTC_Time3[1]) && (MyRTC_Time[5] == RTC_Time3[2])) //关闭时间
        {
            Jia_OFF();
        }
}

int main(void)     //主函数
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   // 设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    delay_init();      //延时函数初始化
    SystemInit();
    Key_Init();    //按键初始化
    LED_Init();
    OLED_Init();
    Buzzer_Init();
    DHT11_Init();
    OLED_ShowString(1, 5, "XX:XX:XX");    //显示时间
    OLED_ShowChinese(2, 3, 3); //显示湿度
    OLED_ShowChinese(2, 4, 4);
    OLED_ShowString(2, 9, ":");
    
    OLED_ShowChinese(4, 1, 2);     //显示温度
    OLED_ShowChinese(4, 2, 4);
    OLED_ShowString(4, 5, ":");
    MyRTC_Init();
    Serial_Init();   //串口1初始化(蓝牙)
    Serial3_Init();   //串口2初始化(语音)
        Serial2_Init();   //串口2初始化(语音识别模块)
    while (1)
    {	
          	MyRTC_ReadTime();
        OLED_ShowNum(1, 5, MyRTC_Time[3], 2);
        OLED_ShowNum(1, 8, MyRTC_Time[4], 2);
        OLED_ShowNum(1, 11, MyRTC_Time[5], 2);
    
        if (t % 10 == 0)
        {
            DHT11_Read_Data(&temp, &humi);  //读取温湿度并显示在OLED上
            bufe[0] = temp;     //温度
            bufe[1] = humi;    //湿度
            OLED_ShowNum(2, 10, bufe[1], 2);
            OLED_ShowString(2, 12, "%");
            OLED_ShowNum(4, 6, bufe[0], 2);
            OLED_ShowString(4, 8, "%");
            printf("\r\nWen=%d", bufe[0]);   //蓝牙上传数据
            printf("\r\nShi=%d\r\n", bufe[1]);								
        }
        OLED_ShowString(3, 2, "S_X:");				
                OLED_ShowNum(3, 6, ShiYu_Xia, 2);
        OLED_ShowString(3, 10, "S_S:");	
                OLED_ShowNum(3, 14, ShiYu_Shang, 2);
        KeyNum = Key_GetNum();               //按键检查
        if (KeyNum == 1 ) 
        {
            delay_ms(20);
            if (KeyNum == 1)
            {
                state1++;
                if (state1 > 4)
                {
                    state1 = 0;
                }
            }
        }
        if (state1 == 1)                //自动模式
        {
            ctrlue();   // 开
            OLED_ShowChinese(4, 7, 30);
            OLED_ShowChinese(4, 8, 31);
        }
        if (state1 == 0)                   //手动模式
        {
            shoudong();
            OLED_ShowChinese(4, 7, 29);
            OLED_ShowChinese(4, 8, 31);
        }
       
                 if (state1 == 2)                     //定时模式
        {
            dingshi();
            OLED_ShowChinese(4, 7, 68);
            OLED_ShowChinese(4, 8, 69);
        }	
       if (state1 == 3)                     //蓝牙模式
        {
            LanYa();
            OLED_ShowChinese(4, 7, 62);
            OLED_ShowChinese(4, 8, 63);
        }
       if (state1 == 4)                     //语音模式
        {
            YuYingMode();
            OLED_ShowChinese(4, 7, 54);
            OLED_ShowChinese(4, 8, 55);
        }
            }
}

总结

本次设计采用了一种基于单片机的智能加湿器系统,其以STM32F103C8T6和温湿度传感器DHT11为核心,通过湿度传感器对湿度信号进行采集和转换,然后通过单片机对数据进行分析处理,实现智能切换加湿功能。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号