物联网实战: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://xiahunao.cn/news/3224842.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

使用Puppeteer进行数据抓取保存为JSON

Puppeteer简介 Puppeteer是由Google Chrome团队开发的一个Node库,它提供了一个高级API来控制Chrome或Chromium的无头版本。Puppeteer能够执行各种任务,包括页面导航、内容抓取、屏幕截图、PDF生成等。 主要特点 无头浏览器控制:无需打开浏…

0010基于免疫遗传算法的配送中心选址

免疫优化算法(Immune Optimization Algorithm, IOA)在物流配送中心选址中的应用是通过模拟免疫系统的进化过程来解决选址优化问题。物流配送中心选址问题涉及到如何在给定区域内选择最优的位置,以最大化服务覆盖并最小化运输成本。 免疫优化…

使用昇腾芯片进行多卡训推时使用hccl_tools.py为npu分配ip报错问题解决办法

目录 问题描述问题产生原因解决办法最终执行并验证参考网站命令扩展 问题描述 昇腾芯片(910b/310p等)进行多卡训练或者推理时需要先获取并配置每张npu的ip信息,因此需要执行类似下面问题: python mindformers/tools/hccl_tools.…

【高等数学】第五章知识点:二重积分

文章目录 一. 二重积分的概念与性质1. 二重积分概念2. 二重积分的性质2.1. 不等式性质2.2. 中值定理 二. 二重积分的计算1. 利用直角坐标计算2. 利用极坐标计算3. 利用函数的奇偶性计算4. 利用变量的轮换对称性计算 一. 二重积分的概念与性质 1. 二重积分概念 几何意义&#x…

Skywork-MoE,1460亿MoE模型,采用MoE Upcycling技术

Skywork-MoE,1460亿MoE模型,采用MoE Upcycling技术 原创 每日发现最新LLM 机器之心SOTA模型 2024年06月04日 18:27 北京 🏆 基座模型 ①项目名称:Skywork-MoE ★Skywork-MoE是一款千亿模型,具有1460亿参数、16个专家…

websockt初始化,创建一个webSocket示例

写文思路: 以下主要从几个方面着手写websocket相关,包括以下:什么是webSocket,webSocket的优点和劣势,webSocket工作原理,webSocket握手示例,如何使用webSocket(使用webSocket的一个示例)&#…

uni-app三部曲之三: 路由拦截

1.引言 路由拦截,个人理解就是在页面跳转的时候,增加一级拦截器,实现一些自定义的功能,其中最重要的就是判断跳转的页面是否需要登录后查看,如果需要登录后查看且此时系统并未登录,就需要跳转到登录页&…

数据结构(初阶2.顺序表)

文章目录 一、线性表 二、顺序表 2.1 概念和结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3动态顺序表的实现 1.SeqList.h 2.SeqList.c 打印顺序表 初始化 销毁 增容 尾插 头插 在指定位置之前插入数据 尾删 头删 在指定位置删除数据 3.test.c 一、线性表 线性表&#…

Linux学习——Linux中无法使用ifconfg命令

Linux学习——Linux中无法使用ifconfg命令? 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅…

MemFire Cloud: 一种全新定义后端即服务的解决方案

在这个快节奏的互联网时代,开发者们最希望的就是能够省时省力地完成项目,快速上线。然而,搭建服务、开发接口API、处理各种后端问题,往往让人头疼不已。别担心,现在有了MemFire Cloud,一款为懒人开发者量身…

Flutter-实现物理小球碰撞效果

效果 引言 在Flutter应用中实现物理动画效果,可以大大提升用户体验。本文将详细介绍如何在Flutter中创建一个模拟物理碰撞的动画小球界面,主要代码实现基于集成sensors_plus插件来获取设备的加速度传感器数据。 准备工作 在开始之前,请确保在pubspec.yaml文件中添加senso…

Java版Flink使用指南——合流

大纲 新建工程无界流奇数Long型无界流偶数Long型无界流奇数String型无界流 合流UnionConnect 测试工程代码 在《Java版Flink使用指南——分流导出》中,我们通过addSink进行了输出分流。本文我们将介绍几种通过多个无界流输入合并成一个流来进行处理的方案。 新建工…

使用 Hugging Face 的 Transformers 库加载预训练模型遇到的问题

题意: Size mismatch for embed_out.weight: copying a param with shape torch.Size([0]) from checkpoint - Huggingface PyTorch 这个错误信息 "Size mismatch for embed_out.weight: copying a param with shape torch.Size([0]) from checkpoint - Hugg…

悠律凝声环ringbuds pro开放式耳机:音乐世界的新探索

随着技术发展和生活节奏加快,耳机已经成为了人们日常生活中不可或缺的数码设备。在这样的背景下,悠律凝声环开放式耳机,将高端素皮和编织纹理进行混搭,获得了德国红点奖、美国MUSE缪斯奖等多项国际大奖,展现出时尚与质…

经典双通道比较器LM393、LM393B、LM2903B、LM193、LM293和LM2903介绍及输入输出仿真

前言: LM393 SOP8封装的外观与丝印 LM393出现几十年了,是一款经典的双比较器,非常经典,用的比较多,新的比较器大家也要多关注。 该类型比较器,虽然静态电流较小,但在电池电路中耗电是巨大的&…

数据结构基础--------【二叉树题型】

1、前提(待补充) 1.**DFS(Depth First Search)😗*递归法得到最终的数组(深度优先算法) 其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,如果遇到死路就往回退,回退过程中如果遇…

短剧新风潮:海外制作的艺术与技术

海外短剧新风潮在艺术与技术两个维度上都展现出了显著的创新与进步。 艺术层面 1、内容创新: (1)多元化与包容性:海外短剧在内容创新上更加注重多元化和包容性,将不同地域、民族的文化元素融入创作中,展现丰…

FUSE(用户空间文件系统)命令参数

GPT-4 (OpenAI) FUSE (Filesystem in Userspace)是一个允许创建用户空间文件系统的接口。它提供了一个API,让开发者在未修改内核代码的情况下,通过自己的程序实现文件系统。FUSE 文件系统通常通过 mount 命令来挂载,而且这个命令可以接受各…

【QML之·基础语法概述】

系列文章目录 文章目录 前言一、QML基础语法二、属性三、脚本四、核心元素类型4.1 元素可以分为视觉元素和非视觉元素。4.2 Item4.2.1 几何属性(Geometry):4.2.2 布局处理:4.2.3 键处理:4.2.4 变换4.2.5 视觉4.2.6 状态定义 4.3 Rectangle4.3.1 颜色 4.4…

人话学Python-基础篇-字符串

一:字符串的定义 在Python中使用引号来定义。不论是单引号还是双引号。 str1 Hello World str2 "Hello World" 二:字符串的访问 如果我们要取出字符串中单独的字符,需要使用方括号来表示取得的位置。如果要取出字符串的子串&…