摘要: 本文将手把手教你搭建一个完整的物联网数据监控平台,使用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()