基于单片机的智能家居智能雨水自动关窗控制系统设计

1、基于单片机的智能家居智能雨水自动关窗控制系统设计

点击链接下载protues仿真设计资料:https://download.csdn.net/download/qq_39020934/92091112

1.1、系统概述

在智能家居应用场景中,窗户的开闭控制不仅关系到室内通风与舒适性,也直接影响到家庭安全和财产保护。特别是在突发降雨或夜间无人值守的情况下,若窗户未及时关闭,雨水可能进入室内导致家具、电器受潮损坏,甚至引发漏电等安全隐患。因此,开发一种能够自动感知雨水并智能控制窗户开闭的系统具有较高的实用价值。

本系统基于52系列单片机(如STC89C52、AT89S52等)设计,融合湿度/雨水传感器与温湿度传感器,实现环境信息的实时采集与智能决策。系统能够根据用户设定的雨水检测阈值与环境参数自动控制窗户关闭,同时支持手动/自动两种工作模式,满足不同使用需求。系统配备LM016L(与LCD1602兼容的字符液晶)用于实时显示温湿度、雨水判定结果、模式状态及报警信息,增强交互体验。

为了提高系统稳定性与安全性,本系统还引入报警功能与故障检测机制。当雨水传感器异常、温湿度参数超出合理范围或执行机构无法正常动作时,系统将通过蜂鸣器或报警指示灯发出提示,并在液晶上显示报警原因,便于用户及时处理。阀值调节按键模块允许用户根据不同季节、不同居住环境调整雨水检测阈值及其他控制参数,使系统具有较强的个性化配置能力和可扩展性。

从工程角度来看,本系统可作为智能家居入门级控制终端,也可以作为更大规模家庭自动化系统的一部分,通过后续扩展通信模块(如蓝牙、WIFI、ZigBee)实现与手机APP或家庭网关联动。本设计重点实现可靠的雨水检测、温湿度监测、自动关窗、手动控制、阈值设置、液晶显示与报警等核心功能,并在硬件电路与软件程序设计上形成清晰的模块化结构。


2、系统功能设计

2.1、雨水自动检测与关窗控制功能

雨水检测是系统的核心功能。本系统通过湿度传感器或专用雨水检测板采集环境雨水信息。传感器通常输出模拟电压或数字电平:

  • 模拟输出:雨水越多,导电越强,模拟电压变化更明显,利于设定阈值判断
  • 数字输出:模块内置比较器,通过电位器设定阈值后直接输出高/低电平

为了满足"阈值可调"这一要求,本系统建议采用模拟输出 + 单片机ADC采样 + 软件阈值判断方案。这样用户通过按键即可在液晶界面中设定阈值,并能够实时看到当前雨水检测值与阈值的比较结果,控制逻辑更直观。

当雨水检测值达到或超过阈值时,系统进入自动关窗流程:

1)判断系统处于自动模式

2)判断窗户当前为打开状态

3)启动执行机构(电机/舵机/直流推杆)进行关窗

4)到位后停止执行机构并记录"关闭完成"状态

5)必要时锁定窗户防止误开(可扩展)

系统应具备防抖与延时判断机制,避免短暂水滴或湿度突变造成误触发。例如:

  • 连续多次采样都超过阈值才判定为"下雨"
  • 设置最小持续时间(如持续2秒)后再执行关窗

通过这种策略可显著提升系统可靠性,减少频繁误动作。


2.2、温湿度综合监测功能

仅依赖雨水传感器可能会受到喷雾、潮湿空气、露水等干扰,为了提升智能程度,本系统加入温湿度综合监测模块,如常用的DHT11/DHT22或SHT系列传感器。通过实时监测环境温度与湿度,系统可以实现以下智能策略:

  • 当环境湿度持续高且接近雨水阈值时,提前进入"警戒状态"
  • 当温度较低且湿度较高时,结合雨水检测更严格判定(避免露水误判)
  • 在某些用户设定场景下(如室内需要通风),可允许在轻微湿度变化时不关窗
  • 若环境温湿度异常(例如传感器失效或环境过热过湿),触发报警提醒

温湿度数据显示在液晶屏上,既可为系统决策提供依据,也能为用户提供舒适度参考。


2.3、手动与自动切换模式功能

实际使用中并非所有场景都需要自动控制,例如:

  • 用户在阳台晾衣需要开窗通风,短时内可能不希望系统自动关窗
  • 用户正在清洁窗户或进行维护,需要手动控制
  • 用户外出前希望开启自动模式,确保雨天安全

因此系统提供两种模式:

1)自动模式 :系统根据雨水阈值与环境参数自动关窗

2)手动模式:用户通过按键直接控制开窗/关窗,系统只监测并显示,不自动动作(可设置仍报警但不执行)

模式切换通常由"MODE键"实现,切换时液晶显示明显提示,例如:

  • AUTO
  • MANU

在手动模式下,仍可允许雨水报警提示用户,但不自动关闭窗户,避免干预用户操作。


2.4、报警功能设计

报警功能用于在异常情况下提醒用户,保障系统安全稳定运行。报警触发条件可以包括:

  • 雨水检测值长时间异常(如开路/短路导致读数固定极大或极小)
  • 温湿度传感器读取失败或数据超范围
  • 执行机构关窗超时(电机卡滞、窗户阻塞)
  • 系统电压异常(电源过低导致控制不可靠)
  • 参数设置越界或存储异常

报警方式可设计为多种:

  • 蜂鸣器鸣叫(滴滴滴)
  • 红色LED闪烁
  • 液晶屏显示报警代码或文本(如"ALARM: MOTOR")

报警逻辑建议分级:

  • 轻微报警:提示但不停止系统工作(如温湿度轻微异常)
  • 严重报警:立即停止执行机构、锁定输出并等待人工处理(如过流、卡滞)

这样系统既能提示风险,也能避免错误动作造成损坏。


2.5、阀值调节按键功能

阈值调节是系统"个性化配置能力"的关键功能。用户可通过按键界面调整:

  • 雨水检测阈值(主要参数)
  • 温湿度报警阈值(可扩展)
  • 自动关窗延迟时间(可扩展)
  • 关窗动作持续时间或超时时间(可扩展)

按键设计建议至少包含:

  • 设置键(SET):进入/退出设置界面
  • 选择键(NEXT):切换设置项
  • 增加键(UP):数值增加
  • 减少键(DOWN):数值减少
  • 确认键(OK,可选):保存参数

设置过程应具有交互提示:

  • 当前设置项闪烁
  • 显示当前阈值与范围
  • 保存成功提示

参数保存可存储在单片机内部EEPROM(STC单片机有IAP)或外部EEPROM(如AT24C02),实现掉电不丢失。


2.6、LM016L液晶显示实时状态反馈

LM016L属于字符型液晶,功能与LCD1602兼容,可显示2行×16字符。系统通过LM016L显示:

  • 温度、湿度
  • 雨水检测值与阈值
  • 工作模式(AUTO/MANU)
  • 窗户状态(OPEN/CLOSE/MOV)
  • 报警信息(ALM)

典型显示布局示例:

  • 第一行:T:25C H:60%
  • 第二行:R:320 TH:400 A
    其中:R为雨水检测值,TH为阈值,A代表自动模式。

显示模块的加入使系统状态透明化,用户无需打开外壳或使用上位机即可了解系统工作情况,提高了使用便利性与可维护性。


3、电路设计

3.1、硬件总体结构说明

系统硬件由以下模块组成:

1)52单片机最小系统模块

2)电源供电模块

3)雨水/湿度传感器采集模块

4)温湿度传感器采集模块

5)执行机构驱动模块(电机/舵机/推杆)

6)按键输入与设置模块

7)LM016L液晶显示模块

8)报警模块(蜂鸣器/LED)

9)位置检测与限位保护模块(可选)

10)参数存储模块(可选EEPROM)

每个模块在系统中承担不同功能,既要保证采集精度,又要确保执行安全。下面分别进行详细说明。


3.2、52单片机最小系统模块

52系列单片机(如STC89C52)是系统控制核心,主要负责:

  • 采集传感器数据并进行判断
  • 控制执行机构实现开关窗
  • 扫描按键并修改参数
  • 驱动LM016L显示实时信息
  • 报警输出控制
  • 存储/读取阈值参数

最小系统组成:

  • 单片机芯片
  • 晶振电路(11.0592MHz或12MHz)
  • 复位电路(上电复位 + 手动复位)
  • 去耦电容(0.1uF)
  • 必要时加入下载接口(串口/ISP)

设计要点:

  • LCD和按键等外设需要较多IO口,建议采用4位LCD模式节省IO资源
  • 传感器采样可能需要ADC,若选用STC带ADC型号可简化电路,否则需外接ADC
  • 执行机构驱动与传感器采样应合理分区布线,避免电机干扰导致采样波动

3.3、电源供电模块

智能窗户控制系统通常包含控制电路与执行机构两部分供电:

  • 控制电路:5V或3.3V(单片机、传感器、液晶、WIFI扩展等)
  • 执行机构:12V或24V(直流电机、推杆等)

电源设计建议采用双路供电:

  • 12V适配器作为主电源
  • 通过DC-DC/7805降压得到5V供控制电路
  • 若WIFI等需要3.3V,可再降压得到3.3V

关键注意事项:

  • 电机启动电流大,容易造成电源压降,控制电路需加滤波与隔离
  • 在5V电源入口处增加电解电容(470uF~1000uF)缓冲电机冲击
  • 在单片机与传感器附近增加0.1uF去耦电容,提升抗干扰能力
  • 若要求更高可靠性,可使用光耦隔离驱动信号或采用独立电源给电机

3.4、雨水/湿度传感器采集模块

雨水检测可使用雨滴传感器模块或湿度检测板,其输出形式一般为:

  • AO:模拟输出(0~5V)
  • DO:数字输出(比较器阈值输出)

为满足"阈值调节按键"功能,本系统更适合使用AO模拟输出,阈值由软件设置。采集电路设计要点:

  • AO输出接单片机ADC输入或外接ADC输入
  • 增加RC滤波(如1k+0.1uF)抑制噪声
  • 加入输入保护(串联电阻+钳位二极管)防止外部静电或误接线损坏

若使用外接ADC,常见器件:

  • ADC0832(2通道)
  • PCF8591(I2C,4通道)
  • ADS1115(16位,精度更高)

雨水检测值建议映射为01023或0255的数字量,便于阈值比较。


3.5、温湿度传感器采集模块

温湿度传感器可选:

  • DHT11:低成本,精度一般
  • DHT22:精度更高,测量范围更广
  • SHT30/SHT31:精度更高,I2C接口

传感器与单片机连接通常为单总线或I2C:

  • DHT系列:单总线时序通信,需要精确延时
  • SHT系列:I2C通信,稳定性更好

硬件设计要点:

  • 数据线加上拉电阻(一般4.7k~10k)
  • 传感器供电稳定,远离电机干扰源
  • 若线缆较长,建议使用屏蔽线或加入滤波电容

温湿度采样频率不宜过高,一般1~2秒采样一次即可满足实时显示与控制需求。


3.6、执行机构驱动模块(窗户开闭控制)

窗户执行机构可采用多种形式:

1)直流减速电机 + 丝杆机构

2)电动推杆(内置限位)

3)舵机(小窗户或模型实验)

4)步进电机(定位精度高但控制复杂)

在智能家居应用中,电动推杆最常见,因为其结构成熟、行程固定、易于安装。本系统执行机构驱动电路通常采用:

  • H桥驱动芯片(如L298N、TB6612)用于电机正反转
  • 继电器正反转控制(成本低但寿命受限)
  • MOSFET H桥(效率高但设计较复杂)

驱动模块设计要点:

  • 电机电源与控制电源隔离或加强滤波
  • 续流二极管或TVS抑制反向感应电压
  • 驱动输出应支持过流保护或至少设置软件限时
  • 若使用推杆限位开关,可将限位信号反馈给单片机停止动作,提高可靠性

执行机构控制逻辑:

  • 打开窗户:电机正转至打开限位
  • 关闭窗户:电机反转至关闭限位
  • 若无限位开关,则用时间控制(例如运行5秒)并设置超时保护

3.7、按键输入与设置模块

按键模块用于:

  • 模式切换(自动/手动)
  • 手动开窗、关窗
  • 阈值设置与参数调整
  • 报警消音或复位(可扩展)

硬件实现:

  • 独立按键连接IO口,按下为低电平
  • IO口使用上拉电阻(10k)
  • 软件消抖必须实现,避免误触发

按键设计建议:

  • MODE:模式切换
  • OPEN:手动开窗
  • CLOSE:手动关窗
  • SET:进入设置
  • UP/DOWN:调整阈值
  • NEXT:切换设置项

3.8、LM016L液晶显示模块

LM016L与LCD1602兼容,可使用4位或8位模式。推荐4位模式减少IO占用。液晶电路要点:

  • V0接电位器调节对比度
  • RW可接地只写模式,节省IO
  • 数据线D4~D7连接单片机IO
  • 背光供电需限流(通常模块自带电阻)

显示模块用于实时显示数据与状态,建议刷新周期200ms~500ms,既保证实时性又避免频繁刷新造成闪烁。


3.9、报警模块(蜂鸣器/LED)

报警模块用于提醒用户:

  • 雨水达到阈值且窗户正在关闭
  • 传感器故障或数据异常
  • 电机卡滞或执行机构超时

蜂鸣器建议使用有源蜂鸣器:

  • IO口输出高电平即可响
  • 通过NPN三极管驱动放大电流
  • 设定不同报警节奏区分报警类型

指示灯可用红色LED表示报警,绿色LED表示正常运行,黄色LED表示自动模式/手动模式状态(可选)。


3.10、位置检测与限位保护模块(可选)

为了保证窗户动作安全可靠,建议加入限位开关:

  • 打开限位
  • 关闭限位

限位开关信号输入单片机,当到位后立即停止电机,避免机械冲击与过载。若使用电动推杆自带限位,也可通过检测电流突变或时间超时进行保护。


4、程序设计

4.1、软件总体架构与运行机制

系统软件采用"主循环 + 定时任务"的方式组织,核心思想是:

  • 定时器产生1ms系统节拍
  • 按键扫描每10ms执行一次
  • 传感器采样每1s执行一次
  • LCD刷新每200ms执行一次
  • 控制决策与执行机构动作由状态机管理
  • 报警任务通过非阻塞方式控制蜂鸣器节奏

软件模块划分:

1)系统初始化模块

2)LCD显示驱动模块

3)雨水传感器采样与阈值判断模块

4)温湿度采样模块

5)按键扫描与设置界面模块

6)自动/手动模式控制模块

7)关窗执行机构控制模块

8)报警管理模块

9)参数保存与读取模块(EEPROM/IAP)

通过模块化设计,系统逻辑清晰,便于后续扩展更多传感器或通信功能。


4.2、系统初始化模块

初始化包含:

  • IO口方向配置
  • LCD初始化并显示欢迎界面
  • 定时器初始化(1ms节拍)
  • 读取EEPROM/IAP中保存的阈值参数
  • 初始化传感器(温湿度检测存在性)
  • 初始化窗户状态(默认未知→通过限位判断或默认关闭)
  • 设置默认工作模式(建议默认自动模式)

初始化完成后进入主循环运行。


4.3、雨水检测与阈值比较模块

雨水检测模块核心是获取传感器值并与阈值比较:

  • 读取ADC值 rain_val
  • 与阈值 rain_th 比较
  • rain_val >= rain_th 且持续N次成立,则判定"下雨"
  • 若连续低于阈值,则判定"无雨"

为了防止误判,采用"连续计数判定"策略:

  • 例如连续3次超过阈值才触发下雨
  • 连续5次低于阈值才解除下雨状态
    这样可以在雨滴断续或传感器抖动时保持稳定。

4.4、温湿度采样模块设计

温湿度采样模块读取DHT11/DHT22数据,并进行:

  • 数据合法性校验(校验和)
  • 温湿度范围判断
  • 失败重读与错误计数
  • 异常报警触发

温湿度数据用于显示,同时可参与智能控制:

  • 当湿度特别高且温度较低时,提高雨水判定门槛或增加延时
  • 当湿度异常高(>95%)且持续时间较长,可提示"环境异常"报警

4.5、自动/手动模式控制模块

系统模式分为:

  • MODE_AUTO:自动关窗
  • MODE_MANUAL:手动控制

模式切换按键触发后:

  • 更新模式变量
  • LCD显示对应模式
  • 在手动模式下屏蔽自动关窗动作(但可保持雨水报警提示)

自动模式下,当下雨判定成立且窗户未关闭时触发关窗流程;手动模式下,系统不主动关窗,但可提示用户。


4.6、关窗执行机构控制模块(状态机)

执行机构控制采用状态机实现,避免使用长延时阻塞主循环。状态可设计为:

  • WIN_STOP:停止
  • WIN_OPENING:开窗中
  • WIN_CLOSING:关窗中
  • WIN_OPENED:已打开
  • WIN_CLOSED:已关闭
  • WIN_FAULT:故障(超时或卡滞)

控制过程:

1)收到关窗命令 → WIN_CLOSING

2)电机反转 → 开始计时

3)检测关闭限位 → 到位停止,进入 WIN_CLOSED

4)若超过最大运行时间仍未到位 → 停止并报警,进入 WIN_FAULT

同理,开窗命令也遵循相同逻辑。采用限位开关能显著提升可靠性;若没有限位,则需严格控制运行时间并设置机械余量。


4.7、按键扫描与阈值设置界面模块

按键扫描需消抖,建议每10ms扫描一次。设置界面建议采用菜单式:

  • SET进入设置
  • NEXT切换设置项
  • UP/DOWN修改数值
  • SET再次按下保存退出

阈值范围设置:

  • 雨水阈值 rain_th:01023(ADC范围)或0255
  • 温湿度报警阈值:可设定合理范围
    修改后保存到EEPROM/IAP,掉电不丢失。

4.8、报警管理模块

报警管理模块根据不同报警原因触发不同报警等级与提示方式:

  • 雨水触发但窗户已关闭:可提示一次即可
  • 执行机构超时:持续报警直到人工处理
  • 传感器故障:周期性报警并显示错误信息

蜂鸣器控制建议使用非阻塞节拍方式:

  • 每1ms或10ms更新蜂鸣器状态
  • 不使用长延时
    这样可保证系统显示、按键、控制任务不受影响。

5、核心程序示例(模块化代码)

5.1、全局变量与宏定义

c 复制代码
#include <reg52.h>
#include <string.h>

typedef unsigned char u8;
typedef unsigned int  u16;

//---------------- LCD1602/LM016L接口 ----------------
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^7;
#define LCD_PORT P0   // 4位模式示例

//---------------- 按键定义(低电平有效) ----------------
sbit KEY_MODE  = P3^2;
sbit KEY_OPEN  = P3^3;
sbit KEY_CLOSE = P3^4;
sbit KEY_SET   = P3^5;
sbit KEY_UP    = P3^6;
sbit KEY_DN    = P3^7;

//---------------- 执行机构驱动(以继电器或H桥控制信号示例) ----------------
sbit M_A = P1^0;  // 电机方向A
sbit M_B = P1^1;  // 电机方向B

//---------------- 报警蜂鸣器 ----------------
sbit BEEP = P1^5;

//---------------- 限位开关(可选,低电平触发) ----------------
sbit LIM_OPEN  = P3^0;
sbit LIM_CLOSE = P3^1;

//---------------- 系统参数 ----------------
#define RAIN_ADC_MAX    1023
#define RAIN_TH_MIN     0
#define RAIN_TH_MAX     1023

#define WIN_TIMEOUT_MS  8000   // 关窗/开窗最大动作时间8秒
#define RAIN_TRIG_CNT   3      // 连续3次判定下雨
#define RAIN_REL_CNT    5      // 连续5次解除下雨

//---------------- 状态定义 ----------------
typedef enum { MODE_AUTO=0, MODE_MANUAL=1 } mode_t;
typedef enum { WIN_STOP=0, WIN_OPENING, WIN_CLOSING, WIN_OPENED, WIN_CLOSED, WIN_FAULT } win_state_t;

mode_t g_mode = MODE_AUTO;
win_state_t g_win = WIN_STOP;

u16 g_rain_val = 0;
u16 g_rain_th  = 500;       // 默认阈值(可从EEPROM读取)

u8 g_rain_on = 0;           // 0无雨 1下雨
u8 g_rain_cnt_hi = 0;
u8 g_rain_cnt_lo = 0;

// 温湿度(示例)
u8 g_temp = 25;
u8 g_humi = 60;

// 计时
volatile u16 ms_tick = 0;
volatile bit flag_10ms = 0;
volatile bit flag_200ms = 0;
volatile bit flag_1000ms = 0;

// 窗户动作计时
u16 g_win_timer = 0;

// 报警标志
bit g_alarm = 0;

5.2、定时器1ms节拍与任务标志

c 复制代码
void Timer0_Init_1ms(void)
{
    TMOD &= 0xF0;
    TMOD |= 0x01;
    TH0 = (65536 - 1000) / 256;  // 12MHz近似
    TL0 = (65536 - 1000) % 256;
    ET0 = 1;
    TR0 = 1;
    EA  = 1;
}

void Timer0_ISR(void) interrupt 1
{
    TH0 = (65536 - 1000) / 256;
    TL0 = (65536 - 1000) % 256;

    ms_tick++;

    if(ms_tick % 10 == 0) flag_10ms = 1;
    if(ms_tick % 200 == 0) flag_200ms = 1;
    if(ms_tick % 1000 == 0) flag_1000ms = 1;

    // 窗户动作计时
    if(g_win == WIN_OPENING || g_win == WIN_CLOSING)
    {
        if(g_win_timer < 60000) g_win_timer++;
    }
}

5.3、LM016L LCD驱动(4位模式示例)

c 复制代码
void LCD_Delay(u16 t){ while(t--); }

void LCD_Write4(u8 dat)
{
    LCD_PORT = (LCD_PORT & 0x0F) | (dat & 0xF0);
    LCD_EN = 1; LCD_Delay(50); LCD_EN = 0;
}

void LCD_Cmd(u8 cmd)
{
    LCD_RS = 0; LCD_RW = 0;
    LCD_Write4(cmd);
    LCD_Write4(cmd << 4);
    LCD_Delay(2000);
}

void LCD_Dat(u8 dat)
{
    LCD_RS = 1; LCD_RW = 0;
    LCD_Write4(dat);
    LCD_Write4(dat << 4);
    LCD_Delay(2000);
}

void LCD_SetPos(u8 row, u8 col)
{
    u8 addr = (row==0)?(0x80+col):(0xC0+col);
    LCD_Cmd(addr);
}

void LCD_Str(u8 row,u8 col,char *s)
{
    LCD_SetPos(row,col);
    while(*s) LCD_Dat(*s++);
}

void LCD_Init(void)
{
    LCD_RS=0; LCD_RW=0; LCD_EN=0;
    LCD_Delay(20000);

    LCD_Write4(0x30); LCD_Delay(5000);
    LCD_Write4(0x30); LCD_Delay(200);
    LCD_Write4(0x30); LCD_Delay(200);

    LCD_Write4(0x20);
    LCD_Cmd(0x28);
    LCD_Cmd(0x0C);
    LCD_Cmd(0x06);
    LCD_Cmd(0x01);
}

5.4、雨水采样与阈值判断模块(示例接口)

c 复制代码
// 假设使用带ADC的STC或外接ADC,这里仅给出接口
u16 ReadRainADC(void)
{
    // TODO: 替换为真实ADC读取
    return g_rain_val;
}

void RainJudge_Update(void)
{
    g_rain_val = ReadRainADC();

    if(g_rain_val >= g_rain_th)
    {
        if(g_rain_cnt_hi < 255) g_rain_cnt_hi++;
        g_rain_cnt_lo = 0;

        if(g_rain_cnt_hi >= RAIN_TRIG_CNT)
            g_rain_on = 1;
    }
    else
    {
        if(g_rain_cnt_lo < 255) g_rain_cnt_lo++;
        g_rain_cnt_hi = 0;

        if(g_rain_cnt_lo >= RAIN_REL_CNT)
            g_rain_on = 0;
    }
}

5.5、窗户执行机构控制模块(状态机)

c 复制代码
void Motor_Stop(void)
{
    M_A = 0; M_B = 0;
}

void Motor_Open(void)
{
    // 方向定义根据实际接线调整
    M_A = 1; M_B = 0;
}

void Motor_Close(void)
{
    M_A = 0; M_B = 1;
}

void Window_CommandOpen(void)
{
    if(g_win == WIN_OPENED || g_win == WIN_OPENING) return;
    g_win = WIN_OPENING;
    g_win_timer = 0;
    Motor_Open();
}

void Window_CommandClose(void)
{
    if(g_win == WIN_CLOSED || g_win == WIN_CLOSING) return;
    g_win = WIN_CLOSING;
    g_win_timer = 0;
    Motor_Close();
}

void Window_Task(void)
{
    if(g_win == WIN_OPENING)
    {
        // 有限位优先
        if(LIM_OPEN == 0)
        {
            Motor_Stop();
            g_win = WIN_OPENED;
        }
        else if(g_win_timer >= WIN_TIMEOUT_MS)
        {
            Motor_Stop();
            g_win = WIN_FAULT;
            g_alarm = 1;
        }
    }
    else if(g_win == WIN_CLOSING)
    {
        if(LIM_CLOSE == 0)
        {
            Motor_Stop();
            g_win = WIN_CLOSED;
        }
        else if(g_win_timer >= WIN_TIMEOUT_MS)
        {
            Motor_Stop();
            g_win = WIN_FAULT;
            g_alarm = 1;
        }
    }
}

5.6、按键扫描与阈值设置(简化示例)

c 复制代码
u8 Key_ReadRaw(void)
{
    if(KEY_MODE  == 0) return 1;
    if(KEY_OPEN  == 0) return 2;
    if(KEY_CLOSE == 0) return 3;
    if(KEY_SET   == 0) return 4;
    if(KEY_UP    == 0) return 5;
    if(KEY_DN    == 0) return 6;
    return 0;
}

u8 Key_Scan(void)
{
    static u8 last = 0, cnt = 0;
    u8 now = Key_ReadRaw();

    if(now == last)
    {
        if(cnt < 3) cnt++;
    }
    else cnt = 0;

    last = now;

    if(cnt == 3 && now != 0)
    {
        while(Key_ReadRaw() == now);
        return now;
    }
    return 0;
}

bit set_ui = 0;

void Key_Process(void)
{
    u8 k = Key_Scan();
    if(k == 0) return;

    if(!set_ui)
    {
        if(k == 1) // MODE
        {
            g_mode = (g_mode == MODE_AUTO) ? MODE_MANUAL : MODE_AUTO;
        }
        else if(k == 2 && g_mode == MODE_MANUAL) // OPEN
        {
            Window_CommandOpen();
        }
        else if(k == 3 && g_mode == MODE_MANUAL) // CLOSE
        {
            Window_CommandClose();
        }
        else if(k == 4) // SET进入阈值设置
        {
            set_ui = 1;
        }
    }
    else
    {
        // 阈值设置界面:UP/DN调整雨水阈值
        if(k == 5) { if(g_rain_th < RAIN_TH_MAX) g_rain_th += 10; }
        if(k == 6) { if(g_rain_th > RAIN_TH_MIN+10) g_rain_th -= 10; }
        if(k == 4) { set_ui = 0; /* TODO: 保存到EEPROM */ }
    }
}

5.7、自动控制逻辑与报警策略

c 复制代码
void AutoControl_Task(void)
{
    if(g_mode != MODE_AUTO) return;

    // 下雨且窗未关闭 -> 自动关窗
    if(g_rain_on)
    {
        if(g_win != WIN_CLOSED && g_win != WIN_CLOSING)
        {
            Window_CommandClose();
        }
    }
}

void Alarm_Task(void)
{
    if(g_alarm)
    {
        // 简化:报警时蜂鸣器闪烁
        BEEP = (ms_tick % 200 < 100) ? 1 : 0;
    }
    else
    {
        BEEP = 0;
    }
}

5.8、LCD显示刷新模块

c 复制代码
char line1[17];
char line2[17];

void LCD_Refresh(void)
{
    // 第一行:温湿度
    // T:25C H:60%
    sprintf(line1, "T:%2dC H:%2d%% ", (int)g_temp, (int)g_humi);

    // 第二行:雨水值/阈值 + 模式 + 报警
    // R:320 TH:500 A
    sprintf(line2, "R:%3u TH:%3u %c", g_rain_val, g_rain_th, (g_mode==MODE_AUTO)?'A':'M');

    if(g_alarm)
        line2[15] = '!';

    LCD_Str(0,0,line1);
    LCD_Str(1,0,line2);
}

5.9、主程序框架

c 复制代码
void System_Init(void)
{
    g_mode = MODE_AUTO;
    g_rain_th = 500;
    g_alarm = 0;

    Motor_Stop();
    LCD_Init();
    Timer0_Init_1ms();

    LCD_Str(0,0,"Smart Window   ");
    LCD_Str(1,0,"Init...        ");
}

void main(void)
{
    System_Init();

    while(1)
    {
        if(flag_10ms)
        {
            flag_10ms = 0;
            Key_Process();
            Window_Task();
            Alarm_Task();
        }

        if(flag_1000ms)
        {
            flag_1000ms = 0;
            RainJudge_Update();
            // TODO: 读取温湿度传感器
            AutoControl_Task();
        }

        if(flag_200ms)
        {
            flag_200ms = 0;
            LCD_Refresh();
        }
    }
}

6、系统可靠性与工程优化要点

6.1、雨水误判与阈值策略优化

雨滴传感器可能受到尘土、潮湿空气、喷雾等影响出现误判。优化策略包括:

  • 采用连续判定与滞回机制(本设计已使用)
  • 雨水阈值根据温湿度动态修正(湿度极高时提高阈值)
  • 结合气压或光照传感器进一步增强判定(扩展)
  • 在检测到下雨后可延迟数秒关窗,避免短暂水滴误动作

6.2、电机干扰对采样与液晶的影响

电机启动会带来电磁干扰,常见表现为:

  • LCD乱码或闪烁
  • 传感器采样跳变
  • 单片机复位或死机

解决方法:

  • 电机供电与控制供电分离或增加大电容滤波
  • 电机两端并联电容(0.1uF)或RC吸收抑制火花
  • 驱动端加入续流二极管/TVS
  • 单片机电源入口加LC滤波
  • PCB布局上将电机电流回路与信号回路分区,采用单点接地

6.3、执行机构到位检测与卡滞保护

仅用时间控制存在误差,加入限位开关能显著提升安全性:

  • 到位立即停止,避免冲击
  • 防止电机过载
  • 可判断窗户状态(已开/已关)

卡滞保护可进一步增强:

  • 通过采样电机电流判断堵转(扩展)
  • 发现堵转立即停机并报警

6.4、参数掉电保存与一致性维护

阈值与模式建议掉电保存:

  • 阈值存储到EEPROM/IAP
  • 上电读取恢复
  • 写入时采用校验字节防止存储错误
    例如存储结构:
  • TH高字节\]\[TH低字节\]\[校验\]\[标志

这样可避免参数丢失导致系统行为变化。

6.5、报警分级与人机交互体验提升

报警建议分级显示:

  • ALM:RAIN(雨水触发)
  • ALM:MOTOR(电机超时)
  • ALM:SENSOR(传感器故障)

并通过不同蜂鸣器节奏区分,提高可维护性。可增加按键"消音"功能,避免报警持续鸣叫影响生活体验,同时在屏幕上保持报警标志直到故障解除。


7、总结

基于52系列单片机的智能家居智能雨水自动关窗控制系统,围绕家庭防雨安全与舒适性需求,采用雨水/湿度传感器实现雨水自动检测,结合温湿度综合监测提升判定可靠性,能够在自动模式下当雨水达到设定阈值时自动驱动窗户关闭,有效防止雨水侵入。系统支持手动与自动模式切换,满足不同使用场景;配备报警功能,当环境参数异常或执行机构故障时及时提醒用户;提供阈值调节按键,使用户可灵活调整雨水阈值等控制参数;使用LM016L液晶显示屏实时显示温湿度、雨水检测值、阈值、工作模式、窗户状态与报警信息,使系统操作直观、易用。

在电路设计方面,系统以单片机最小系统为核心,配合传感器采样电路、执行机构驱动电路、按键输入、液晶显示及报警模块,形成完整的智能控制硬件架构;在程序设计方面,系统采用模块化与状态机思想,结合定时任务调度,实现稳定的采集、判断、控制、显示与报警逻辑。该系统具备较强的工程实用性与扩展能力,可进一步加入无线通信、远程控制、语音联动、场景模式等功能,升级为更加完善的智能家居窗户自动化控制终端。

相关推荐
Smart-佀2 小时前
涨薪秘技:智能家居中的BLE协议与实现
网络·arm开发·嵌入式硬件·microsoft
2301_811274312 小时前
基于SpringBoot的智能家居管理系统
spring boot·后端·智能家居
毕设源码_古学姐2 小时前
计算机毕业设计springboot智能家居项目管理系统 基于SpringBoot的智能家居项目管理平台设计与实现 SpringBoot技术驱动的智能家居项目管理系统开发
spring boot·智能家居·课程设计
theta2 小时前
智能家居聚合商鲁棒优化
智能家居·鲁棒优化·储能系统·电池老化·日前市场
毕设源码-张学姐2 小时前
计算机毕业设计springboot智能家居设备信息管理系统 基于SpringBoot的智能家居设备全生命周期管理平台 面向智慧家庭的SpringBoot设备资产与场景运营系统
spring boot·智能家居·课程设计
freeinlife'3 小时前
onenet云平台下发数据到单片机并且OLED屏显示
单片机·嵌入式硬件
硅农深芯4 小时前
为什么有的芯片电源pin叫VCC,有的叫VDD?
单片机·嵌入式硬件·vcc·vdd·vee·vss
d111111111d5 小时前
STM32-UART封装问题解析
笔记·stm32·单片机·嵌入式硬件·学习·算法
国产化创客6 小时前
龙芯 2K0300-- 实现工业网关监控仪表盘项目
嵌入式硬件·物联网·数据可视化