1. 項(xiàng)目開(kāi)發(fā)背景
隨著工業(yè)化和現(xiàn)代化的進(jìn)程,尤其是在制造業(yè)、食品業(yè)、醫(yī)藥業(yè)等行業(yè),倉(cāng)庫(kù)環(huán)境的監(jiān)控和管理成為了至關(guān)重要的一環(huán)。尤其是在存儲(chǔ)易腐品、藥品、電子產(chǎn)品等貨物時(shí),溫度、濕度、氣體濃度等環(huán)境參數(shù)的異常變化可能導(dǎo)致物品的質(zhì)量和安全性問(wèn)題。為了保證倉(cāng)庫(kù)內(nèi)物品的安全存儲(chǔ),及時(shí)發(fā)現(xiàn)環(huán)境參數(shù)異常并采取必要措施,倉(cāng)庫(kù)環(huán)境監(jiān)測(cè)系統(tǒng)應(yīng)運(yùn)而生。
傳統(tǒng)的環(huán)境監(jiān)測(cè)方式往往依賴人工檢查或簡(jiǎn)單的環(huán)境檢測(cè)設(shè)備,但這些方式往往難以實(shí)現(xiàn)實(shí)時(shí)監(jiān)控與自動(dòng)預(yù)警。物聯(lián)網(wǎng)技術(shù)的發(fā)展為倉(cāng)庫(kù)環(huán)境監(jiān)控系統(tǒng)提供了更加智能、高效、實(shí)時(shí)的數(shù)據(jù)采集、傳輸和處理手段。本項(xiàng)目基于STM32微控制器設(shè)計(jì)一個(gè)環(huán)境監(jiān)測(cè)與預(yù)警系統(tǒng),具備溫濕度監(jiān)測(cè)、氣體檢測(cè)、墻壁水汽檢測(cè)、蜂鳴器報(bào)警、通風(fēng)控制等功能,支持?jǐn)?shù)據(jù)上傳至華為云物聯(lián)網(wǎng)平臺(tái)并通過(guò)網(wǎng)頁(yè)實(shí)現(xiàn)數(shù)據(jù)可視化與控制。
本項(xiàng)目不僅滿足了傳統(tǒng)環(huán)境監(jiān)測(cè)的需求,還通過(guò)物聯(lián)網(wǎng)和大數(shù)據(jù)分析提升了倉(cāng)庫(kù)管理的效率和智能化水平,具有重要的實(shí)際應(yīng)用價(jià)值。
2. 設(shè)計(jì)實(shí)現(xiàn)的功能
本項(xiàng)目設(shè)計(jì)的倉(cāng)庫(kù)環(huán)境監(jiān)測(cè)與預(yù)警系統(tǒng)的主要功能如下:
1. 環(huán)境溫度和濕度檢測(cè)
使用SHT30溫濕度傳感器實(shí)時(shí)監(jiān)測(cè)倉(cāng)庫(kù)內(nèi)的環(huán)境溫度和濕度,并通過(guò)顯示屏和云平臺(tái)實(shí)時(shí)展示。
2. 二氧化碳濃度檢測(cè)
使用SGP30傳感器檢測(cè)倉(cāng)庫(kù)內(nèi)的二氧化碳濃度,提供空氣質(zhì)量監(jiān)測(cè)功能。
3. 墻壁水汽檢測(cè)
安裝雨滴傳感器以檢測(cè)墻壁或角落的水汽情況,當(dāng)水汽超標(biāo)時(shí),通過(guò)蜂鳴器進(jìn)行報(bào)警。
4. 可燃?xì)怏w檢測(cè)
使用MQ9氣體傳感器檢測(cè)倉(cāng)庫(kù)內(nèi)的一氧化碳、甲烷等可燃?xì)怏w濃度,當(dāng)檢測(cè)到氣體濃度超標(biāo)時(shí),觸發(fā)蜂鳴器報(bào)警。
5. 通風(fēng)風(fēng)扇控制
使用繼電器控制通風(fēng)風(fēng)扇的啟停,用戶可以手動(dòng)按鍵開(kāi)啟或關(guān)閉風(fēng)扇,確保倉(cāng)庫(kù)通風(fēng)良好。
6. 報(bào)警功能
當(dāng)環(huán)境參數(shù)不符合設(shè)定要求時(shí),系統(tǒng)通過(guò)蜂鳴器報(bào)警并在可視化大屏上顯示報(bào)警信息,通知工作人員及時(shí)處理。
7. 可視化大屏顯示
使用1.44寸LCD顯示屏顯示溫濕度、二氧化碳濃度、氣體濃度、墻壁水汽等環(huán)境數(shù)據(jù)。
8. 數(shù)據(jù)上傳與云平臺(tái)顯示
系統(tǒng)通過(guò)ESP8266模塊連接Wi-Fi,將數(shù)據(jù)通過(guò)MQTT協(xié)議上傳到華為云物聯(lián)網(wǎng)平臺(tái),實(shí)時(shí)顯示數(shù)據(jù),并支持歷史數(shù)據(jù)查詢和分析。
9. Web端數(shù)據(jù)可視化與控制
使用Python編寫(xiě)后端服務(wù)器,接收從華為云物聯(lián)網(wǎng)平臺(tái)轉(zhuǎn)發(fā)的數(shù)據(jù),并通過(guò)HTML前端頁(yè)面展示實(shí)時(shí)數(shù)據(jù)與報(bào)警狀態(tài),用戶可通過(guò)Web頁(yè)面進(jìn)行控制操作。
10. 數(shù)據(jù)存儲(chǔ)與分析
服務(wù)器支持本地存儲(chǔ)數(shù)據(jù),并通過(guò)云平臺(tái)的數(shù)據(jù)存儲(chǔ)與分析功能,提供環(huán)境參數(shù)歷史數(shù)據(jù)的查看與分析,輔助決策與管理。
3. 項(xiàng)目硬件模塊組成
本項(xiàng)目所使用的硬件模塊如下:
- 主要負(fù)責(zé)系統(tǒng)的控制與數(shù)據(jù)處理,協(xié)調(diào)各個(gè)模塊的工作。
- 具有豐富的IO口、USART接口、PWM輸出等功能,適合本項(xiàng)目的多傳感器數(shù)據(jù)采集和控制需求。
2. 溫濕度傳感器:SHT30
3. 二氧化碳濃度傳感器:SGP30
- 用于檢測(cè)倉(cāng)庫(kù)內(nèi)的二氧化碳濃度,具有較高的檢測(cè)精度。
- 同樣采用I2C接口進(jìn)行數(shù)據(jù)通信。
4. 可燃?xì)怏w傳感器:MQ9
- 用于檢測(cè)倉(cāng)庫(kù)內(nèi)一氧化碳、甲烷等氣體的濃度。
- 通過(guò)模擬輸出與STM32進(jìn)行通信。
5. 雨滴傳感器
- 用于檢測(cè)墻壁或角落的水汽情況。
- 安裝在墻壁或角落,如果檢測(cè)到水汽,則通過(guò)蜂鳴器進(jìn)行報(bào)警。
6. 蜂鳴器
- 用于報(bào)警,當(dāng)環(huán)境參數(shù)不符合要求時(shí),蜂鳴器發(fā)出聲音提醒。
7. 通風(fēng)風(fēng)扇:繼電器控制
- 用于控制通風(fēng)風(fēng)扇的開(kāi)關(guān),通過(guò)繼電器與STM32連接。
8. Wi-Fi模塊:ESP8266
- 用于與本地網(wǎng)絡(luò)連接,將采集到的環(huán)境數(shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺(tái)。
- 支持MQTT協(xié)議,用于數(shù)據(jù)上傳。
9. 顯示屏:1.44寸LCD
- 顯示當(dāng)前倉(cāng)庫(kù)的環(huán)境數(shù)據(jù),包括溫濕度、二氧化碳濃度、氣體濃度等。
10. 電源模塊:5V 2A外部穩(wěn)壓模塊
- 為系統(tǒng)提供穩(wěn)定的電源。
4. 設(shè)計(jì)思路
4.1 系統(tǒng)架構(gòu)
本系統(tǒng)由硬件和軟件兩部分組成,硬件部分主要包括溫濕度傳感器、二氧化碳傳感器、可燃?xì)怏w傳感器、雨滴傳感器、蜂鳴器、Wi-Fi模塊等。系統(tǒng)使用STM32F103RCT6作為主控芯片,通過(guò)I2C、GPIO、PWM等接口與傳感器和執(zhí)行器連接。
系統(tǒng)通過(guò)ESP8266 Wi-Fi模塊實(shí)現(xiàn)數(shù)據(jù)無(wú)線傳輸,數(shù)據(jù)通過(guò)MQTT協(xié)議上傳至華為云物聯(lián)網(wǎng)平臺(tái)。云端平臺(tái)負(fù)責(zé)數(shù)據(jù)存儲(chǔ)和歷史數(shù)據(jù)分析,同時(shí)提供API接口供本地服務(wù)器拉取數(shù)據(jù)。通過(guò)Web頁(yè)面,用戶可以查看實(shí)時(shí)環(huán)境數(shù)據(jù)并進(jìn)行控制操作。
4.2 數(shù)據(jù)采集與處理
- 溫濕度檢測(cè):使用SHT30傳感器實(shí)時(shí)采集倉(cāng)庫(kù)內(nèi)的環(huán)境溫度和濕度,STM32通過(guò)I2C接口與SHT30通信,獲取數(shù)據(jù)并進(jìn)行處理。
- 氣體檢測(cè):通過(guò)MQ9傳感器獲取一氧化碳等氣體的濃度,當(dāng)濃度超標(biāo)時(shí)觸發(fā)報(bào)警。
- 墻壁水汽檢測(cè):雨滴傳感器監(jiān)測(cè)墻壁或角落的水汽,當(dāng)水汽超標(biāo)時(shí),蜂鳴器報(bào)警。
- 二氧化碳濃度檢測(cè):SGP30傳感器監(jiān)測(cè)二氧化碳濃度。
4.3 報(bào)警與控制
- 蜂鳴器報(bào)警:當(dāng)檢測(cè)到溫濕度、氣體濃度、墻壁水汽等不符合要求時(shí),蜂鳴器發(fā)出報(bào)警聲音。
- 風(fēng)扇控制:通過(guò)繼電器控制通風(fēng)風(fēng)扇的啟停,確保倉(cāng)庫(kù)內(nèi)空氣流通。
- 按鍵控制:用戶可以通過(guò)按鍵手動(dòng)啟動(dòng)或關(guān)閉風(fēng)扇。
4.4 數(shù)據(jù)上傳與可視化
- 云數(shù)據(jù)上傳:數(shù)據(jù)通過(guò)ESP8266模塊通過(guò)Wi-Fi上傳到華為云物聯(lián)網(wǎng)平臺(tái),使用MQTT協(xié)議實(shí)現(xiàn)數(shù)據(jù)傳輸。
- Web端可視化:后端服務(wù)器使用Python開(kāi)發(fā),前端使用HTML5展示實(shí)時(shí)數(shù)據(jù)、報(bào)警信息和控制界面。
5. 系統(tǒng)功能總結(jié)
云平臺(tái) | | Web端可視化 | 通過(guò)Web前端展示數(shù)據(jù)、報(bào)警信息及控制操作 |
6. 使用的模塊的技術(shù)詳情介紹
6.1 SHT30 溫濕度傳感器
工作原理:SHT30是一款數(shù)字輸出型溫濕度傳感器,采用I2C協(xié)議與STM32通信。具有高精度、低功耗的特點(diǎn),適合長(zhǎng)期穩(wěn)定監(jiān)測(cè)環(huán)境條件。
6.2 SGP30 二氧化碳傳感器
工作原理:SGP30是一款基于金屬氧化物傳感器的二氧化碳傳感器,采用I2C通信協(xié)議,能精確檢測(cè)空氣中的二氧化碳濃度。
6.3 MQ9 可燃?xì)怏w傳感器
工作原理:MQ9是常見(jiàn)的氣體傳感器,可檢測(cè)一氧化碳、甲烷等可燃?xì)怏w。輸出模擬信號(hào),STM32通過(guò)ADC讀取數(shù)據(jù),進(jìn)行氣體濃度判斷。
6.4 雨滴傳感器
工作原理:雨滴傳感器檢測(cè)環(huán)境中的水汽,當(dāng)水汽濃度超標(biāo)時(shí),通過(guò)觸發(fā)高電平輸出控制蜂鳴器報(bào)警。
6.5 ESP8266 Wi-Fi模塊
工作原理:ESP8266模塊提供Wi-Fi無(wú)線網(wǎng)絡(luò)連接,支持通過(guò)MQTT協(xié)議與云平臺(tái)進(jìn)行通信,傳輸環(huán)境數(shù)據(jù)。
6.6 蜂鳴器
工作原理:蜂鳴器通過(guò)接收到高電平信號(hào)時(shí)發(fā)出響聲,用于報(bào)警通知。
7. 總結(jié)
本項(xiàng)目成功設(shè)計(jì)并實(shí)現(xiàn)了基于STM32的倉(cāng)庫(kù)環(huán)境監(jiān)測(cè)與預(yù)警系統(tǒng)。通過(guò)結(jié)合多種傳感器、Wi-Fi模塊以及云平臺(tái),能夠?qū)崟r(shí)監(jiān)測(cè)倉(cāng)庫(kù)內(nèi)的溫濕度、氣體濃度、水汽等環(huán)境參數(shù),并在出現(xiàn)異常時(shí)通過(guò)蜂鳴器報(bào)警提醒工作人員。同時(shí),系統(tǒng)支持?jǐn)?shù)據(jù)上傳至云平臺(tái),提供實(shí)時(shí)數(shù)據(jù)展示和歷史數(shù)據(jù)分析,幫助管理人員更好地了解倉(cāng)庫(kù)環(huán)境狀況,做出決策。
該系統(tǒng)具備高效性、智能化、實(shí)時(shí)性強(qiáng)等特點(diǎn),具有廣泛的應(yīng)用前景,可以為各類倉(cāng)儲(chǔ)、生產(chǎn)線等環(huán)境提供有效的監(jiān)測(cè)和預(yù)警保障。
8. STM32代碼設(shè)計(jì)
以下是基于STM32的倉(cāng)庫(kù)環(huán)境監(jiān)測(cè)與預(yù)警系統(tǒng)的 main.c 文件代碼。主程序負(fù)責(zé)初始化各個(gè)模塊,進(jìn)行數(shù)據(jù)采集,并通過(guò)蜂鳴器進(jìn)行報(bào)警,最后通過(guò)Wi-Fi上傳數(shù)據(jù)到華為云物聯(lián)網(wǎng)平臺(tái)。
資料下載地址:https://gh2wvkmipb87sstdyjx80r99rn12g1u.taobao.com/
#include "stm32f1xx_hal.h"
#include "stdio.h"
#include "string.h"
// 引入各傳感器模塊的頭文件
#include "sht30.h" // 溫濕度傳感器
#include "sgp30.h" // 二氧化碳傳感器
#include "mq9.h" // 可燃?xì)怏w傳感器
#include "rain_sensor.h" // 水汽傳感器
#include "esp8266.h" // WiFi模塊
#include "lcd.h" // LCD顯示
#include "relay.h" // 繼電器控制風(fēng)扇
#include "buzzer.h" // 蜂鳴器
// 定義環(huán)境監(jiān)測(cè)閾值
#define TEMP_THRESHOLD_HIGH 30 // 高溫閾值(單位:℃)
#define TEMP_THRESHOLD_LOW 10 // 低溫閾值(單位:℃)
#define HUMIDITY_THRESHOLD_LOW 30 // 低濕度閾值(單位:%)
#define CO_THRESHOLD 10 // 一氧化碳濃度閾值(單位:ppm)
#define CO2_THRESHOLD 1000 // 二氧化碳濃度閾值(單位:ppm)
#define WATER_VAPOR_THRESHOLD 50 // 水汽濃度閾值(單位:%)
UART_HandleTypeDef huart1; // 串口1,用于調(diào)試
I2C_HandleTypeDef hi2c1; // I2C1,用于溫濕度傳感器、SGP30
SPI_HandleTypeDef hspi1; // SPI1,用于LCD顯示
WiFi_Module wifi; // Wi-Fi模塊
// 函數(shù)聲明
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_USART1_UART_Init(void);
void MX_I2C1_Init(void);
void MX_SPI1_Init(void);
void read_environment_data(void);
void display_data_on_lcd(float temperature, float humidity, float co2, float co);
void send_data_to_cloud(float temperature, float humidity, float co2, float co);
void check_alerts(float temperature, float humidity, float co2, float co, int water_vapor);
void control_relay(int status);
void control_buzzer(int status);
int main(void)
{
// 系統(tǒng)初始化
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_I2C1_Init();
MX_SPI1_Init();
// 初始化傳感器
SHT30_Init(&hi2c1); // 初始化溫濕度傳感器
SGP30_Init(&hi2c1); // 初始化二氧化碳傳感器
MQ9_Init(); // 初始化可燃?xì)怏w傳感器
Rain_Sensor_Init(); // 初始化水汽傳感器
ESP8266_Init(&huart1); // 初始化Wi-Fi模塊
LCD_Init(&hspi1); // 初始化LCD顯示
Buzzer_Init(); // 初始化蜂鳴器
Relay_Init(); // 初始化繼電器(風(fēng)扇控制)
// 系統(tǒng)主循環(huán)
while (1)
{
// 讀取環(huán)境數(shù)據(jù)
float temperature, humidity, co2, co;
int water_vapor;
read_environment_data(&temperature, &humidity, &co2, &co, &water_vapor);
// 顯示數(shù)據(jù)到LCD
display_data_on_lcd(temperature, humidity, co2, co);
// 上傳數(shù)據(jù)到云平臺(tái)
send_data_to_cloud(temperature, humidity, co2, co);
// 檢查是否需要報(bào)警或執(zhí)行控制
check_alerts(temperature, humidity, co2, co, water_vapor);
}
}
// 讀取環(huán)境數(shù)據(jù)(溫濕度,CO2濃度,CO濃度,水汽濃度)
void read_environment_data(float *temperature, float *humidity, float *co2, float *co, int *water_vapor)
{
// 獲取溫濕度數(shù)據(jù)
*temperature = SHT30_ReadTemperature();
*humidity = SHT30_ReadHumidity();
// 獲取CO2濃度數(shù)據(jù)
*co2 = SGP30_ReadCO2();
// 獲取CO濃度數(shù)據(jù)
*co = MQ9_ReadCO();
// 獲取水汽濃度數(shù)據(jù)
*water_vapor = Rain_Sensor_Read();
}
// 將數(shù)據(jù)顯示在LCD屏上
void display_data_on_lcd(float temperature, float humidity, float co2, float co)
{
char display_buffer[50];
// 顯示溫濕度數(shù)據(jù)
sprintf(display_buffer, "Temp: %.2fC Hum: %.2f%%", temperature, humidity);
LCD_DisplayStringLine(0, (uint8_t*)display_buffer);
// 顯示CO2和CO數(shù)據(jù)
sprintf(display_buffer, "CO2: %.2fppm CO: %.2fppm", co2, co);
LCD_DisplayStringLine(1, (uint8_t*)display_buffer);
}
// 將數(shù)據(jù)上傳到云平臺(tái)
void send_data_to_cloud(float temperature, float humidity, float co2, float co)
{
// 將數(shù)據(jù)通過(guò)MQTT協(xié)議上傳到華為云物聯(lián)網(wǎng)平臺(tái)
char payload[200];
sprintf(payload, "{"temperature": %.2f, "humidity": %.2f, "co2": %.2f, "co": %.2f}",
temperature, humidity, co2, co);
ESP8266_MQTT_Publish("warehouse/environment", payload); // 假設(shè)該主題用于上傳環(huán)境數(shù)據(jù)
}
// 檢查環(huán)境參數(shù),判斷是否需要報(bào)警或控制
void check_alerts(float temperature, float humidity, float co2, float co, int water_vapor)
{
// 檢查溫度
if (temperature > TEMP_THRESHOLD_HIGH || temperature < TEMP_THRESHOLD_LOW)
{
control_buzzer(1); // 超出溫度范圍,啟動(dòng)蜂鳴器報(bào)警
}
// 檢查濕度
if (humidity < HUMIDITY_THRESHOLD_LOW)
{
control_buzzer(1); // 濕度過(guò)低,啟動(dòng)蜂鳴器報(bào)警
}
// 檢查二氧化碳濃度
if (co2 > CO2_THRESHOLD)
{
control_buzzer(1); // 二氧化碳濃度過(guò)高,啟動(dòng)蜂鳴器報(bào)警
}
// 檢查可燃?xì)怏w濃度
if (co > CO_THRESHOLD)
{
control_buzzer(1); // 可燃?xì)怏w濃度過(guò)高,啟動(dòng)蜂鳴器報(bào)警
}
// 檢查水汽濃度
if (water_vapor > WATER_VAPOR_THRESHOLD)
{
control_buzzer(1); // 水汽濃度過(guò)高,啟動(dòng)蜂鳴器報(bào)警
}
// 控制風(fēng)扇(繼電器控制)
if (temperature > TEMP_THRESHOLD_HIGH)
{
control_relay(1); // 啟動(dòng)風(fēng)扇
}
else if (temperature < TEMP_THRESHOLD_LOW)
{
control_relay(0); // 關(guān)閉風(fēng)扇
}
}
// 控制繼電器(風(fēng)扇)
void control_relay(int status)
{
if (status)
{
Relay_On(); // 打開(kāi)風(fēng)扇
}
else
{
Relay_Off(); // 關(guān)閉風(fēng)扇
}
}
// 控制蜂鳴器
void control_buzzer(int status)
{
if (status)
{
Buzzer_On(); // 啟動(dòng)蜂鳴器報(bào)警
}
else
{
Buzzer_Off(); // 關(guān)閉蜂鳴器
}
}