手把手搞个能装X的STM32智能窗帘
最近在实验室肝了个超硬核的智能窗帘系统,能自动关窗开灯、蓝牙语音控制、烟雾报警,连光照阈值都能自己调。(文末有代码资料包)超过阈值蜂鸣器报警,或者控制灯的开关,同时把测量的一氧化碳浓度/光照强度/光照强度阈值,温湿度显示在oled上;2、自动模式:通过BH1750传感器检测光照强度,当光照强度小于阀值时,关窗开灯,当高于光照阈值,开窗关灯。8、多种模式结合:自动模式,手动调节光线阈值,按键控制窗帘
基于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显示分四行:
- 温湿度:28℃ 65%
- 光照:350lux (阈值200-500)
- 模式:AUTO
- 窗帘状态:[OPEN]
资源包内容:
- Keil工程源码(HAL库版本)
- 硬件原理图(立创EDA格式)
- 课设报告模板(含测试数据)
- Android蓝牙APP安装包
需要完整资料的老铁,三连后私信"智能窗帘"获取。下期预告:《用ESP32给窗帘加远程控制,上班摸鱼看家》!
更多推荐
所有评论(0)