基于STM32智能窗帘系统 1、可以检测环境中温湿度/烟雾浓度/一氧化碳浓度,光照强度。 超过阈值蜂鸣器报警,或者控制灯的开关,同时把测量的一氧化碳浓度/光照强度/光照强度阈值,温湿度显示在oled上; 2、自动模式:通过BH1750传感器检测光照强度,当光照强度小于阀值时,关窗开灯,当高于光照阈值,开窗关灯。 3、手动调节:通过按键调节阈值的高低。 4、蓝牙模式:蓝牙控制窗帘开关,同时显示开关窗状态。 5、语音模式:语音控制窗帘开关,同时显示开关窗状态。 6、定时模式:根据设定的开关窗时间,控制窗帘开关,同时可以在该模式下调节定时时间。 7、手动模式:通过按键控制窗帘开关。 8、多种模式结合:自动模式,手动调节光线阈值,按键控制窗帘升降,蓝牙模式,定时模式; 资料 代码+原理图+课设报告

最近在实验室肝了个超硬核的智能窗帘系统,能自动关窗开灯、蓝牙语音控制、烟雾报警,连光照阈值都能自己调。核心代码和设计思路这就开整,建议先收藏再往下看!(文末有代码资料包)


一、环境检测与报警系统

系统用DHT11测温湿度,MQ-2和MQ-7检测烟雾/一氧化碳,BH1750负责光照。当检测值超标时,蜂鸣器直接开嚎,同时STM32通过I2C驱动OLED实时显示数据。

关键代码片段(传感器数据读取):

// BH1750光照读取
float Get_LightIntensity(void) {
    uint8_t buf[2];
    HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDR, buf, 2, 100);
    return (buf[0]<<8 | buf[1])/1.2; // 原始数据转lux
}

// 报警判断逻辑
if(CO_Level > CO_THRESHOLD || Light < LIGHT_MIN){
    HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
    Show_Alert_OLED("DANGER! CO:%.1fppm", CO_Level); // OLED弹警告
}

避坑指南:MQ系列传感器需要预热!上电后前30秒数据不准,代码里得加个延时过滤。


二、自动模式的核心逻辑

BH1750检测到光照不足时,STM32驱动步进电机关窗帘(模拟关窗),同时用PWM调亮LED补光。这里用了状态机防止电机堵转:

// 光照自动控制状态机
typedef enum {LIGHT_LOW, LIGHT_NORMAL, LIGHT_HIGH} LightState;
LightState currentState = LIGHT_NORMAL;

void Auto_Light_Control(){
    float lux = Get_LightIntensity();
    if(lux < LIGHT_MIN && currentState != LIGHT_LOW){
        Close_Curtain();  // 关窗函数
        LED_PWM(80);      // PWM值80%亮度
        currentState = LIGHT_LOW;
    } 
    else if(lux > LIGHT_MAX && currentState != LIGHT_HIGH){
        Open_Curtain();
        LED_PWM(0);
        currentState = LIGHT_HIGH;
    }
}

硬件骚操作:步进电机驱动用了A4988模块,注意DRV8825和A4988的微步跳线设置不一样,接错直接烧芯片!


三、多模式切换的架构设计

系统支持自动/蓝牙/定时/语音/手动五种模式,用状态标志位+优先级仲裁实现模式切换:

// 模式优先级定义(数值越小优先级越高)
typedef enum {
    VOICE_MODE = 0,
    MANUAL_MODE,
    BLUETOOTH_MODE,
    TIMER_MODE,
    AUTO_MODE
} SysMode;

uint8_t current_mode = AUTO_MODE; // 默认自动模式

// 按键中断切换模式
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
    if(GPIO_Pin == MODE_SWITCH_Pin){
        current_mode = (current_mode +1)%5;
        OLED_Clear();
        Show_Mode_OLED(current_mode); // OLED显示当前模式
    }
}

交互细节:蓝牙用的HC-05模块,Android端用MIT App Inventor写了个控制APP,发送'OPEN'/'CLOSE'指令控制窗帘。


四、定时任务的实现

RTC实时时钟配置闹钟中断,结合TIM定时器实现精确控制:

// RTC闹钟设置(每天7:00开窗)
RTC_AlarmTypeDef sAlarm = {0};
sAlarm.AlarmTime.Hours = 7;
sAlarm.AlarmTime.Minutes = 0;
sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
sAlarm.Alarm = RTC_ALARM_A;
HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);

// 中断回调函数
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){
    if(current_mode == TIMER_MODE){
        Open_Curtain();
        OLED_ShowString(0,3,"Alarm Triggered!");
    }
}

冷知识:STM32的RTC靠纽扣电池供电,断电后依然走时,但代码里要加电池检测逻辑防抽风。


五、语音控制的黑科技

用了LD3320语音识别模块,非特定人声识别。关键是要做降噪处理——在麦克风电路上并联104电容滤高频干扰:

// 语音指令匹配
void Voice_Process(uint8_t *result){
    if(strstr((char*)result, "kai chuang")){
        Open_Curtain();
        OLED_ShowCNString(0,4,"语音开窗"); // 显示中文
    }
    else if(strstr((char*)result, "guan chuang")){
        Close_Curtain();
    }
}

实测翻车:北方同学注意!“开窗”和“开床”识别容易混淆,得在训练集里多录几种发音。


完整系统效果

OLED显示分四行:

  1. 温湿度:28℃ 65%
  2. 光照:350lux (阈值200-500)
  3. 模式:AUTO
  4. 窗帘状态:[OPEN]

资源包内容

  • Keil工程源码(HAL库版本)
  • 硬件原理图(立创EDA格式)
  • 课设报告模板(含测试数据)
  • Android蓝牙APP安装包

需要完整资料的老铁,三连后私信"智能窗帘"获取。下期预告:《用ESP32给窗帘加远程控制,上班摸鱼看家》!

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐