1. 項目開發(fā)背景
隨著現(xiàn)代科技的迅速發(fā)展,智能家居逐漸進入人們的生活。在智能家居中,空氣質(zhì)量調(diào)節(jié)設備尤為重要,尤其是在氣候干燥的季節(jié),空氣加濕器的需求顯得尤為突出。傳統(tǒng)的空氣加濕器雖然能有效提高空氣濕度,但通常依賴用戶手動調(diào)節(jié),并且缺乏智能化控制,容易造成水位過低或過高、濕度不均等問題。因此,設計一個具有智能控制功能的空氣加濕器顯得尤為重要。
本項目基于STM32單片機,設計了一款智能空氣加濕器。通過集成溫濕度傳感器、水位傳感器、繼電器控制、蜂鳴器警報、按鍵控制等硬件模塊,實現(xiàn)空氣加濕器的自動調(diào)節(jié)和手動控制功能。此外,系統(tǒng)支持通過MQTT協(xié)議將數(shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺,以便進行數(shù)據(jù)存儲和歷史數(shù)據(jù)分析,方便用戶進行遠程監(jiān)控和控制。
2. 設計實現(xiàn)的功能
本智能空氣加濕器系統(tǒng)主要實現(xiàn)以下功能:
- 繼電器控制:通過繼電器控制加濕器的啟停。
- 手動控制:用戶通過按鍵手動控制加濕器的開啟和停止。
- 智能加濕:系統(tǒng)根據(jù)環(huán)境濕度自動調(diào)節(jié)加濕器的工作狀態(tài),當濕度低于設定閾值時加濕器自動加濕,當濕度超過閾值時自動停止加濕。
- 水位監(jiān)測:使用水位傳感器實時監(jiān)測加濕器的水量,確保水位充足時加濕器才能正常工作,避免干燒。
- 蜂鳴器警報:當檢測到水位過低時,系統(tǒng)啟動蜂鳴器報警,提醒用戶加水。
- 按鍵控制:用戶可以通過三個按鍵進行智能模式與手動模式的切換、濕度閾值的設定及調(diào)節(jié)。
- OLED顯示屏:實時顯示環(huán)境濕度、溫度、加濕器狀態(tài)、水位、濕度閾值等信息。
- 數(shù)據(jù)上傳:通過WiFi和MQTT協(xié)議將設備數(shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺,支持遠程數(shù)據(jù)查看和分析。
- 云端服務:后端服務器使用Python開發(fā),接收并處理來自華為云物聯(lián)網(wǎng)平臺的數(shù)據(jù),提供前端可視化頁面,實現(xiàn)對加濕器的遠程控制。
3. 項目硬件模塊組成
本智能空氣加濕器系統(tǒng)包含以下主要硬件模塊:
- STM32單片機:主控芯片,負責系統(tǒng)的控制邏輯和數(shù)據(jù)處理。
- DHT11溫濕度傳感器:用于實時采集環(huán)境溫度和濕度數(shù)據(jù)。
- 水位傳感器:實時監(jiān)測加濕器內(nèi)的水位,防止水位過低或過高。
- 繼電器模塊:控制加濕器電源的開關。
- 蜂鳴器模塊:當檢測到水位過低時,啟動蜂鳴器報警。
- 按鍵模塊:用于模式切換、濕度閾值設置等控制功能。
- OLED顯示屏:顯示當前的環(huán)境數(shù)據(jù)和加濕器狀態(tài)。
- WiFi模塊(ESP8266):實現(xiàn)WiFi連接,支持MQTT協(xié)議與華為云物聯(lián)網(wǎng)平臺進行數(shù)據(jù)通信。
- 華為云物聯(lián)網(wǎng)平臺:用于存儲和管理設備上傳的數(shù)據(jù),并提供遠程控制接口。
4. 設計思路
本項目的設計思路基于STM32單片機為核心,通過外圍傳感器、繼電器、WiFi模塊等硬件的配合實現(xiàn)智能控制。整體設計分為硬件部分和軟件部分,硬件部分負責感知環(huán)境和控制加濕器,軟件部分負責數(shù)據(jù)處理、狀態(tài)控制和數(shù)據(jù)上傳。
- 環(huán)境數(shù)據(jù)采集:通過DHT11溫濕度傳感器定期采集環(huán)境濕度和溫度,并根據(jù)用戶設定的濕度閾值決定加濕器的啟停。
- 水位監(jiān)控:水位傳感器負責實時監(jiān)控加濕器的水量,若水位過低,停止加濕器并啟動蜂鳴器警報。
- 用戶控制:用戶可以通過按鍵進行手動控制,選擇智能模式或手動模式,并設置濕度閾值。
- 數(shù)據(jù)上傳與遠程控制:系統(tǒng)將采集到的環(huán)境數(shù)據(jù)通過WiFi上傳至華為云物聯(lián)網(wǎng)平臺,用戶可以通過PC或手機瀏覽器訪問網(wǎng)頁,實現(xiàn)遠程監(jiān)控和控制。
5. 系統(tǒng)功能總結(jié)
功能模塊 | 說明 |
---|---|
繼電器控制 | 通過繼電器控制加濕器的啟停。 |
手動控制 | 通過按鍵控制加濕器的加濕或停止加濕。 |
智能加濕 | 根據(jù)環(huán)境濕度自動調(diào)節(jié)加濕器的工作狀態(tài)。 |
水位監(jiān)測 | 實時監(jiān)測水位,避免水位過低時加濕器干燒。 |
蜂鳴器警報 | 當水位過低時,蜂鳴器發(fā)出警報提示用戶加水。 |
按鍵控制 | 通過按鍵切換智能模式和手動模式,設置濕度閾值。 |
OLED顯示 | 顯示環(huán)境溫濕度、加濕器狀態(tài)、水位等信息。 |
數(shù)據(jù)上傳 | 通過WiFi和MQTT協(xié)議將數(shù)據(jù)上傳至華為云物聯(lián)網(wǎng)平臺。 |
云端服務 | 提供后端服務器和前端網(wǎng)頁進行遠程控制和數(shù)據(jù)可視化。 |
6. 使用的模塊的技術詳情介紹
STM32單片機
STM32F103系列單片機是基于ARM Cortex-M3核心的高性能32位微控制器,適合用于嵌入式系統(tǒng)開發(fā)。其豐富的外設接口和高效的處理能力使得本項目得以高效地控制各個硬件模塊。
DHT11溫濕度傳感器
DHT11是一款常用的數(shù)字溫濕度傳感器,具有低功耗、簡單的單總線接口等特點。它可以通過單片機的GPIO端口與STM32進行通信,輸出溫度和濕度的數(shù)字信號。
水位傳感器
水位傳感器采用電容式或電阻式感應原理,通過檢測水的電導率或電容值變化,實時監(jiān)測加濕器水位。該模塊可通過模擬量或數(shù)字量接口與STM32連接。
繼電器模塊
繼電器模塊用于控制加濕器的電源開關。STM32通過控制繼電器的開關狀態(tài),進而控制加濕器的工作狀態(tài)。
OLED顯示屏
OLED顯示屏用于實時顯示環(huán)境數(shù)據(jù)和加濕器狀態(tài)。由于其高對比度、低功耗的特點,適用于本項目中作為實時數(shù)據(jù)顯示模塊。
蜂鳴器模塊
蜂鳴器用于發(fā)出聲音警報,提醒用戶加水。當水位傳感器檢測到水位過低時,STM32會驅(qū)動蜂鳴器發(fā)出警報聲音。
WiFi模塊(ESP8266)
ESP8266是一款低功耗WiFi模塊,能夠?qū)崿F(xiàn)WiFi連接和MQTT通信。它將STM32采集到的環(huán)境數(shù)據(jù)上傳至華為云物聯(lián)網(wǎng)平臺,同時接收云平臺的控制指令,完成遠程控制功能。
華為云物聯(lián)網(wǎng)平臺
華為云物聯(lián)網(wǎng)平臺提供設備管理、數(shù)據(jù)存儲、數(shù)據(jù)分析、遠程控制等功能。設備通過MQTT協(xié)議將數(shù)據(jù)上傳至平臺,平臺提供API接口以便與本地服務器進行數(shù)據(jù)交互。
7. 系統(tǒng)工作原理
工作原理:
- 系統(tǒng)開機后,STM32開始采集DHT11傳感器的溫濕度數(shù)據(jù)。
- 當濕度低于預設閾值時,繼電器控制加濕器啟動,開始加濕。
- 水位傳感器監(jiān)測水量,當水位低于安全閾值時,蜂鳴器報警,并停止加濕器工作。
- 用戶可以通過按鍵手動控制加濕器的開關,或者切換至智能模式。
- 所有數(shù)據(jù)通過WiFi模塊上傳至華為云物聯(lián)網(wǎng)平臺,用戶可以通過PC或手機瀏覽器查看實時數(shù)據(jù)和歷史記錄,遠程控制加濕器。
8. 系統(tǒng)軟件設計
主控程序設計
使用STM32的HAL庫進行開發(fā),程序的主要流程如下:
- 初始化硬件:初始化DHT11傳感器、繼電器、水位傳感器、OLED顯示屏、蜂鳴器和WiFi模塊。
- 讀取傳感器數(shù)據(jù):定期讀取溫濕度數(shù)據(jù),并實時監(jiān)控水位。
- 控制加濕器:根據(jù)濕度值和水位,控制加濕器的啟停。
- 上傳數(shù)據(jù):通過WiFi模塊將數(shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺。
按鍵控制與顯示
通過按鍵實現(xiàn)用戶交互,按鍵的響應與OLED顯示屏結(jié)合,允許用戶進行濕度值設置和模式切換。
9. 測試與調(diào)試
在開發(fā)過程中,系統(tǒng)通過模擬各種環(huán)境條件進行調(diào)試,包括濕度、溫度、水位變化等。測試時重點驗證:
- 濕度傳感器的準確性與響應速度。
- 水位傳感器的穩(wěn)定性。
- 加濕器控制邏輯是否準確。
- 數(shù)據(jù)上傳至華為云物聯(lián)網(wǎng)平臺的穩(wěn)定性。
10. 總結(jié)
本項目成功設計并實現(xiàn)了一個基于STM32的智能空氣加濕器系統(tǒng),具備智能加濕、手動控制、水位監(jiān)測、遠程數(shù)據(jù)管理等功能。未來可以通過進一步優(yōu)化算法和硬件,提升系統(tǒng)的穩(wěn)定性和智能化水平。例如,加入自動調(diào)節(jié)濕度閾值功能、擴展更多遠程控制接口等。
11. STM32代碼設計
以下是基于STM32單片機設計的智能空氣加濕器的main.c
代碼示例。包括DHT11傳感器、繼電器、水位傳感器、蜂鳴器、OLED顯示屏、WiFi模塊等。此代碼主要集中在系統(tǒng)初始化、傳感器數(shù)據(jù)讀取、加濕器控制邏輯、按鍵控制、數(shù)據(jù)上傳及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通信頭文件
// 系統(tǒng)定時器,用于定期任務
#define SYSTEM_TICK_PERIOD 1000 // 1秒更新一次
// 濕度閾值(可以根據(jù)需要設定默認值)
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;
// 控制加濕器狀態(tài)
typedef enum {
HUMIDIFIER_OFF = 0,
HUMIDIFIER_ON
} HumidifierStatus;
HumidifierStatus humidifier_status = HUMIDIFIER_OFF;
// 函數(shù)聲明
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();
// 配置系統(tǒng)時鐘
SystemClock_Config();
// 初始化GPIO(繼電器控制、按鍵輸入等)
GPIO_Init();
// 初始化OLED顯示
OLED_Init();
// 初始化WiFi模塊
WiFi_Init();
// 初始化MQTT通信
MQTT_Init();
// 初始化水位傳感器、蜂鳴器等外設
WaterLevel_Init();
Buzzer_Init();
// 啟動定時器(定時更新環(huán)境數(shù)據(jù)和控制邏輯)
Timer_Init();
while (1)
{
// 定時讀取傳感器數(shù)據(jù)
if (HAL_GetTick() % SYSTEM_TICK_PERIOD == 0)
{
// 讀取傳感器數(shù)據(jù)
Read_Sensors();
// 根據(jù)模式控制加濕器
Control_Humidifier();
// 顯示當前狀態(tài)
Display_Data();
// 上傳數(shù)據(jù)至云平臺
Upload_Data();
}
// 按鍵操作處理
Button_Handler();
}
}
// 初始化系統(tǒng)時鐘
void SystemClock_Config(void)
{
// 使用默認的系統(tǒng)時鐘配置
// STM32F1系列芯片通常使用HSE(外部晶振)作為時鐘源
// 可以根據(jù)實際硬件配置進行修改
}
// 初始化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);
}
// 讀取傳感器數(shù)據(jù)(溫濕度和水位)
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
{
// 根據(jù)模式控制加濕器
if (current_mode == MODE_AUTO)
{
// 自動模式,根據(jù)濕度閾值控制
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)
{
// 手動模式,根據(jù)按鍵控制
// 這里假設按鍵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); // 關閉加濕器
}
}
}
}
// 顯示數(shù)據(jù)到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);
}
}
// 數(shù)據(jù)上傳到云平臺
void Upload_Data(void)
{
// 將溫濕度和加濕器狀態(tài)上傳到華為云物聯(lián)網(wǎng)平臺
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);
}
代碼說明:
- 系統(tǒng)初始化:包括STM32硬件初始化,GPIO初始化(繼電器控制、按鍵輸入等),WiFi模塊和MQTT通信初始化等。
- 傳感器數(shù)據(jù)讀取:定期從DHT11溫濕度傳感器和水位傳感器讀取數(shù)據(jù)。
- 加濕器控制:在自動模式下,濕度值低于閾值時啟動加濕器,濕度值超過閾值時停止加濕器。在手動模式下,通過按鍵控制加濕器的開關。
- OLED顯示:實時顯示環(huán)境溫濕度、加濕器狀態(tài)、水位、操作模式等信息。
- 按鍵控制:通過三個按鍵控制模式切換、濕度閾值增減。
- 數(shù)據(jù)上傳:將溫濕度和加濕器狀態(tài)等信息通過MQTT協(xié)議上傳至華為云物聯(lián)網(wǎng)平臺。