摘要:?本文將手把手教你搭建一個完整的物聯網數據監控平臺,使用STM32采集溫濕度數據,通過ESP8266 WiFi模塊上傳至Linux服務器,并利用Python腳本將數據存儲到MySQL數據庫,最后實現每日平均值的計算和可視化展示。
關鍵詞:?STM32, ESP8266, Linux, MySQL, 物聯網, 溫濕度傳感器, 數據可視化
一、系統架構
本項目采用典型的物聯網三層架構:
- 感知層:?STM32單片機讀取DHT11溫濕度傳感器數據,并通過ESP8266 WiFi模塊發送至服務器。
- 網絡層:?ESP8266連接路由器,將數據傳輸至公網IP的Linux服務器。
- 應用層:?Linux服務器上的Python腳本接收數據,并存儲到MySQL數據庫。同時,腳本還會計算每日平均值,并提供簡單的可視化圖表。
二、硬件準備
- STM32開發板
- DHT11溫濕度傳感器
- ESP8266 WiFi模塊
- 杜邦線若干
三、軟件準備
- STM32CubeMX
- Keil MDK
- Putty
- Xshell
- MySQL
- Python 3.x
- Navicat for MySQL (可選)
四、STM32端開發
4.1 使用STM32CubeMX配置工程
- 新建工程,選擇STM32F103C8T6芯片。
- 配置RCC時鐘源為外部晶振。
- 配置GPIO引腳,用于DHT11數據讀取和ESP8266通信。
- 配置USART1用于與ESP8266通信。
- 生成Keil MDK工程代碼。
4.2 編寫STM32代碼
// DHT11數據讀取函數
void DHT11_Read_Data(float *temperature, float *humidity);// ESP8266數據發送函數
void ESP8266_Send_Data(char *data);int main(void)
{// 初始化HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();DHT11_Init();float temperature, humidity;char data[50];while (1){// 讀取DHT11數據DHT11_Read_Data(&temperature, &humidity);// 格式化數據sprintf(data, "temperature=%.1f&humidity=%.1f", temperature, humidity);// 通過ESP8266發送數據ESP8266_Send_Data(data);HAL_Delay(5000); // 每5秒采集一次數據}
}
4.3 編譯下載
- 在Keil MDK中編譯工程。
- 將編譯生成的hex文件下載到STM32開發板。
五、Linux服務器配置
5.1 安裝軟件
- 使用apt-get安裝必要的軟件包:
sudo apt-get update
sudo apt-get install python3 python3-pip mysql-server
- 安裝Python庫:
pip3 install flask pymysql
5.2 創建MySQL數據庫及數據表
- 登錄MySQL:
mysql -u root -p
- 創建數據庫:
CREATE DATABASE iot_data;
- 創建數據表:
USE iot_data;
CREATE TABLE temp_humidity (id INT AUTO_INCREMENT PRIMARY KEY,temperature FLOAT,humidity FLOAT,datetime DATETIME DEFAULT CURRENT_TIMESTAMP
);
5.3 編寫Python數據接收腳本
from flask import Flask, request
import pymysqlapp = Flask(__name__)# MySQL數據庫連接信息
db_config = {'host': 'localhost','user': 'root','password': 'your_password','database': 'iot_data'
}@app.route('/data', methods=['POST'])
def receive_data():# 獲取POST請求中的數據temperature = request.form.get('temperature')humidity = request.form.get('humidity')# 連接MySQL數據庫conn = pymysql.connect(**db_config)cursor = conn.cursor()try:# 插入數據sql = "INSERT INTO temp_humidity (temperature, humidity) VALUES (%s, %s)"cursor.execute(sql, (temperature, humidity))conn.commit()print("數據插入成功!")except Exception as e:print(f"數據插入失敗:{e}")conn.rollback()finally:cursor.close()conn.close()return 'OK'if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
5.4 編寫Python數據處理腳本
import pymysql
from datetime import date, timedelta# MySQL數據庫連接信息
db_config = {'host': 'localhost','user': 'root','password': 'your_password','database': 'iot_data'
}def calculate_daily_average():# 計算昨天的日期yesterday = date.today() - timedelta(days=1)# 連接MySQL數據庫conn = pymysql.connect(**db_config)cursor = conn.cursor()try:# 查詢昨天的數據sql = f"SELECT AVG(temperature), AVG(humidity) FROM temp_humidity WHERE DATE(datetime) = '{yesterday}'"cursor.execute(sql)result = cursor.fetchone()# 打印結果if result:avg_temp, avg_humidity = resultprint(f"{yesterday} 的平均溫度:{avg_temp:.2f}℃,平均濕度:{avg_humidity:.2f}%")else:print(f"{yesterday} 沒有數據記錄。")except Exception as e:print(f"數據查詢失敗:{e}")finally:cursor.close()conn.close()if __name__ == '__main__':calculate_daily_average()
六、ESP8266配置
6.1 連接ESP8266
使用USB轉TTL模塊連接ESP8266,并配置好串口調試工具(如Putty)。
6.2 配置ESP8266工作模式
AT+CWMODE=1 // 設置為Station模式
AT+CWJAP="your_wifi_ssid","your_wifi_password" // 連接WiFi
AT+CIPSTART="TCP","your_server_ip",5000 // 建立TCP連接
6.3 修改STM32代碼,通過ESP8266發送數據
// ESP8266數據發送函數
void ESP8266_Send_Data(char *data)
{// 發送AT指令char cmd[100];sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(data));HAL_UART_Transmit(&huart1, (uint8_t *)cmd, strlen(cmd), 1000);// 等待發送提示HAL_UART_Receive(&huart1, rx_buffer, sizeof(rx_buffer), 1000);// 發送數據HAL_UART_Transmit(&huart1, (uint8_t *)data, strlen(data), 1000);// 發送結束符HAL_UART_Transmit(&huart1, (uint8_t *)"\r\n", 2, 1000);
}
?
-
運行Python數據接收腳本:?在Linux服務器上執行?
python3 data_receiver.py
?啟動Flask應用,監聽來自ESP8266的數據。 -
燒錄STM32程序并觀察串口輸出:
- 編譯并燒錄STM32代碼到開發板。
- 打開串口調試工具,設置波特率與代碼一致。
- 觀察串口輸出,確認DHT11數據讀取正常,且ESP8266成功連接WiFi并發送數據。
-
查看MySQL數據庫確認數據存儲:
- 使用Navicat for MySQL或命令行工具連接到MySQL數據庫。
- 查看
iot_data
數據庫中的temp_humidity
表,確認數據已成功插入。
-
運行Python數據處理腳本:
- 等待一段時間,讓系統積累一些溫濕度數據。
- 每天定時運行
python3 data_processor.py
腳本,計算前一天的平均溫濕度并輸出到控制臺。
八、數據可視化 (可選)
為了更直觀地展示溫濕度數據,可以使用Python的數據可視化庫(如Matplotlib)生成圖表。
import matplotlib.pyplot as plt
import pymysql
from datetime import datetime, timedelta# ... (數據庫連接信息與calculate_daily_average函數代碼)# 獲取過去7天的平均溫濕度數據
def get_weekly_average():data = []today = datetime.today()for i in range(7):day = today - timedelta(days=i)sql = f"SELECT AVG(temperature), AVG(humidity) FROM temp_humidity WHERE DATE(datetime) = '{day.strftime('%Y-%m-%d')}'"cursor.execute(sql)result = cursor.fetchone()if result:data.append((day.strftime('%Y-%m-%d'), result[0], result[1]))else:data.append((day.strftime('%Y-%m-%d'), None, None))return dataif __name__ == '__main__':# ... (計算并打印日平均值)# 獲取數據并繪制圖表data = get_weekly_average()dates = [row[0] for row in data]temperatures = [row[1] for row in data]humidities = [row[2] for row in data]plt.plot(dates, temperatures, label="Temperature (°C)")plt.plot(dates, humidities, label="Humidity (%)")plt.xlabel("Date")plt.ylabel("Value")plt.title("Weekly Average Temperature and Humidity")plt.legend()plt.show()