1. 系统功能概述

本设计基于STM32F103C8T6单片机,构建了一个多功能智能风扇控制系统,结合ASRPRO语音识别模块、温度传感器、HC-SR501人体感应模块、LCD1602液晶显示、蜂鸣器、风扇电路、按键等外设,支持手动控制、自动调节和语音控制三种模式,具备定时控制、温度报警等功能,适合在智能家居等场景下应用。


2. 电路设计

2.1 主控模块:STM32F103C8T6

STM32F103C8T6是本系统的核心控制器,负责对各类传感器数据的采集处理、风扇控制、语音识别指令处理、LCD显示驱动及定时管理。其具有丰富的GPIO、ADC、USART和定时器资源,能够满足本项目各项功能需求。

2.2 温度检测模块:DS18B20数字温度传感器

DS18B20负责实时采集环境温度数据,通过单总线通信方式与STM32连接。其测量精度可达±0.5℃,输出数字信号,便于处理。

2.3 人体感应模块:HC-SR501

该模块用于检测人体活动,当有人进入其感应范围时,会输出高电平信号,提示STM32有人存在。该功能是自动模式和手动模式下风扇启停的重要依据。

2.4 语音识别模块:ASRPRO

ASRPRO是语音识别模块,用于识别如“开风扇”“关闭风扇”“一档”“二档”等关键词,并将识别结果通过串口方式发送至STM32,实现风扇的语音控制。

2.5 显示模块:LCD1602

LCD1602负责实时显示当前温度、风扇档位、工作模式(手动、自动、语音)及定时时间等信息,使用户能够直观了解当前系统状态。

2.6 控制按键模块

按键模块用于实现模式切换、档位控制及定时功能的输入,包含多个功能按键,如模式切换键、定时键、一档/二档/三档调速键等。

2.7 风扇驱动模块

风扇驱动模块根据STM32输出的PWM或控制信号,实现三档调速。采用三组继电器或MOS管分别控制不同电压或占空比,调整风速。

2.8 蜂鸣器模块

当温度超过40℃或定时结束时,通过控制蜂鸣器发出报警提示,增强系统的安全性与交互性。


3. 程序设计

3.1 主程序设计

主程序初始化所有外设模块,包括GPIO、USART、定时器、LCD、DS18B20等,然后进入主循环,根据当前模式进行不同的操作处理。

int main(void) {
    SystemInit();
    LCD_Init();
    DS18B20_Init();
    UART_Init();
    HC_SR501_Init();
    Buttons_Init();
    Buzzer_Init();
    Fan_Init();
    ASRPRO_Init();

    while (1) {
        Mode_Check();       // 检查模式切换
        Temp_Read();        // 读取温度
        People_Check();     // 检测是否有人
        Timer_Check();      // 检查定时状态
        Fan_Control();      // 控制风扇
        LCD_Display();      // 显示当前状态
    }
}

3.2 模式控制逻辑

通过按键或语音控制选择手动、自动或语音模式,并设置相应标志,供主循环调用。

void Mode_Check() {
    if (key_mode_pressed) {
        mode++;
        if (mode > 2) mode = 0; // 0:手动 1:自动 2:语音
    }

    if (mode == 2 && asr_flag) {
        Process_ASR_Command(asr_cmd);
    }
}

3.3 温度采集程序

读取DS18B20的温度值,并将结果保存在全局变量中,供其他模块使用。

void Temp_Read() {
    temperature = DS18B20_GetTemp();
}

3.4 人体感应判断

根据HC-SR501模块输入判断当前环境是否有人,为手动与自动模式下的风扇启停提供依据。

void People_Check() {
    people_exist = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0); // HC-SR501输入
}

3.5 风扇控制逻辑

在不同模式下根据不同条件控制风扇的启停和档位:

void Fan_Control() {
    if (!people_exist) {
        Fan_Stop();
        return;
    }

    if (mode == 0) { // 手动模式
        Fan_SetSpeed(manual_level);
    } else if (mode == 1) { // 自动模式
        if (temperature > 40) {
            Buzzer_On();
            Fan_Stop();
        } else if (temperature > 30) {
            Fan_SetSpeed(3);
        } else if (temperature > 25) {
            Fan_SetSpeed(2);
        } else if (temperature > 20) {
            Fan_SetSpeed(1);
        } else {
            Fan_Stop();
        }
    }
}

3.6 语音识别处理程序

接收ASRPRO模块的串口数据,根据语音命令控制风扇。

void Process_ASR_Command(uint8_t cmd) {
    switch(cmd) {
        case CMD_ON:
            Fan_SetSpeed(1);
            break;
        case CMD_OFF:
            Fan_Stop();
            break;
        case CMD_SPEED1:
            Fan_SetSpeed(1);
            break;
        case CMD_SPEED2:
            Fan_SetSpeed(2);
            break;
        case CMD_SPEED3:
            Fan_SetSpeed(3);
            break;
    }
}

3.7 定时功能实现

按下“定时”键后,设置一个定时值(如60秒),启动定时器,到时关闭风扇。

void Timer_Check() {
    if (key_timer_pressed) {
        timer_cnt = 60;
        timer_enable = 1;
    }

    if (timer_enable) {
        if (--timer_cnt == 0) {
            Fan_Stop();
            Buzzer_On();
            timer_enable = 0;
        }
    }
}

3.8 LCD1602显示程序

LCD屏幕循环显示当前温度、工作模式、档位、定时剩余时间等信息。

void LCD_Display() {
    LCD_Clear();
    LCD_ShowString(0, 0, "T:");
    LCD_ShowNum(2, 0, temperature, 2);
    
    LCD_ShowString(0, 1, "M:");
    if (mode == 0) LCD_ShowString(2, 1, "Manual");
    else if (mode == 1) LCD_ShowString(2, 1, "Auto");
    else LCD_ShowString(2, 1, "Voice");

    LCD_ShowString(9, 1, "S:");
    LCD_ShowNum(11, 1, fan_speed, 1);
}

4. 总结

本系统通过STM32F103C8T6单片机将多种传感器与控制模块有机集成,实现了多模式智能控制风扇的功能。设计具备自动调速、语音识别、定时控制等特点,体现出良好的人机交互性与智能控制能力,具备良好的实用性与推广价值。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐