基于STM32单片机设计的智能空气加湿器

举报
DS小龙哥 发表于 2024/12/25 15:40:00 2024/12/25
【摘要】 本项目基于STM32单片机,设计了一款智能空气加湿器。通过集成温湿度传感器、水位传感器、继电器控制、蜂鸣器警报、按键控制等硬件模块,实现空气加湿器的自动调节和手动控制功能。此外,系统支持通过MQTT协议将数据上传到华为云物联网平台,以便进行数据存储和历史数据分析,方便用户进行远程监控和控制。

 

目录

  1. 1. 项目开发背景
  2. 2. 设计实现的功能
  3. 3. 项目硬件模块组成
  4. 4. 设计思路
  5. 5. 系统功能总结
  6. 6. 使用的模块的技术详情介绍
  7. 7. 系统工作原理与流程图
  8. 8. 系统软件设计
  9. 9. 测试与调试
  10. 10. 总结与展望

1. 项目开发背景

随着现代科技的迅速发展,智能家居逐渐进入人们的生活。在智能家居中,空气质量调节设备尤为重要,尤其是在气候干燥的季节,空气加湿器的需求显得尤为突出。传统的空气加湿器虽然能有效提高空气湿度,但通常依赖用户手动调节,并且缺乏智能化控制,容易造成水位过低或过高、湿度不均等问题。因此,设计一个具有智能控制功能的空气加湿器显得尤为重要。

本项目基于STM32单片机,设计了一款智能空气加湿器。通过集成温湿度传感器、水位传感器、继电器控制、蜂鸣器警报、按键控制等硬件模块,实现空气加湿器的自动调节和手动控制功能。此外,系统支持通过MQTT协议将数据上传到华为云物联网平台,以便进行数据存储和历史数据分析,方便用户进行远程监控和控制。

2. 设计实现的功能

本智能空气加湿器系统主要实现以下功能:

  1. 1. 继电器控制:通过继电器控制加湿器的启停。
  2. 2. 手动控制:用户通过按键手动控制加湿器的开启和停止。
  3. 3. 智能加湿:系统根据环境湿度自动调节加湿器的工作状态,当湿度低于设定阈值时加湿器自动加湿,当湿度超过阈值时自动停止加湿。
  4. 4. 水位监测:使用水位传感器实时监测加湿器的水量,确保水位充足时加湿器才能正常工作,避免干烧。
  5. 5. 蜂鸣器警报:当检测到水位过低时,系统启动蜂鸣器报警,提醒用户加水。
  6. 6. 按键控制:用户可以通过三个按键进行智能模式与手动模式的切换、湿度阈值的设定及调节。
  7. 7. OLED显示屏:实时显示环境湿度、温度、加湿器状态、水位、湿度阈值等信息。
  8. 8. 数据上传:通过WiFi和MQTT协议将设备数据上传到华为云物联网平台,支持远程数据查看和分析。
  9. 9. 云端服务:后端服务器使用Python开发,接收并处理来自华为云物联网平台的数据,提供前端可视化页面,实现对加湿器的远程控制。

3. 项目硬件模块组成

本智能空气加湿器系统包含以下主要硬件模块:

  1. 1. STM32单片机:主控芯片,负责系统的控制逻辑和数据处理。
  2. 2. DHT11温湿度传感器:用于实时采集环境温度和湿度数据。
  3. 3. 水位传感器:实时监测加湿器内的水位,防止水位过低或过高。
  4. 4. 继电器模块:控制加湿器电源的开关。
  5. 5. 蜂鸣器模块:当检测到水位过低时,启动蜂鸣器报警。
  6. 6. 按键模块:用于模式切换、湿度阈值设置等控制功能。
  7. 7. OLED显示屏:显示当前的环境数据和加湿器状态。
  8. 8. WiFi模块(ESP8266):实现WiFi连接,支持MQTT协议与华为云物联网平台进行数据通信。
  9. 9. 华为云物联网平台:用于存储和管理设备上传的数据,并提供远程控制接口。

4. 设计思路

本项目的设计思路基于STM32单片机为核心,通过外围传感器、继电器、WiFi模块等硬件的配合实现智能控制。整体设计分为硬件部分和软件部分,硬件部分负责感知环境和控制加湿器,软件部分负责数据处理、状态控制和数据上传。

  1. 1. 环境数据采集:通过DHT11温湿度传感器定期采集环境湿度和温度,并根据用户设定的湿度阈值决定加湿器的启停。
  2. 2. 水位监控:水位传感器负责实时监控加湿器的水量,若水位过低,停止加湿器并启动蜂鸣器警报。
  3. 3. 用户控制:用户可以通过按键进行手动控制,选择智能模式或手动模式,并设置湿度阈值。
  4. 4. 数据上传与远程控制:系统将采集到的环境数据通过WiFi上传至华为云物联网平台,用户可以通过PC或手机浏览器访问网页,实现远程监控和控制。

5. 系统功能总结

功能模块 说明
继电器控制 通过继电器控制加湿器的启停。
手动控制 通过按键控制加湿器的加湿或停止加湿。
智能加湿 根据环境湿度自动调节加湿器的工作状态。
水位监测 实时监测水位,避免水位过低时加湿器干烧。
蜂鸣器警报 当水位过低时,蜂鸣器发出警报提示用户加水。
按键控制 通过按键切换智能模式和手动模式,设置湿度阈值。
OLED显示 显示环境温湿度、加湿器状态、水位等信息。
数据上传 通过WiFi和MQTT协议将数据上传至华为云物联网平台。
云端服务 提供后端服务器和前端网页进行远程控制和数据可视化。

6. 使用的模块的技术详情介绍

STM32单片机

STM32F103系列单片机是基于ARM Cortex-M3核心的高性能32位微控制器,适合用于嵌入式系统开发。其丰富的外设接口和高效的处理能力使得本项目得以高效地控制各个硬件模块。

DHT11温湿度传感器

DHT11是一款常用的数字温湿度传感器,具有低功耗、简单的单总线接口等特点。它可以通过单片机的GPIO端口与STM32进行通信,输出温度和湿度的数字信号。

水位传感器

水位传感器采用电容式或电阻式感应原理,通过检测水的电导率或电容值变化,实时监测加湿器水位。该模块可通过模拟量或数字量接口与STM32连接。

继电器模块

继电器模块用于控制加湿器的电源开关。STM32通过控制继电器的开关状态,进而控制加湿器的工作状态。

OLED显示屏

OLED显示屏用于实时显示环境数据和加湿器状态。由于其高对比度、低功耗的特点,适用于本项目中作为实时数据显示模块。

蜂鸣器模块

蜂鸣器用于发出声音警报,提醒用户加水。当水位传感器检测到水位过低时,STM32会驱动蜂鸣器发出警报声音。

WiFi模块(ESP8266)

ESP8266是一款低功耗WiFi模块,能够实现WiFi连接和MQTT通信。它将STM32采集到的环境数据上传至华为云物联网平台,同时接收云平台的控制指令,完成远程控制功能。

华为云物联网平台

华为云物联网平台提供设备管理、数据存储、数据分析、远程控制等功能。设备通过MQTT协议将数据上传至平台,平台提供API接口以便与本地服务器进行数据交互。

7. 系统工作原理

工作原理:

  1. 1. 系统开机后,STM32开始采集DHT11传感器的温湿度数据。
  2. 2. 当湿度低于预设阈值时,继电器控制加湿器启动,开始加湿。
  3. 3. 水位传感器监测水量,当水位低于安全阈值时,蜂鸣器报警,并停止加湿器工作。
  4. 4. 用户可以通过按键手动控制加湿器的开关,或者切换至智能模式。
  5. 5. 所有数据通过WiFi模块上传至华为云物联网平台,用户可以通过PC或手机浏览器查看实时数据和历史记录,远程控制加湿器。

8. 系统软件设计

主控程序设计

使用STM32的HAL库进行开发,程序的主要流程如下:

  1. 1. 初始化硬件:初始化DHT11传感器、继电器、水位传感器、OLED显示屏、蜂鸣器和WiFi模块。
  2. 2. 读取传感器数据:定期读取温湿度数据,并实时监控水位。
  3. 3. 控制加湿器:根据湿度值和水位,控制加湿器的启停。
  4. 4. 上传数据:通过WiFi模块将数据上传到华为云物联网平台。

按键控制与显示

通过按键实现用户交互,按键的响应与OLED显示屏结合,允许用户进行湿度值设置和模式切换。

9. 测试与调试

在开发过程中,系统通过模拟各种环境条件进行调试,包括湿度、温度、水位变化等。测试时重点验证:

  1. 1. 湿度传感器的准确性与响应速度。
  2. 2. 水位传感器的稳定性。
  3. 3. 加湿器控制逻辑是否准确。
  4. 4. 数据上传至华为云物联网平台的稳定性。

10. 总结

本项目成功设计并实现了一个基于STM32的智能空气加湿器系统,具备智能加湿、手动控制、水位监测、远程数据管理等功能。未来可以通过进一步优化算法和硬件,提升系统的稳定性和智能化水平。例如,加入自动调节湿度阈值功能、扩展更多远程控制接口等。

11. STM32代码设计

以下是基于STM32单片机设计的智能空气加湿器的main.c代码示例。包括DHT11传感器、继电器、水位传感器、蜂鸣器、OLED显示屏、WiFi模块等。此代码主要集中在系统初始化、传感器数据读取、加湿器控制逻辑、按键控制、数据上传及OLED显示等核心功能。

#include "stm32f1xx_hal.h"
#include "dht11.h"           // DHT11温湿度传感器头文件
#include "oled.h"             // OLED显示头文件
#include "relay.h"            // 继电器控制头文件
#include "water_level.h"      // 水位传感器头文件
#include "buzzer.h"           // 蜂鸣器头文件
#include "wifi.h"             // WiFi模块头文件
#include "mqtt.h"             // MQTT通信头文件

// 系统定时器,用于定期任务
#define SYSTEM_TICK_PERIOD 1000 // 1秒更新一次

// 湿度阈值(可以根据需要设定默认值)
uint8_t humidity_threshold = 50; // 默认湿度阈值为50%
uint8_t current_humidity = 0;    // 当前湿度
uint8_t current_temperature = 0; // 当前温度

// 水位标志
uint8_t water_level_ok = 1; // 0:水位低,1:水位正常

// 当前模式
typedef enum {
    MODE_AUTO = 0, // 自动模式
    MODE_MANUAL    // 手动模式
} SystemMode;

SystemMode current_mode = MODE_AUTO;

// 控制加湿器状态
typedef enum {
    HUMIDIFIER_OFF = 0,
    HUMIDIFIER_ON
} HumidifierStatus;

HumidifierStatus humidifier_status = HUMIDIFIER_OFF;

// 函数声明
void SystemClock_Config(void);
void GPIO_Init(void);
void Timer_Init(void);
void Read_Sensors(void);
void Control_Humidifier(void);
void Display_Data(void);
void Button_Handler(void);
void Upload_Data(void);

int main(void)
{
    // HAL库初始化
    HAL_Init();
    
    // 配置系统时钟
    SystemClock_Config();
    
    // 初始化GPIO(继电器控制、按键输入等)
    GPIO_Init();
    
    // 初始化OLED显示
    OLED_Init();
    
    // 初始化WiFi模块
    WiFi_Init();
    
    // 初始化MQTT通信
    MQTT_Init();
    
    // 初始化水位传感器、蜂鸣器等外设
    WaterLevel_Init();
    Buzzer_Init();
    
    // 启动定时器(定时更新环境数据和控制逻辑)
    Timer_Init();
    
    while (1)
    {
        // 定时读取传感器数据
        if (HAL_GetTick() % SYSTEM_TICK_PERIOD == 0) 
        {
            // 读取传感器数据
            Read_Sensors();
            
            // 根据模式控制加湿器
            Control_Humidifier();
            
            // 显示当前状态
            Display_Data();
            
            // 上传数据至云平台
            Upload_Data();
        }

        // 按键操作处理
        Button_Handler();
    }
}

// 初始化系统时钟
void SystemClock_Config(void)
{
    // 使用默认的系统时钟配置
    // STM32F1系列芯片通常使用HSE(外部晶振)作为时钟源
    // 可以根据实际硬件配置进行修改
}

// 初始化GPIO
void GPIO_Init(void)
{
    // 初始化继电器控制引脚、按键输入引脚等
    // 这里以假设继电器控制引脚为GPIO_PIN_0,按键为GPIO_PIN_1, GPIO_PIN_2等为例
    __HAL_RCC_GPIOC_CLK_ENABLE();
    
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 继电器控制引脚配置为输出
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    
    // 按键输入引脚配置
    GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}



// 读取传感器数据(温湿度和水位)
void Read_Sensors(void)
{
    // 读取DHT11温湿度传感器
    current_humidity = DHT11_Read_Humidity();
    current_temperature = DHT11_Read_Temperature();
    
    // 读取水位传感器
    water_level_ok = WaterLevel_Check(); // 返回1表示水位正常,0表示水位低
}

// 控制加湿器
void Control_Humidifier(void)
{
    if (water_level_ok == 0) 
    {
        // 水位过低,停止加湿器并启动蜂鸣器警报
        humidifier_status = HUMIDIFIER_OFF;
        Relay_Control(HUMIDIFIER_OFF); // 控制继电器关闭加湿器
        Buzzer_Alert(); // 水位低时蜂鸣器响
    }
    else 
    {
        // 根据模式控制加湿器
        if (current_mode == MODE_AUTO) 
        {
            // 自动模式,根据湿度阈值控制
            if (current_humidity < humidity_threshold) 
            {
                humidifier_status = HUMIDIFIER_ON;
                Relay_Control(HUMIDIFIER_ON); // 开启加湿器
            } 
            else 
            {
                humidifier_status = HUMIDIFIER_OFF;
                Relay_Control(HUMIDIFIER_OFF); // 关闭加湿器
            }
        } 
        else if (current_mode == MODE_MANUAL) 
        {
            // 手动模式,根据按键控制
            // 这里假设按键1为开启,按键2为关闭
            if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_1) == GPIO_PIN_SET) 
            {
                humidifier_status = HUMIDIFIER_ON;
                Relay_Control(HUMIDIFIER_ON); // 开启加湿器
            } 
            else if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2) == GPIO_PIN_SET) 
            {
                humidifier_status = HUMIDIFIER_OFF;
                Relay_Control(HUMIDIFIER_OFF); // 关闭加湿器
            }
        }
    }
}

// 显示数据到OLED屏
void Display_Data(void)
{
    OLED_Clear();
    OLED_Printf("Temp: %d C", current_temperature);
    OLED_Printf("Humidity: %d%%", current_humidity);
    OLED_Printf("Mode: %s", (current_mode == MODE_AUTO) ? "Auto" : "Manual");
    OLED_Printf("Water: %s", (water_level_ok) ? "OK" : "Low");
    OLED_Printf("Humidifier: %s", (humidifier_status == HUMIDIFIER_ON) ? "ON" : "OFF");
}

// 按键控制
void Button_Handler(void)
{
    // 假设按键1为切换模式,按键2为湿度+,按键3为湿度-
    if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_1) == GPIO_PIN_SET) 
    {
        // 切换模式
        current_mode = (current_mode == MODE_AUTO) ? MODE_MANUAL : MODE_AUTO;
        HAL_Delay(200); // 防止按键抖动
    }

    if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2) == GPIO_PIN_SET) 
    {
        // 增加湿度阈值
        humidity_threshold += 5;
        if (humidity_threshold > 100) 
        {
            humidity_threshold = 100; // 最大阈值100%
        }
        HAL_Delay(200);
    }

    if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_3) == GPIO_PIN_SET) 
    {
        // 减少湿度阈值
        humidity_threshold -= 5;
        if (humidity_threshold < 0) 
        {
            humidity_threshold = 0; // 最小阈值0%
        }
        HAL_Delay(200);
    }
}

// 数据上传到云平台
void Upload_Data(void)
{
    // 将温湿度和加湿器状态上传到华为云物联网平台
    MQTT_Publish("humidity_data", current_humidity);
    MQTT_Publish("temperature_data", current_temperature);
    MQTT_Publish("humidifier_status", humidifier_status);
    MQTT_Publish("water_level", water_level_ok);
}

代码说明:

  1. 1. 系统初始化:包括STM32硬件初始化,GPIO初始化(继电器控制、按键输入等),WiFi模块和MQTT通信初始化等。
  2. 2. 传感器数据读取:定期从DHT11温湿度传感器和水位传感器读取数据。
  3. 3. 加湿器控制:在自动模式下,湿度值低于阈值时启动加湿器,湿度值超过阈值时停止加湿器。在手动模式下,通过按键控制加湿器的开关。
  4. 4. OLED显示:实时显示环境温湿度、加湿器状态、水位、操作模式等信息。
  5. 5. 按键控制:通过三个按键控制模式切换、湿度阈值增减。
  6. 6. 数据上传:将温湿度和加湿器状态等信息通过MQTT协议上传至华为云物联网平台。

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。