



摘 要:目前,小區生活污水的二次處理存在監測效率低、處理不及時等問題。針對以上問題,本文提出了一種基于STM32單片機的水質監測與處理系統,系統集成水質監測傳感器、實時操作系統RTOS、ESP8266模塊以及C++應用程序設計等技術,實現對小區生活污水的監測。與傳統方法相比,系統具有更高的監測準確度和響應能力,可以提升水質處理的效率。結果表明,系統在水質監測與處理方面具備顯著的改進效果,能夠有效提高小區生活污水的處理水平。
關鍵詞:物聯網;水質監測;STM32單片機;ESP8266模塊;FreeRTOS
中圖分類號:X 832 文獻標志碼:A
在老舊小區的污水處理改造或新樓宇設計中,智慧化和就近處理生活污水的需求日益增長。對生活污水進行收集,經過處理使水質達到再生水水質標準,用于沖廁、綠化用水、道理澆灑,從而實現水資源的循環利用[1]。綜合上述問題,本文利用STM32單片機,通過水質監測傳感器采集小區生活污水水質,依靠實時操作系統RTOS實現多任務處理,利用ESP8266模塊將數據上傳至云服務器,通過客戶端實現水質數據的可視化展示和設備的遠程控制[2]。
1 系統整體設計
系統通過超聲波傳感器、溫度傳感器、PH傳感器、濁度傳感器和TDS傳感器等多種水質監測傳感器來實現對水源參數的監測。其中,STM32單片機作為數據處理的核心,負責對傳感器采集的數據進行初步分析和處理。ESP8266模塊作為數據傳輸的橋梁,確保數據能夠通過無線網絡發送到阿里云服務器。在服務器端,數據存儲和數據管理功能保證了數據的持久化和可查詢性,同時,數據分析模塊對傳感器采集的數據進行深入挖掘,為決策提供依據。數據可視化工具通過客戶端軟件將水質數據轉換為直觀的圖表和指示。遠程控制功能允許用戶通過客戶端對水泵、步進電機、繼電器等設備進行操作,實現設備的自動化管理[3]。此外,系統還包括了蜂鳴器和LED指示燈等報警和狀態指示設備以及電源模塊,確保整個系統的穩定運行。系統整體設計結構如圖1所示。
2 系統硬件結構設計
系統基于STM32F103系列單片機作為核心控制系統,通過水質監測傳感器監測小區生活污水情況。采集的數據經過單片機處理后,系統控制處理設備的執行,同時通過UART串口通信,將數據發送到ESP8266模塊,再由ESP8266模塊將數據發送到阿里云服務器上,實現對水質的監測與處理。
2.1 STM32F103主控模塊
STM32F103系列單片機采用ARM32位的Cortex-M3內核,運行頻率高達72MHz,具有低功耗設計等優點,單片機內部集成128KB的Flash存儲空間,可用于記錄水質指標的基本信息。單片機含有21個AD轉換的GPIO引腳接口,可同時采集水質監測傳感器的數據。同時,STM32F103還有豐富的GPIO口資源,可用于控制投藥裝置、報警裝置等多個執行單元,保證了系統控制的靈活性和多樣性。
2.2 傳感器模塊
溫度傳感器采用DS18B20數字溫度傳感器,它具有低功耗設計、強大的抗干擾能力等特點。單片機讀取溫度傳感器測量的數據后,需要將數據變換為數字溫度。當數據低8位全部為0 時,取溫度為正,否則取負。數字溫度計算形式為16乘以數據的高8位,加上0.0625乘以數據的低8位來得到。在本系統中,用于檢測其水質溫度和設備運行環境溫度。電路原理圖如圖2所示。電路的核心是DS18B20傳感器,它通過VCC和GND引腳連接到電源和地線。電路中包括2個電阻:1個10kΩ的上拉電阻R1和1個1kΩ的電阻R2。R1用于為DS18B20的數據線提供上拉電壓,當數據線空閑時保持高電平狀態。R2用于限制LED指示燈的電流。LED指示燈通過1kΩ的限流電阻連接到VCC,以提供操作狀態的反饋。
PH傳感器通過測量溶液中的氫離子濃度來檢測pH值。它將PH值轉換為模擬電壓信號,單片機通過ADC模塊讀取模擬電壓信號,將其轉換為數字值。利用校準曲線公式y=-5.7541x+16.654(R2=1),將數字值轉換為pH值。在本系統中用于監測水質的pH濃度。
濁度傳感器利用光學原理,通過溶液中的透光率和散射率來綜合判斷水的濁度。單片機通過ADC模塊讀取模擬電壓信號,根據傳感器特性和校準曲線將數字值轉換為濁度值,其濁度值與模塊輸出電壓滿足以下關系:TU=-865.68×U+K(TU為當前濁度值,U為當前溫度條件下模塊的輸出電壓值,K為截距值)。溫度校正公式為ΔU=-0.0192×(T-25)(ΔU為溫度變化引起的電壓差,T為當前測量溫度值)。在本系統中用于檢測其水質渾濁度狀況[4]。
TDS電導率傳感器采用電極法測定水溶液的電導率。將TDS傳感器輸出引腳連接到STM32單片機的模擬輸入引腳,接收傳感器輸出的模擬電壓信號,使用ADC模塊轉換為數字值,再根據傳感器特性和校準曲線將數字值轉換為TDS值,TDS標準曲線公式和溫度修正系數分別如公式(1)~公式(4)所示。在本系統中用于檢測其水質的TDS溶解性固體總量。
T修正=1+0.02×(T測試-25) (1)
V修正=T修正×V測試 (2)
TDS測試值=(66.71×V 3修正-127.93×V2修正+428.7×V修正)×K
(3)
K=TDS標準值/TDS測量值 (4)
式中:T修正為溫度校正系數;T測試為待測溶液測量溫度;V修正為修正后的傳感器模塊AO口輸出電壓值;V測試為傳感器模塊AO口輸出電壓值;K為修正系數。
HC-SR04超聲波測距傳感器采用IO口TRIG 觸發測距。將超聲波傳感器的Trig和Echo引腳連接到STM32單片機的GPIO輸出和輸入引腳,用于向Trig引腳發送高電平信號,以觸發超聲波發射。然后,等待Echo引腳輸出高電平信號,記錄計數器值并通過公式(距離= 高電平時間×聲速(340m/s)/2)計算距離。在本系統中用于測量其水位高度。
2.3 數據通信模塊
ESP8266模塊通過串行通信與STM32單片機進行連接,使用AT指令集來進行配置和控制。在本系統中,ESP-01S 模組的VCC管腳連接3.3V電壓,ESP-01S的TXD、RXD、RST引腳分別連接單片機的PA3、PA2、PA4引腳,實現UART通信,剩余管腳懸空。
3 系統軟件結構設計
3.1 系統整體設計及流程圖
從系統啟動開始,依次進行設備初始化、網絡連接、服務器通信、數據采集與處理、決策與控制、用戶交互、數據存儲、異常處理和系統監控。系統通過ESP8266模塊,發送AT指令連接到云服務器,利用MQTT協議進行數據可靠傳輸,確保與云服務器的實時通信,同時各個傳感器進行數據采集,通過單總線讀取溫度、A/D轉換獲取濁度、pH值和TDS值。單片機對數據進行實時處理,判斷是否超出預設閾值[5]。一旦檢測到異常,系統會計算加藥量并執行控制命令,通過蜂鳴器、加藥泵和繼電器進行預警和控制,同時客戶端軟件連接服務器獲取數據顯示,使用戶能夠實時監控并手動干預。所有數據均保存至數據庫,系統持續監控設備狀態和水質數據,確保穩定運行,并在設備溫度異常或停機時通知用戶,采取安全措施。軟件設計整體流程如圖3所示。
3.2 數據采集與控制系統設計
數據采集部分由水質監測傳感器和STM32單片機組成,通過ADC模塊將傳感器的模擬電壓信號轉換為數字值,并根據傳感器特性和校準曲線將數字值轉換為測量值,然后通過串口發送至上層系統。ADC模塊的初始化包括定義數組、配置GPIO、設置DMA參數、配置ADC工作模式和復位校準寄存器。串口程序負責初始化通信參數、配置數據格式和中斷優先級。
控制處理部分包括繼電器、蜂鳴器和LED指示燈模塊,通過客戶端發送控制命令至服務器,服務器接收并下發指令至硬件終端。ESP8266模塊接收到指令后通過串口發送1條包括控制命令相關信息的報文,串口利用DMA中斷將數據存儲至緩沖區。DMA發出空閑中斷表示數據接收完成,隨后將緩沖區中完整的數據復制到接收緩沖區。接著,對數據進行剝離MQTT 封裝、提取關鍵命令等操作,根據關鍵詞控制繼電器、蜂鳴器等設備的開啟和關閉,從而實現對終端設備的遠程控制。具體代碼如下。
void ESP8266_GetIPD()
{
char *ptrIPD=NULL ;
char *data =NULL;
int result = 0;
Char*IPD=\"+MQTTSUBRECV:0,\\"/sys/k0c599npYF6/water_manage/thing/service/property/set\\",\";
if(ESP8266_WaitRecive() == REV_OK)
{
ptrIPD = strstr((char *)esp8266_buf, IPD);
if(ptrIPD == NULL)
{
return;
}
else
{
ptrIPD=strstr((char*)ptrIPD,\"items\");
char PUB_TOPIC3[128]; if(strstr((char *)ptrIPD, “Pump1_state”)!=NULL
{
ptrIPD = strstr(ptrIPD, \"value\");
if(ptrIPD != NULL)
{
ptrIPD = strchr((char*)ptrIPD, ':');
data = ptrIPD+1; //1}}}
if(data[0] == '0')
{
GPIO_ResetBits(GPIOE, GPIO_Pin_7);
PUMP1LEDdata=0; }
if(data[0] == '1')
{ GPIO_SetBits(GPIOE, GPIO_Pin_7);
PUMP1LEDdata=1; }
}
}
ESP8266_SendCmd(PUB_TOPIC3, \"OK\");
delay_ms(200);
memset(PUB_TOPIC3,0,sizeof(PUB_TOPIC3));
ptrIPD=NULL;
data =NULL;
ESP8266_Clear();
}
}
}
3.3 RTOS操作系統多任務設計
FreeRTOS嵌入式實時操作系統的主要特點是支持多任務,允許多個任務同時存在,并根據一定的調度規則進行任務切換。多任務使CPU的利用率達到最大,可以將軟件最大程度地模塊化,便于編寫。本系統將工作劃分為3個任務,優先級從高到低依次是數據采集與發送任務、預警控制任務、命令下發任務。數據采集與發送任務通過STM32單片機與傳感器的通信實現數據采集,并將數據通過ESP8266模塊發送至阿里云服務器。預警控制任務監控水質數據,當檢測到異常時,通過單片機控制相關設備(例如加藥泵、蜂鳴器和繼電器)進行處理。命令下發任務通過客戶端向阿里云服務器下發命令,使用串口和DMA中斷實現數據的高效接收和處理,以實現對終端設備的遠程控制[6]。部分關鍵代碼如下。
//數據上傳任務函數
void upload_data_task(void *pvParameters)
{
while (1)
{
ESP8266_GetIPD();
float TSWvalue = TSW30Monitor_function(); " " float TDSvalue = TDSMonitor_function(); float PHvalue = PHMonitor_function(); float TEMPvalue = DS18B20_Get_Temp()/10;
float Distance = HCSR04_GetDistance(TEMPvalue)/10;
float facilityvalue =DS18B201_Get_Temp()/10;
ESP8266_SendData(TEMPvalue,TSWvalue,TDSvalue,PHvalue,Distance,facilityvalue);
ESP8266_Clear(); vTaskDelay(4000);
}
}
//命令下發任務函數
void Order_issuance_task(void *pvParameters)
{
while(1)
{
ESP8266_GetIPD();
vTaskDelay(500);
}
}
//報警控制任務函數
void alarm_control_task(void *pvParameters)
{
while(1)
{
ESP8266_GetIPD();
float TSWvalue = TSW30Monitor_function(); float TDSvalue = TDSMonitor_function(); float
PHvalue = PHMonitor_function();
float TEMPvalue = DS18B20_Get_Temp()/10; float Distance = HCSR04_GetDistance(TEMPvalue)/10;
Alarm_function( TEMPvalue, TSWvalue, TDSvalue, PHvalue, Distance);
vTaskDelay(500);
}
}
//創建數據上傳任務
xTaskCreate((TaskFunction_t )upload_data_task,
(const char* )\"upload_data_task\",
(uint16_t )upload_data_STK_SIZE,
(void* )NULL,
(UBaseType_t )upload_data_TASK_PRIO,
(TaskHandle_t* )amp;upload_data_Task_Handler);
vTaskStartScheduler(); //開啟任務調度
}
3.4 服務器及客戶端系統設計
系統采用阿里云物聯網平臺,確保了設備連接的安全性和數據的可靠傳輸。首先,在平臺上創建設備,獲取設備的三元組信息(ProductKey、DeviceName、DeviceSecret)。其次,在ESP8266模塊上安裝MQTT協議驅動,編寫程序并通過ESP8266模塊發送AT指令連接到阿里云服務器,并發布/訂閱主題,實現設備與服務器之間的數據交換。
客戶端終端采用C++語言編寫,使用QT進行界面設計和開發。利用MQTT協議與阿里云服務器進行數據交換。通過獲取云服務器的IP地址、端口號、設備的三元組信息以及MQTT版本號,實現與服務器的連接。通過訂閱Topic主題來實時獲取終端設備上的數據。客戶端連接到阿里云服務器的部分關鍵代碼如下。
void fun::ConnectAliyun()
{
m_client = new QMqttClient(this);
m_client-gt;setHostname(\"iot-06z00hu6v44x0d3.mqtt.iothub.aliyuncs.com\");
m_client-gt;setPort(1883);
m_client-gt;setClientId(\"k0c599npYF6.water_qtduan|securemode=2,signmethod=hmacsha256,timestamp=1710417924697|\");
m_client-gt;setUsername(\"water_qtduanamp;k0c599npYF6\");
m_client-gt;setPassword(\"3530f5474d68a3b0c1fea1d0b3c4953b927ce92ed00af91df4d19f6cde57ff8e\");
m_client-gt;setProtocolVersion(QMqttClient::MQTT_3_1_1);
m_client-gt;connectToHost();
QObject::connect(m_client, amp;QMqttClient::connected, this, amp;fun::onConnected);
m_client-gt;connectToHost();
QObject::connect(m_client,amp;QMqttClient::messageReceived,this,amp;fun::onMessageReceived);
}
4 系統綜合測試
系統初始化與傳感器監測:開啟電源后,STM32單片機初始化外圍設備,系統自動配置ESP8266模塊,通過發送AT指令連接Wi-Fi,根據三元組信息,利用AT指令接入阿里云服務器,同時訂閱主題,用于請求數據到服務器。系統初始化成功后,聽到蜂鳴器發出一聲鳴叫,LED綠燈亮起,表示設備準備就緒。
水質監測和數據傳輸:傳感器開始監測水源,溫度傳感器、TDS傳感器、濁度傳感器、pH傳感器均浸沒在水源中,超聲波傳感器安裝在水箱的頂部位置。STM32單片機通過USART串口將數據傳輸至電腦進行顯示和調試[7]。利用RTOS操作系統的多任務處理機制,每5s采集水質數據并發送至阿里云服務器,客戶端接收數據后,以數據和折線圖的形式進行展示,經過觀察,監測到的水質數據均在誤差范圍內。
溫度閥值設置和控制:在客戶端手動設定設備環境溫度閾值為60℃,同時發送命令至單片機。利用打火機在溫度傳感器附近進行模擬熱源。當模擬高溫環境時,系統觸發警報,LED指示燈變紅。溫度下降后,警報解除,LED指示燈變綠[8]。
遠程控制加藥泵:在數據采集和傳輸功能正常運行下,利用RTOS多任務處理機制,通過客戶端遠程控制加藥泵。單擊打開繼電器,連接在繼電器上的加藥泵開始工作,自動添加藥劑到測試水源中;單擊關閉繼電器,加藥泵停止工作,表示加藥完成。
5 結語
本文通過傳感器模塊實時監測小區生活污水水質,結合STM32單片機和RTOS操作系統進行數據采集與處理。通過MQTT協議,利用ESP8266模塊將數據傳輸至阿里云服務器,實現數據的遠程傳輸和硬件終端的遠程控制,有效解決了傳統監測手段中人力資源浪費和實時性不足的問題,通過試驗驗證了系統的可行性和穩定性。系統采用智能化和遠程監控設計,使監測人員能夠實時監控水資源質量。未來還可進一步擴展功能,例如增加水質大數據分析、智能決策支持等,進一步提升小區水質管理的智能化水平。
參考文獻
[1]安芳萊.一體化生活污水處理裝置在天竺空港小區工程中的應用[J].科技資訊,2011(24):38-39.
[2]馮遠翔,潘小琴.基于物聯網的水質實時在線監測系統[J].物聯網技術,2019,9(7):69-71.
[3]史磊.基于單片機的水情監測系統的設計[J].電子制作,2022,30(15):30-33,25.
[4]廖東南. 一種在線實時水質監測系統的開發及其通訊機制的實現[D].北京:清華大學,2005.
[5]蘭翔.自動化監測技術在水質檢測中的應用與研究[J].能源與環保,2021,43(7):269-274.
[6]郭富恒,賀媛媛.基于FreeRTOS的物聯網溫度監測系統[J].智能物聯技術,2022,5(2):48-52.
[7]楊曉芳,徐煒旻.基于單片機的水質檢測系統[J].信息記錄材料,2022,23(9):153-155.
[8]任豐蘭,操政,姚星.基于單片機的水質檢查系統設計[J].機電工程技術,2023,52(6):166-169,248.
通信作者:白偉華(1976-), 男,漢族,教授,碩士生導師,研究方向為資源調度優化、協同計算、深度學習。