基于 STM32 的智能电蚊香控制系统

基于 STM32 的智能电蚊香控制系统:从光感联动到防干烧的完整方案

一、写在前面:为什么做这个系统

传统电蚊香器最大的问题不是"驱蚊效果",而是"液体干了还在加热"------既浪费电又可能烧设备。把光敏电阻和液位传感器接入 STM32,再让继电器和蜂鸣器配合 OLED 显示,整套"看得见光强、测得到液位、防得了空烧"的小系统就能把电蚊香升级成一款真正"会自己照顾自己"的设备。

本文给出基于 STM32F103C8T6 的智能型液体电蚊香控制系统完整方案:GL5528 光敏电阻实时感知环境光强、SR-01 电阻式水位传感器精准检测液体剩余量、继电器自动控制电蚊香启停、OLED12864 实时显示参数、蜂鸣器液位报警、按键实现阈值与手动控制。整套系统围绕"光感联动+液位防烧+人机交互"三条主线展开,适合家用卧室、儿童房等场景落地。

二、系统功能总览

功能模块 实现方式 用途
光强检测 GL5528 光敏电阻 + ADC 检测环境光照强度
液位检测 SR-01 电阻式水位传感器 + ADC 检测电蚊香液体剩余量
自动启停 继电器 + STM32 控制 光暗自动开/光强自动停
防干烧保护 液位阈值判断 液位 0 自动断电
液位提醒 蜂鸣器 三声短促报警
本地显示 OLED12864(I2C) 光强+液位+开关状态
阈值调节 按键 用户自定义光强/液位阈值
手动控制 按键 强制开/关电蚊香

三、关键器件选型

3.1 主控芯片:STM32F103C8T6

主频 72MHz,64KB Flash、20KB SRAM,多个 USART、I2C、SPI、ADC 资源,足够覆盖光强采集、液位采集、OLED 显示、按键扫描、继电器控制全部逻辑。

3.2 光敏电阻:GL5528

硫化镉光敏元件,电阻随光照强度变化;与 10kΩ 固定电阻分压,输出电压送入 STM32 ADC,可实现 0-100% 量化光强。

3.3 液位传感器:SR-01 电阻式水位传感器

电极式设计,液位升降时液体接触电极的数量变化引起电阻值变化;输出模拟电压送入 ADC,转换为液位高度值。

3.4 显示模块:OLED12864

128×64 单色 OLED,I2C 接口,SSD1306 控制器,自发光高对比度,强光下也能清晰显示光强、液位与开关状态。

3.5 继电器

5V 线圈,单刀双掷,COM/NO 接电蚊香加热器电源回路,STM32 控制信号经三极管驱动继电器线圈,触点吸合接通加热器电源。

3.6 蜂鸣器

有源蜂鸣器,STM32 输出低电平经三极管驱动发声,用于液位提醒与防干烧报警。

四、系统硬件接线总表

模块 引脚 STM32 端 备注
GL5528 分压输出 PA0(ADC1_IN0) 模拟输入
SR-01 液位 信号/VCC/GND PA1/5V/GND ADC1_IN1
OLED12864 VCC/GND/SCL/SDA 3.3V/GND/PB8/PB9 I2C1
继电器 IN/VCC/GND PB0/5V/GND NPN 驱动
蜂鸣器 I/O PB1 NPN 驱动
LED 状态 I/O PB2 高电平点亮
按键 K1 I/O PB10 阈值模式切换
按键 K2 I/O PB11 阈值+/手动开
按键 K3 I/O PB12 阈值-/手动关

五、软件设计

5.1 主程序流程

复制代码
int main(void)
{
    SystemInit();
    GPIO_Init();
    ADC1_Init();
    OLED_Init();
    Key_Init();
    Beep_Init();
    Relay_Init();
    Load_Threshold_From_Flash();
    
    while (1)
    {
        // 1. 数据采集
        light_adc    = ADC_Read_Average(ADC_Channel_0, 20);
        liquid_adc   = ADC_Read_Average(ADC_Channel_1, 20);
        light_value  = Light_ADC_To_Percent(light_adc);
        liquid_value = Liquid_ADC_To_Height(liquid_adc);
        
        // 2. OLED 显示
        OLED_ShowStatus(light_value, liquid_value, relay_state);
        
        // 3. 自动控制逻辑(手动模式优先)
        if (work_mode == MANUAL)
        {
            // 手动模式由按键直接控制 relay_state
        }
        else
        {
            if (light_value < light_threshold && liquid_value > 0)
            {
                relay_state = ON;
            }
            else
            {
                relay_state = OFF;
            }
        }
        
        // 4. 防干烧保护(最高优先级)
        if (liquid_value <= 0)
        {
            relay_state = OFF;
            Beep_Continuous_2S();      // 持续响 2 秒
        }
        else if (liquid_value < liquid_warn_threshold)
        {
            Beep_Three_Beep();          // 三声短促提醒
        }
        
        // 5. 执行继电器
        Relay_Write(relay_state);
        
        // 6. 按键处理
        Key_Scan();
        
        Delay_Ms(100);
    }
}

5.2 光强 ADC 转换

复制代码
uint8_t Light_ADC_To_Percent(uint16_t adc)
{
    // 强光下光敏电阻变小 → ADC 读数变大
    // 暗光下光敏电阻变大 → ADC 读数变小
    if (adc >= 4000) return 100;
    return (uint8_t)((uint32_t)adc * 100 / 4095);
}

5.3 液位 ADC 转换

复制代码
uint8_t Liquid_ADC_To_Height(uint16_t adc)
{
    // SR-01 输出与液位成正比,量程按 0-30mm
    if (adc <= 100) return 0;
    return (uint8_t)((uint32_t)adc * 30 / 4095);
}

5.4 蜂鸣器报警

复制代码
void Beep_Three_Beep(void)
{
    for (uint8_t i = 0; i < 3; i++)
    {
        Beep_On();  Delay_Ms(80);
        Beep_Off(); Delay_Ms(80);
    }
}

void Beep_Continuous_2S(void)
{
    Beep_On();  Delay_Ms(2000);
    Beep_Off();
}

5.5 阈值持久化

复制代码
typedef struct {
    uint8_t  light_threshold;     // 默认 30(百分比)
    uint8_t  liquid_warn;         // 默认 5mm
    uint8_t  work_mode;           // 0=自动 1=手动
    uint8_t  manual_state;        // 手动模式下继电器状态
} SysConfig;

SysConfig g_cfg = { 30, 5, 0, 0 };

void Save_Config(void)
{
    FLASH_Unlock();
    FLASH_ErasePage(ADDR_CFG);
    FLASH_ProgramWord(ADDR_CFG, *(uint32_t*)&g_cfg);
    FLASH_Lock();
}

六、系统测试

6.1 光强检测测试

用手电筒在不同亮度下照射 GL5528,OLED 显示的光强百分比与照度计测量值变化趋势一致,0%-100% 全段对应关系平滑无跳变。

6.2 液位检测测试

把 SR-01 探头浸入水中,液位从 0mm 缓慢上升到 30mm,每隔 5mm 记录一次 ADC 值。测试结果显示 ADC 值与液位高度呈良好线性关系,误差 ≤1mm。

6.3 自动启停测试

把光敏电阻用遮光罩盖住(模拟夜晚),系统自动开启电蚊香;移开遮光罩后电蚊香自动关闭。切换时间 ≤1s。

6.4 防干烧测试

把 SR-01 探头露出水面,模拟液位耗尽。系统在 1s 内关闭继电器,蜂鸣器持续响 2 秒,OLED 显示"液位 0,请加液"。

6.5 液位提醒测试

液位缓慢下降到警告阈值(默认 5mm)以下,蜂鸣器发出三声短促报警,提示用户加液;液位恢复到正常阈值后报警停止。

6.6 阈值调节测试

按 K1 进入阈值设置模式,K2/K3 分别加减阈值,OLED 实时显示当前阈值;按 K1 确认后阈值保存到 Flash,重新上电后保持。

6.7 整机长时间测试

系统连续运行 72h,模拟光照与液位变化的多种组合,所有控制动作均准确触发,蜂鸣器报警与继电器联动稳定无异常。

八、总结

本文以 STM32F103C8T6 为主控,结合 GL5528 光敏电阻、SR-01 电阻式液位传感器、OLED12864 显示、继电器、蜂鸣器和按键输入,给出了一套覆盖"光感联动+液位防烧+人机交互"三条主线的智能型液体电蚊香控制系统完整方案。系统通过 GL5528 实时感知环境光强,在光线暗时自动开启电蚊香、光线强时自动关闭;通过 SR-01 精准检测液体剩余量,液位低时蜂鸣器提醒、液位 0 时自动断电防干烧;通过 OLED12864 实时显示光强、液位与开关状态,按键支持阈值调节和手动控制。整套系统在硬件选型上注重成本控制,软件结构上保持模块化和可扩展,是家用卧室、儿童房等小型蚊虫防护场景的理想方案。后续可在现有基础上接入 Wi-Fi 模块(ESP8266)实现 APP 远程监控、加入定时开关功能、扩展温湿度联动等,进一步提升产品的智能化和场景适配度。

九、资料内容完整工程资料(原理图、PCB、代码、元件清单)

十、资料获取方式

相关推荐
zhangrelay2 小时前
Arduino-MEGA-ESP单片机理论课笔记-01入门-02硬件-03开发环境-2026
笔记·单片机·嵌入式硬件·学习·机器人
AlanAshley3 小时前
手机与电脑的屏幕计时器熄屏区别及协议栈
单片机·智能手机·电脑
AlanAshley3 小时前
电脑烧屏的软件与硬件原因全解析
单片机·嵌入式硬件·电脑
ScilogyHunter4 小时前
Hercules系列安全MCU功能安全原理详解
java·单片机·安全·hercules
szxinmai主板定制专家4 小时前
AMR 项目落地:机器人控制器硬件定制化需求复盘
arm开发·单片机·fpga开发·系统架构·机器人·am62x
笨笨饿4 小时前
#60_# 一、Photoshop 2025 如何批量导出 PSD 文件中的所有图层为独立 PNG 图片
stm32·单片机·嵌入式硬件·物联网·ui·51单片机·photoshop
碧海银沙音频科技研究院13 小时前
基于炬芯ATS308X 设计的上位机usb 串口音乐EQ调节工具
stm32·单片机·嵌入式硬件
三佛科技-1341638421216 小时前
过认证72W碳化硅方案(12V6A)主控HN1562+HN36228V 典型应用电路、变压器参数分享
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
Zwawa18 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式