ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于STM32与ESP8266的物联网温湿度监测系统全栈开发指南

基于STM32与ESP8266的物联网温湿度监测系统全栈开发指南

最近在做一个智能农业大棚的项目,客户提了一个很实际的需求:能不能实时看到棚里的温度和湿度,数据最好能传到手机上,设备要稳定,成本还不能太高。这让我想起了几年前做类似项目时,用一堆分立元件、自己写协议、调试串口的痛苦经历。现在,基于STM32和成熟物联网模块的方案,已经能让这件事变得像搭积木一样简单。

今天要分享的,就是一个完全开源的“基于STM32的温湿度在线监测系统”。它绝不仅仅是一个简单的传感器读数Demo。这个项目的核心价值在于,它完整地演示了如何将一个嵌入式设备的数据,稳定、可靠、低成本地“在线化”,并最终呈现在一个现代Web界面上。对于想从单片机裸机开发迈向物联网应用的开发者来说,这是一个绝佳的“全栈”练手项目。

如果你正在学习STM32,想了解如何连接传感器、如何处理数据、如何通过4G/NB-IoT/Wi-Fi上传数据,以及后端和前端如何接收并展示这些数据,那么这篇文章就是为你准备的。我会从硬件选型、软件架构、代码实现到云端部署,一步步拆解,并提供完整的开源代码。你会发现,构建一个可用的物联网监测系统,门槛并没有想象中那么高。

1. 为什么你需要一个“在线”监测系统?

在开始技术细节之前,我们先明确一个问题:为什么是“在线监测”?传统的本地LCD显示、SD卡存储方案不行吗?

当然可以,但它们解决的是不同维度的问题。本地方案的核心是实时查看与离线记录,而在线方案的核心是远程感知与集中管理。想象一下这些场景:

  • 设备部署在野外或难以触及的角落:比如高山气象站、分布式水塔、大型仓库的角落。你不可能每次都跑过去抄表。
  • 需要同时监控成百上千个点:比如连锁店内的冷链柜、智慧农业的多个大棚。人工巡检的成本是天文数字。
  • 数据需要用于进一步分析和预警:当温湿度超过阈值时,立即给管理员手机发送告警短信或推送,而不是等下次巡检才发现问题。
  • 历史数据回溯与报表生成:需要分析过去一周、一月的温湿度变化趋势,为决策提供依据。

“在线化”就是将单片机的数据,通过无线网络,注入到互联网的数据流中。STM32负责精准采集和初步处理,无线模块负责可靠传输,云平台负责海量存储、实时计算和可视化展示。三者各司其职,构成了现代物联网监测的典型架构。

我们这个项目,就是要打通从“传感器”到“网页图表”的完整链路。

2. 系统架构与核心组件选型

一个完整的在线监测系统,通常包含以下四层:

  1. 感知与控制层:以STM32为核心,连接温湿度传感器,负责数据采集、滤波和本地逻辑控制。
  2. 网络传输层:负责将STM32处理后的数据打包,通过无线网络发送到远端的云服务器。这是实现“在线”的关键。
  3. 云平台层:接收并存储海量设备数据,提供设备管理、数据解析、规则引擎(如超限报警)和API接口。
  4. 应用层:面向最终用户的Web页面或手机APP,用于数据可视化、设备状态监控和远程设置。

对于个人开发者或中小型项目,自建完整的云平台和后端成本高昂。因此,本项目采用了一种高性价比的混合架构:

  • 硬件端(STM32 + 模块):完全自主开发,掌握核心。
  • 云端与服务端:选用成熟的第三方物联网云平台(如阿里云物联网平台、OneNET、ThingsBoard开源版)来承接设备连接和数据存储,极大降低了后端开发复杂度。
  • 前端:使用简单的Web技术(如Vue.js + ECharts)调用云平台API来展示数据。

2.1 硬件选型清单与考量

以下是本项目的核心硬件组件,选择它们是基于稳定性、通用性和成本的综合考虑:

组件推荐型号说明替代方案
主控MCUSTM32F103C8T6 (蓝桥杯/正点原子开发板常用)ARM Cortex-M3内核,72MHz主频,64KB Flash,20KB RAM。性能足够,资料极多,性价比之王。STM32G系列(性能更强),STM32F4系列(带浮点单元)
温湿度传感器DHT11数字输出,单总线通信,成本极低。精度:湿度±5%RH,温度±2℃。适用于要求不高的场合。DHT22(AM2302):精度更高(湿度±2%RH,温度±0.5℃)。SHT30:I2C接口,工业级精度和稳定性。
无线传输模块ESP8266 (Wi-Fi)最流行的Wi-Fi SOC,可直接运行AT指令或编程。适合有Wi-Fi覆盖的环境。ESP32:功能更强,支持蓝牙。4G Cat.1模块:如移远EC200S,无Wi-Fi时用蜂窝网络。NB-IoT模块:如移远BC95,低功耗,适合电池供电。
显示模块(可选)0.96寸 OLED (SSD1306驱动)I2C接口,用于本地实时显示,方便调试。LCD1602, TFT屏幕
其他USB转TTL串口模块用于程序下载和调试打印。ST-Link/V2调试器

选型核心逻辑

  • 精度要求:如果只是看个大概趋势,DHT11足够;如果需要精确控制(如实验室、精密仓储),建议选择SHT30或更专业的传感器。
  • 网络环境:有稳定Wi-Fi,首选ESP8266,最简单;设备在移动或无Wi-Fi场景,必须选择4G或NB-IoT模块。
  • 功耗考量:常年插电的设备,无需考虑;电池供电且需长期工作(如一年),NB-IoT是首选,但需注意其数据传输的延迟和成本。

本项目将以STM32F103C8T6 + DHT11 + ESP8266 (AT指令模式)这一最经典的组合进行详解,其他组合的原理相通。

3. 开发环境与工程准备

在开始写代码前,请确保你的开发环境已就绪。

3.1 软件环境准备

  1. 集成开发环境 (IDE)
    • Keil uVision 5 (MDK-ARM):STM32开发最主流的IDE之一。需要安装对应的STM32F1 Device Family Pack。
    • STM32CubeIDE:ST官方推出的免费IDE,基于Eclipse,集成STM32CubeMX配置工具,生成代码更方便。(本项目示例将基于此环境)
  2. 串口调试助手:用于查看STM32和ESP8266的打印信息。如XCOM、SSCOM、Putty等。
  3. 网络调试助手:用于模拟TCP服务器,测试ESP8266的网络连接。如NetAssist。
  4. 前端开发环境(可选):Node.js、Vue CLI,用于运行和构建前端项目。

3.2 创建STM32CubeMX工程

STM32CubeMX能图形化配置引脚、时钟、外设,生成初始化代码,极大提高效率。

  1. 新建项目:打开STM32CubeMX,选择STM32F103C8Tx
  2. 配置时钟:在RCC中,将HSE设置为Crystal/Ceramic Resonator。在Clock Configuration标签页,将系统时钟(HCLK)配置为72MHz。
  3. 配置串口:这是与ESP8266通信的关键。
    • 启用USART1(或USART2,根据你的板子连接)。模式为Asynchronous(异步)。
    • 配置波特率为115200(与ESP8266默认波特率一致)。
    • 开启串口中断(NVIC Settings中使能USARTx global interrupt),便于接收ESP8266的响应。
  4. 配置GPIO
    • 找到连接DHT11数据线的引脚(例如PA0),将其设置为GPIO_Output初始状态为高电平。实际上,DHT11的单总线协议需要动态切换引脚的输入输出模式,我们将在代码中实现。
    • 配置一个LED引脚(如PC13,蓝桥杯板上的用户LED),用于指示系统状态。
  5. 生成代码
    • Project Manager标签页,设置项目名称和路径,选择Toolchain / IDESTM32CubeIDE
    • 点击GENERATE CODE生成工程。

4. 核心驱动与逻辑代码实现

生成了基础工程后,我们需要在Core/Src/main.c和自行添加的文件中编写业务逻辑。

4.1 DHT11温湿度传感器驱动

DHT11使用单总线协议,时序要求严格。我们需要编写一个可靠的驱动。

首先,在Core/Inc文件夹下创建dht11.h头文件:

// dht11.h #ifndef __DHT11_H #define __DHT11_H #include "main.h" // 根据你的硬件连接修改 #define DHT11_GPIO_PORT GPIOA #define DHT11_GPIO_PIN GPIO_PIN_0 // 函数声明 void DHT11_Init(void); uint8_t DHT11_Read_Data(uint8_t *temperature, uint8_t *humidity); uint8_t DHT11_Check_Response(void); void DHT11_Delay_us(uint16_t us); // 微秒级延时函数,需要根据系统时钟实现 #endif

接着,在Core/Src文件夹下创建dht11.c源文件。这里给出核心的数据读取函数:

// dht11.c (部分核心代码) #include "dht11.h" // 微秒延时函数,需根据你的系统时钟频率实现,此处为示例 void DHT11_Delay_us(uint16_t us) { uint32_t ticks = us * (SystemCoreClock / 1000000) / 5; // 粗略计算 while(ticks--) { __NOP(); } } uint8_t DHT11_Read_Data(uint8_t *temp, uint8_t *humi) { uint8_t buf[5] = {0}; uint8_t i, j; // 1. 主机发出起始信号 HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_RESET); DHT11_Delay_us(18000); // 拉低至少18ms HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_SET); DHT11_Delay_us(30); // 拉高20-40us // 2. 设置引脚为输入,等待DHT11响应 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = DHT11_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct); // 3. 检测DHT11响应 if(DHT11_Check_Response() == 0) { return 0; // 响应失败 } // 4. 读取40位数据 (8位湿度整数+8位湿度小数+8位温度整数+8位温度小数+8位校验和) for(i=0; i<5; i++) { for(j=0; j<8; j++) { // 等待低电平结束(表示数据位开始) while(HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET); DHT11_Delay_us(40); // 延时40us后检测电平 if(HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET) { buf[i] |= (1 << (7-j)); // 高电平表示‘1’ // 等待高电平结束 while(HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET); } // 低电平表示‘0’,无需操作 } } // 5. 校验数据 if(buf[4] == (buf[0] + buf[1] + buf[2] + buf[3])) { *humi = buf[0]; *temp = buf[2]; return 1; // 读取成功 } return 0; // 校验失败 }

4.2 ESP8266 WiFi模块驱动(AT指令)

我们将ESP8266连接到STM32的USART1,使用AT指令控制。首先,封装一个发送指令并等待响应的函数。

Core/Src/main.c中,或者单独创建esp8266.c/h文件:

// 在 main.c 中或 esp8266.c 中的示例函数 #include <string.h> UART_HandleTypeDef huart1; // CubeMX生成的句柄 uint8_t uart_rx_buf[256]; // 接收缓冲区 uint8_t rx_len = 0; // 发送AT指令并等待指定响应(简化版) uint8_t ESP8266_SendCmd(char *cmd, char *expect_resp, uint32_t timeout) { char resp_buf[128] = {0}; uint32_t start_tick = HAL_GetTick(); // 清空接收缓冲区 rx_len = 0; memset(uart_rx_buf, 0, sizeof(uart_rx_buf)); // 发送指令 HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), 1000); HAL_UART_Transmit(&huart1, (uint8_t*)"\r\n", 2, 100); // 发送回车换行 // 等待响应 while((HAL_GetTick() - start_tick) < timeout) { // 这里需要实现UART中断接收,将数据存入uart_rx_buf,并更新rx_len // 假设数据已接收在 uart_rx_buf 中 if(strstr((char*)uart_rx_buf, expect_resp) != NULL) { return 1; // 成功 } HAL_Delay(10); } return 0; // 超时失败 } // 在main函数初始化部分,配置ESP8266 void ESP8266_Init(void) { HAL_Delay(2000); // 等待模块启动 // 1. 测试AT指令 while(ESP8266_SendCmd("AT", "OK", 2000) == 0) { HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // LED闪烁,指示未就绪 HAL_Delay(500); } // 2. 设置为Station模式(设备模式) ESP8266_SendCmd("AT+CWMODE=1", "OK", 5000); // 3. 连接Wi-Fi (替换你的SSID和密码) char wifi_cmd[64]; sprintf(wifi_cmd, "AT+CWJAP=\"Your_SSID\",\"Your_Password\""); while(ESP8266_SendCmd(wifi_cmd, "OK", 10000) == 0) { // 连接失败,重试或处理 HAL_Delay(1000); } // 4. 启用多连接 ESP8266_SendCmd("AT+CIPMUX=0", "OK", 2000); // 单连接模式 // 连接成功指示 HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); }

4.3 主程序逻辑与数据上传

主循环中,我们周期性地读取传感器数据,并通过ESP8266以TCP协议发送到服务器。

// main.c 中的主循环部分 (while(1)) int main(void) { // ... HAL初始化,系统时钟配置等(由CubeMX生成) MX_GPIO_Init(); MX_USART1_UART_Init(); // ... DHT11_Init(); ESP8266_Init(); // 初始化Wi-Fi并连接 uint8_t temperature, humidity; char tcp_send_buf[128]; uint32_t last_send_time = 0; while (1) { // 每5秒读取并发送一次数据 if(HAL_GetTick() - last_send_time > 5000) { last_send_time = HAL_GetTick(); if(DHT11_Read_Data(&temperature, &humidity)) { // 1. 建立TCP连接到服务器(例如:IP为192.168.1.100,端口为8080) char tcp_conn_cmd[64]; sprintf(tcp_conn_cmd, "AT+CIPSTART=\"TCP\",\"192.168.1.100\",8080"); if(ESP8266_SendCmd(tcp_conn_cmd, "CONNECT", 5000)) { // 2. 准备要发送的数据(例如JSON格式) sprintf(tcp_send_buf, "{\"temp\":%d,\"humi\":%d}", temperature, humidity); // 3. 发送数据 char send_len_cmd[32]; sprintf(send_len_cmd, "AT+CIPSEND=%d", strlen(tcp_send_buf)); if(ESP8266_SendCmd(send_len_cmd, ">", 2000)) { HAL_UART_Transmit(&huart1, (uint8_t*)tcp_send_buf, strlen(tcp_send_buf), 1000); // 等待发送完成提示 // 这里可以简单延时或等待"SEND OK"响应 HAL_Delay(100); } // 4. 关闭连接(根据服务器协议,也可保持长连接) ESP8266_SendCmd("AT+CIPCLOSE", "CLOSED", 2000); } } else { // 读取传感器失败 HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } } HAL_Delay(100); // 主循环延时 } }

5. 服务器端与数据可视化(简易方案)

设备端的数据需要有一个服务器来接收。这里提供一个最简单的Python Flask服务器示例,运行在你的电脑或云服务器上,用于接收并存储数据。

# server.py from flask import Flask, request, jsonify import json import time from datetime import datetime app = Flask(__name__) # 用于存储最新数据,生产环境请用数据库 latest_data = {} @app.route('/upload', methods=['POST']) def upload_data(): try: # 假设设备发送的是JSON格式的POST请求体 # 实际中,ESP8266可能以TCP原始数据发送,需要根据协议解析 data = request.get_json() if data and 'temp' in data and 'humi' in data: latest_data.update(data) latest_data['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(f"[{latest_data['timestamp']}] 收到数据: {data}") return jsonify({"status": "success"}), 200 else: return jsonify({"status": "invalid data"}), 400 except Exception as e: print(f"处理数据时出错: {e}") return jsonify({"status": "error"}), 500 @app.route('/data', methods=['GET']) def get_data(): """提供一个API接口,供前端页面获取最新数据""" return jsonify(latest_data) if __name__ == '__main__': # 注意:在生产环境中,不要使用debug模式,并考虑使用WSGI服务器 app.run(host='0.0.0.0', port=8080, debug=True)

运行这个服务器:python server.py。确保你的电脑和STM32设备在同一个局域网,并将STM32代码中的服务器IP改为你电脑的IP地址。

前端页面可以使用任何你熟悉的技术。这里是一个极简的HTML+JavaScript示例,使用Chart.js绘制实时曲线:

<!-- monitor.html --> <!DOCTYPE html> <html> <head> <title>温湿度实时监测</title> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> </head> <body> <h2>STM32温湿度在线监测</h2> <div> <canvas id="sensorChart" width="800" height="400"></canvas> </div> <div id="currentData"> <p>温度: <span id="currentTemp">--</span> °C</p> <p>湿度: <span id="currentHumi">--</span> %RH</p> <p>更新时间: <span id="updateTime">--</span></p> </div> <script> const ctx = document.getElementById('sensorChart').getContext('2d'); const chart = new Chart(ctx, { type: 'line', data: { labels: [], // 时间标签 datasets: [{ label: '温度 (°C)', data: [], borderColor: 'rgb(255, 99, 132)', tension: 0.1 }, { label: '湿度 (%RH)', data: [], borderColor: 'rgb(54, 162, 235)', tension: 0.1 }] }, options: { responsive: false } }); function fetchData() { // 调用后端 /data 接口 fetch('http://你的服务器IP:8080/data') .then(response => response.json()) .then(data => { if(data.temp && data.humi) { document.getElementById('currentTemp').textContent = data.temp; document.getElementById('currentHumi').textContent = data.humi; document.getElementById('updateTime').textContent = data.timestamp || '刚刚'; // 更新图表(仅保留最近20个点) const now = new Date().toLocaleTimeString(); chart.data.labels.push(now); chart.data.datasets[0].data.push(data.temp); chart.data.datasets[1].data.push(data.humi); if(chart.data.labels.length > 20) { chart.data.labels.shift(); chart.data.datasets[0].data.shift(); chart.data.datasets[1].data.shift(); } chart.update(); } }) .catch(err => console.error('获取数据失败:', err)); } // 每3秒获取一次数据 setInterval(fetchData, 3000); fetchData(); // 页面加载立即获取一次 </script> </body> </html>

monitor.html放在与server.py同目录下,用浏览器打开http://你的服务器IP:8080/static/monitor.html(需要配置Flask静态文件路由,或直接用文件打开)即可看到动态更新的温湿度图表。

6. 进阶:接入物联网云平台

自建服务器对于学习和演示没问题,但对于真实项目,稳定性、可扩展性和安全性是巨大挑战。强烈建议将设备接入成熟的物联网云平台。这里以阿里云物联网平台为例,简述步骤:

  1. 平台注册与产品创建:在阿里云物联网平台创建产品(例如“温湿度监测器”),定义物模型(属性:温度、湿度)。
  2. 创建设备:在产品下创建设备,获取ProductKey,DeviceName,DeviceSecret(三元组)。
  3. 设备端SDK移植:阿里云提供了C语言的Link Kit SDK。你需要将SDK移植到STM32工程中,这涉及网络层(AT Socket)适配、HAL层实现等。这是项目中最有挑战但也最锻炼人的部分。
  4. 修改设备代码:不再直接连接你的TCP服务器,而是调用阿里云SDK的API,将温湿度数据作为属性上报。
  5. 平台查看与前端开发:数据上报后,可以在阿里云平台控制台实时查看。你还可以使用平台提供的“Web可视化开发”工具拖拽生成监控页面,或者调用其API来自行开发更复杂的前端应用。

使用云平台的好处是巨大的:免去了服务器运维、内置设备管理、数据存储、实时计算、规则引擎(报警)、安全认证等全套服务。你只需要专注于设备端的嵌入式逻辑。

7. 常见问题与排查思路

在开发过程中,你几乎一定会遇到下面这些问题。

问题现象可能原因排查方式解决方案
DHT11读取始终失败1. 时序不准确。
2. 上拉电阻未接(DHT11需接4.7K-10K上拉)。
3. 电源电压不稳。
4. 传感器损坏。
1. 用逻辑分析仪或示波器抓取总线波形,对比数据手册时序图。
2. 检查硬件电路。
3. 更换传感器测试。
1. 精细调整延时函数,确保微秒级延时准确。
2. 确保数据线有上拉电阻到VCC。
3. 使用稳定的3.3V供电。
ESP8266无响应1. 串口波特率不匹配(默认115200)。
2. 模块未正确供电(需3.3V,电流峰值可达300mA)。
3. CH_PD/EN引脚未拉高。
4. 模块损坏。
1. 用USB-TTL单独连接ESP8266,用串口助手发“AT”测试。
2. 检查电源电压和电流能力,最好用独立LDO供电。
3. 确认启动引脚电平。
1. 统一使用115200波特率。
2. 使用AMS1117等稳压芯片单独供电,并并联大电容(如220uF)。
3. 确保CH_PD/EN引脚通过10K电阻上拉到3.3V。
ESP8266连不上Wi-Fi1. SSID或密码错误。
2. Wi-Fi路由器设置了MAC过滤或隐藏SSID。
3. 信号太弱。
1. 用手机确认Wi-Fi可连接。
2. 发送AT+CWLAP扫描附近网络,看目标SSID是否存在。
1. 仔细核对SSID和密码,注意大小写和特殊字符。
2. 关闭路由器的MAC过滤,或添加ESP8266的MAC地址到白名单。
3. 靠近路由器或使用信号放大器。
TCP连接服务器失败1. 服务器IP或端口错误。
2. 服务器程序未运行或防火墙阻止。
3. 网络不通(设备与服务器不在同一网络)。
1. 在电脑上用netstat -an查看端口是否监听。
2. 用电脑上的网络调试助手创建TCP服务器测试。
3. 尝试Ping服务器IP。
1. 确认服务器IP和端口,关闭电脑防火墙或添加入站规则。
2. 如果是云服务器,确保安全组开放了对应端口。
3. 对于跨网络,需要使用公网IP或内网穿透工具。
数据上传成功但前端不显示1. 前端JS代码中服务器地址错误。
2. 浏览器跨域问题(CORS)。
3. 后端API返回的数据格式不正确。
1. 打开浏览器开发者工具(F12),查看Console和Network标签页报错。
2. 直接用浏览器访问http://服务器IP:端口/data看能否返回JSON。
1. 修正前端代码中的请求地址。
2. 在Flask后端添加CORS支持(from flask_cors import CORS)。
3. 确保后端返回标准的JSON数据。

8. 项目优化与最佳实践

当你成功跑通基础功能后,可以考虑以下优化,让项目更接近产品级应用:

  1. 数据滤波:传感器数据可能存在抖动。在STM32端实现软件滤波,如滑动平均滤波、中值滤波,再上报平滑后的数据。
  2. 低功耗设计:如果使用电池供电,需要让STM32和ESP8266大部分时间处于休眠模式,定时唤醒采集发送。这涉及GPIO配置、串口唤醒、看门狗等复杂操作。
  3. 掉电存储与断网续传:将历史数据暂存到STM32的Flash或外置EEPROM中,待网络恢复后补传。
  4. 更稳定的通信协议
    • 心跳包:定期发送心跳包到服务器,便于服务器判断设备在线状态。
    • 协议封装:定义简单的应用层协议,包含帧头、设备ID、数据长度、命令字、数据内容、校验和等,提高通信可靠性。
    • 使用MQTT协议:这是物联网领域的事实标准协议,轻量、支持订阅发布模式。阿里云、腾讯云等平台都原生支持MQTT。可以移植开源的MQTT客户端库(如Eclipse Paho MQTT C Client)到STM32。
  5. OTA远程升级:通过云平台下发新固件,让设备自动升级,无需人工干预。这是量产设备的必备功能。
  6. 前端工程化:使用Vue.js、React等框架构建更美观、交互更丰富的前端界面,并部署到Nginx等Web服务器。

9. 总结:从项目到产品还有多远?

通过这个开源项目,我们完成了一个物联网监测系统的核心闭环:感知 -> 传输 -> 云端 -> 展示。它麻雀虽小,五脏俱全,涵盖了嵌入式开发、网络通信、后端接口和前端展示等多个技术栈。

对于学习者而言,这个项目的价值在于提供了一个可运行、可修改、可扩展的范本。你可以:

  • 更换更精确的传感器(如SHT30)。
  • 尝试不同的网络模块(4G、NB-IoT)。
  • 移植到更强大的MCU(如STM32H7)。
  • 接入不同的云平台(腾讯云、华为云、ThingsBoard)。
  • 开发更复杂的前端大屏。

从“项目”到“产品”,关键的差距在于稳定性、可靠性和可维护性。这需要你在异常处理、日志记录、功耗管理、安全认证、批量生产测试等方面投入更多的工程化思考。

所有的代码和更详细的文档,我都已整理并开源在Gitee上。建议你亲手敲一遍代码,而不是直接复制,在解决问题的过程中,你会对每个细节有更深刻的理解。物联网开发的世界很大,这个温湿度监测系统只是一个起点。

返回列表