物联网实战:STM32+ESP8266温湿度数据采集上传Linux服务器与数据库可视化(附代码示例)

摘要: 本文将手把手教你搭建一个完整的物联网数据监控平台,使用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配置工程
  1. 新建工程,选择STM32F103C8T6芯片。
  2. 配置RCC时钟源为外部晶振。
  3. 配置GPIO引脚,用于DHT11数据读取和ESP8266通信。
  4. 配置USART1用于与ESP8266通信。
  5. 生成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 编译下载
  1. 在Keil MDK中编译工程。
  2. 将编译生成的hex文件下载到STM32开发板。

五、Linux服务器配置

5.1 安装软件
  1. 使用apt-get安装必要的软件包:
sudo apt-get update
sudo apt-get install python3 python3-pip mysql-server
  1. 安装Python库:
pip3 install flask pymysql
5.2 创建MySQL数据库及数据表
  1. 登录MySQL:
mysql -u root -p
  1. 创建数据库:
CREATE DATABASE iot_data;
  1. 创建数据表:
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);
}

 

  1. 运行Python数据接收脚本: 在Linux服务器上执行 python3 data_receiver.py 启动Flask应用,监听来自ESP8266的数据。

  2. 烧录STM32程序并观察串口输出:

    • 编译并烧录STM32代码到开发板。
    • 打开串口调试工具,设置波特率与代码一致。
    • 观察串口输出,确认DHT11数据读取正常,且ESP8266成功连接WiFi并发送数据。
  3. 查看MySQL数据库确认数据存储:

    • 使用Navicat for MySQL或命令行工具连接到MySQL数据库。
    • 查看iot_data数据库中的temp_humidity表,确认数据已成功插入。
  4. 运行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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音本地生活火爆!普通人如何申请抖音本地生活服务商?

当前,随着抖音外卖的正式开放,抖音本地生活的热度也迎来了新的高潮,与抖音本地生活服务商怎么申请等话题相关的词条更是成为了多个创业者社群的热搜榜单的常客。 事实上,就抖音本地生活服务商怎么申请等问题本身而言,…

nvm安装报错(镜像问题)

一、问题报错 安装的时候如果跟着网上早些时候的配置,调整了setting文件,配置镜像的话,可能报这个错误。 这个是因为他没检索到后面的链接地址,因为镜像的地址新的已经更换了。使用这个吧: node_mirror: https://npm…

java基础01—根据源码分析128陷阱以及如何避免128陷阱

源码分析128陷阱 如上图所示,int类型数据超过127依旧能正常比较,但Integer类型就无法正确比较了 /*** Cache to support the object identity semantics of autoboxing for values between* -128 and 127 (inclusive) as required by JLS.** The cache …

视频监控管理平台智能边缘分析一体机视频监控系统客流统计检测算法

在当今数据驱动的时代,客流统计作为商业分析的重要手段,其准确性和实时性对于商家决策具有至关重要的影响。随着技术的发展,智能边缘分析一体机结合了边缘计算与深度学习技术,为客流统计提供了更为高效、精准的解决方案。 首先&am…

美容师有什么话术技巧?美业人如何提升自己的销售技巧?博弈美业门店管理系统分享经验

作为一名美容师,有一些话术和销售技巧可以帮助你提升服务质量和销售业绩。以下是博弈美业收银系统分享的一些建议: 1.建立信任: 在与客户交流时,表现出真诚、友好和专业的态度。倾听客户的需求,并给予针对性的建议&a…

跟我练习100道FPGA入门题目~(2/100)

难度指数:一颗星 关键词:组合逻辑、入门基础 点击此处直接答题:F学社-全球FPGA技术提升平台 (zzfpga.com) 提交代码就能看到波形图和电路图啦! (在社区加入群聊,更多学友等着和你探讨~)

CTF-PWN-kernel-前置

文章目录 打包上传测试脚本检查保护调试脚本编写Intel Syntax特点:示例: AT&T Syntax特点:示例: 对比总结 c库中asm的汇编 用到啥更新啥,一直更新ing 打包上传测试脚本 #!/bin/sh gcc expolit.c -static -masmintel -g -o expolit mv expolit fs/ cd core find…

淮北在选择SCADA系统时,哪些因素会影响其稳定性?

关键字:LP-SCADA系统, 传感器可视化, 设备可视化, 独立SPC系统, 智能仪表系统,SPC可视化,独立SPC系统 在选择SCADA系统时,稳定性是一个关键因素,因为它直接影响到生产过程的连续性和安全性。以下是一些影响SCADA系统稳定性的因素: 硬件质量…

微服务-初级篇

微服务-初级篇 认识微服务1.1 单体架构1.2 分布式架构1.3 微服务 SpringCloud2.1 了解2.2 服务拆分原则2.3 服务拆分效果 Nacos注册中心3.1 认识和安装Nacos3.1.1 Nacos下载3.1.2 Nacos安装 3.2 服务注册到Nacos Feign远程调用4.1 Feign引入4.2 Feign配置 认识微服务 1.1 单体…

Zynq系列FPGA实现SDI视频编解码+UDP以太网传输,基于GTX高速接口,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的以太网方案本博已有的FPGA图像缩放方案1G/2.5G Ethernet PCS/PMA or SGMII架构以太网通信方案AXI 1G/2.5G Ethernet Subsystem架构以太网通信方案本方案的缩放应用本方案在Xilinx--Kintex系列…

2024年全国青少年信息素养大赛复赛及决赛、我知道的有这些

周末两天2024年全国青少年信息素养大赛复赛部分赛区已经结束,还没有考试的同学加紧备考后面的2次,成绩预计(7月13日、7月20日两次考试)结束之后的2周左右出,2024年全国青少年信息素养大赛决赛将在2024年8月16日-20日在…

解决:Flink向kafka写数据使用Producer精准一次(EXACTLY_ONCE)异常

在使用flink向kafka写入数据报错:Caused by: org.apache.kafka.common.KafkaException: Unexpected error in InitProducerIdResponse; The transaction timeout is larger than the maximum value allowed by the broker (as configured by transaction.max.timeou…

文献解读-基准与方法研究-第十六期|《GeneMind 公司的 GenoLab M 测序平台 WGS 和 WES 数据基准测试》

关键词:基准与方法研究;基因测序;变异检测; 文献简介 标题(英文):Accuracy benchmark of the GeneMind GenoLab M sequencing platform for WGS and WES analysis标题(中文&#xf…

差分+前缀和习题集

&#xff08;luogu题号&#xff09; P6568 [NOI Online #3 提高组] 水壶 思路分析 前缀和优化问题。 其实题意就是让你求有k1个数的区间和最大值&#xff0c;那么直接前缀和优化&#xff0c;就可以通过本题。 代码 #include<bits/stdc.h> using namespace std;const in…

机器学习——关于极大似然估计法的一些个人思考

最近在回顾机器学习的一些相关理论知识&#xff0c;回顾到极大似然法时&#xff0c;对于极大似然法中的一些公式有些迷糊了&#xff0c;所以本文主要想记录并分享一下个人关于极大似然估计法的一些思考&#xff0c;如果有误&#xff0c;请见谅&#xff0c;欢迎一起前来探讨。当…

【Linux】升级FastJSON版本-jar

摘要 在长期运行的应用服务器上&#xff0c;近期的安全漏洞扫描揭示了fastjson组件存在潜在的安全隐患&#xff08;FastJSON是一个Java 语言实现的 JSON 解析器和生成器。FastJSON存在远程代码执行漏洞&#xff0c;恶意攻击者可以通过此漏洞远程执行恶意代码来入侵服务器&…

Dynadot 2024年第一季度回顾

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

java进程把服务器CPU打满问题排查

1、top命令定位问题进程 2、查看进程的所有线程信息&#xff0c;记下占用最高的进程 top -Hp 38080553、将第2步得到的线程号转化为十六进制 printf %x\n 38080594、结果里搜索 jstack 3808055|grep -A 10 3a1b3b5、定位问题 根据上步搜索到的结果&#xff0c;可以看到是GC…

关闭这八个电脑设置,保护个人隐私

你知道吗&#xff1f;电脑可能一直在偷窥你的小秘密。朋友们&#xff0c;一定要记得关闭这8个电脑设置哦&#xff0c;这样可以有效地保护我们的个人隐私。 按住键盘Windows键加i键&#xff0c;快速打开Windows设置。然后点击隐私选项。 我们来看基本的常规设置。里面有四个设置…

在表格中选中el-radio后, 怎么获取选中的这一行的所有数据?

演示: 图中, 选中这行数据后, 怎么获取到当前的数据? 代码: <tr v-for"item in gridData"><td><input type"radio" v-model"checkout" change"getDateFn" :data-type"item.articleType" :data-channelNam…