STM32智能温室管理系统开发指南:利用MQTT/HTTP、Node.js、MySQL及React进行数据可视化(代码示例)

news/2024/10/20 6:20:46/
http://www.w3.org/2000/svg" style="display: none;">

一、项目概述

随着农业现代化的推进,智能温室管理系统应运而生。该项目旨在开发一套基于STM32微控制器的智能温室管理可视化系统,通过实时监测温室环境参数(如温度、湿度、光照度等),并对其进行智能控制,提升温室管理的效率和科学性。本系统的核心在于数据采集和控制,通过集成多种传感器,实现温室环境的自动调节,降低人工管理成本,提升作物产量。

项目解决的问题与价值

  1. 实时监测:通过传感器实时监测温室环境,确保作物在最佳生长条件下生长。

  2. 自动控制:依据采集的数据自动调节温室内部设备(如风扇、加热器、通风窗等),保持稳定的环境状态。

  3. 数据可视化:通过可视化界面展示环境数据,便于用户监控和管理温室。

  4. 远程控制:支持无线通信,用户可随时随地对温室进行管理和控制,提高了便利性。

二、系统架构

本系统的架构设计遵循分层原则,主要包含硬件层、嵌入式软件层、通信层、后台服务层和前端界面层。

硬件选择

  • 单片机:STM32系列微控制器,作为温室环境数据采集和控制的核心。

  • 传感器:集成温度传感器(如DHT11)、湿度传感器、光照传感器(如BH1750)等。

  • 控制电路:使用继电器和驱动模块控制风扇、加热器和通风窗等设备。

  • 通信模块:使用Wi-Fi模块(如ESP8266)实现无线通信。

系统架构图

http://www.w3.org/2000/svg" height="454.42486572265625" viewbox="0 0 289 454.42486572265625" class="mermaid-svg">
HTTP
数据库
MQTT/HTTP
传感器数据
控制指令
用户界面
后台服务
数据库
温室控制器
传感器
控制电路

三、环境搭建

硬件环境

  • 开发板:STM32F4系列开发板

  • 传感器:DHT11温湿度传感器、BH1750光照传感器

  • 通信模块:ESP8266 Wi-Fi模块

  • 控制模块:继电器模块

软件环境

  • 开发工具链:STM32CubeIDE

  • 库:HAL库、FreeRTOS(可选)

  • 后端框架:Node.js(或Django/Flask)

  • 数据库:MySQL(或MongoDB)

安装步骤

  1. 安装STM32CubeIDE:下载并安装STM32CubeIDE。

  2. 安装Node.js:访问Node.js官网下载并安装。

  3. 安装数据库:根据选择的数据库,进行安装和配置。

注意事项

  • 确保开发环境的版本兼容。

  • 传感器连接时注意引脚定义,避免接错。

四、代码实现

根据系统架构的设计,逐步实现各功能模块。

1. 嵌入式固件开发

使用C语言编写STM32固件,实现数据采集和控制。

#include "stm32f4xx_hal.h"  // 引入STM32 HAL库,提供硬件抽象层的功能
#include "dht11.h"          // 引入DHT11传感器的驱动库
#include "bh1750.h"         // 引入BH1750光照传感器的驱动库// 初始化传感器
void Sensor_Init() {DHT11_Init();  // 初始化DHT11温湿度传感器BH1750_Init(); // 初始化BH1750光照传感器
}// 采集数据
void Collect_Data() {float temperature, humidity;       // 定义温度和湿度变量uint16_t light_intensity;          // 定义光照强度变量// 从DHT11传感器读取温度和湿度DHT11_Read(&temperature, &humidity);// 从BH1750传感器读取光照强度light_intensity = BH1750_Read();// 处理数据并发送到后端或控制系统Send_Data(temperature, humidity, light_intensity);
}
代码说明
1. 包含头文件
  • #include "stm32f4xx_hal.h":引入STM32F4系列的硬件抽象层(HAL)库。这是进行硬件操作的基础库,包括GPIO、UART、I2C等功能的支持。

  • #include "dht11.h":引入DHT11传感器的自定义驱动库。该库提供了对DHT11传感器的初始化和数据读取的函数。

  • #include "bh1750.h":引入BH1750光照传感器的自定义驱动库。该库提供了对BH1750传感器的初始化和数据读取的函数。

2. Sensor_Init 函数
void Sensor_Init() {DHT11_Init();  // 初始化DHT11温湿度传感器BH1750_Init(); // 初始化BH1750光照传感器
}
  • 功能:初始化传感器。

  • 实现:

  • 调用DHT11_Init()函数,进行DHT11传感器的初始化,通常包括配置GPIO引脚和I/O模式等。

  • 调用BH1750_Init()函数,进行BH1750光照传感器的初始化,设置I2C通信。

3. Collect_Data 函数
void Collect_Data() {float temperature, humidity;       // 定义温度和湿度变量uint16\_t light\_intensity;          // 定义光照强度变量// 从DHT11传感器读取温度和湿度DHT11_Read(&temperature, &humidity);// 从BH1750传感器读取光照强度light\_intensity = BH1750\_Read();// 处理数据并发送到后端或控制系统Send\_Data(temperature, humidity, light\_intensity);
}
  • 功能:采集环境数据(温度、湿度和光照强度)。

  • 实现:

  • 定义temperaturehumidity变量用于存储DHT11传感器读取的温度和湿度值。

  • 定义light_intensity变量用于存储BH1750传感器读取的光照强度值。

  • 调用DHT11_Read(&temperature, &humidity)函数,从DHT11传感器读取当前的温度和湿度值,并将其存储到定义的变量中。该函数通常会处理通信过程并进行错误检查。

  • 调用light_intensity = BH1750_Read()函数,从BH1750传感器读取当前的光照强度值。此函数同样会处理I2C通信并返回读取的数据。

  • 最后,调用Send_Data(temperature, humidity, light_intensity)函数,将采集到的数据传输到后端或控制系统。该函数的具体实现可以包括通过串口、MQTT等协议发送数据。

2. 后台服务开发

在Node.js中,我们将继续实现控制逻辑,接收来自前端的控制指令,并将其转发到温室控制器。以下是完整的代码示例。

Node.js 后台服务示例
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const mqtt = require('mqtt'); // 使用MQTT协议进行通信// 连接到MQTT代理(例如:Mosquitto)
const mqttClient = mqtt.connect('mqtt://broker.hivemq.com'); // 更换为相应的MQTT代理app.use(bodyParser.json());// 处理控制指令的API
app.post('/control', (req, res) => {const controlCommand = req.body.command;// 发布控制指令到MQTT主题mqttClient.publish('greenhouse/control', JSON.stringify(controlCommand), (err) => {if (err) {console.error('Error publishing to MQTT:', err);return res.status(500).send('Error publishing control command');}console.log('Control command published:', controlCommand);res.send(`Control command received: ${JSON.stringify(controlCommand)}`);});
});// 处理传感器数据的API
app.post('/data', (req, res) => {const sensorData = req.body;// 在这里可以将数据存储到数据库console.log('Sensor data received:', sensorData);// 数据存储逻辑,例如使用MySQL或MongoDBres.send('Sensor data received');
});// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`Server is running on port ${PORT}`);
});
代码说明
  • MQTT Client:我们使用mqtt库连接到MQTT代理服务器。在这个示例中使用的是免费的HiveMQ代理,实际部署时可以更换为自己的MQTT代理。

  • 控制指令的API:

  • 接收控制指令的POST请求,指令通过req.body.command获取。

  • 使用mqttClient.publish方法将控制指令发布到指定的MQTT主题(例如,greenhouse/control)。

  • 传感器数据的API:

  • 接收传感器数据的POST请求,并输出到控制台,实际应用中应将这些数据存储到数据库中。

  • 服务器启动:在指定的端口上启动Express服务器,监听客户端请求。

数据存储示例

为了存储传感器数据,可以添加一个简单的MySQL或MongoDB存储逻辑。以下是一个使用MySQL的示例。

const mysql = require('mysql');// 创建MySQL连接
const db = mysql.createConnection({host: 'localhost',user: 'yourusername',password: 'yourpassword',database: 'greenhouse_db'
});// 连接到数据库
db.connect((err) => {if (err) {console.error('Error connecting to MySQL:', err);return;}console.log('Connected to MySQL');
});// 更新传感器数据的API
app.post('/data', (req, res) => {const sensorData = req.body;const query = 'INSERT INTO sensor_data (temperature, humidity, light_intensity, timestamp) VALUES (?, ?, ?, ?)';const values = [sensorData.temperature, sensorData.humidity, sensorData.light_intensity, new Date()];db.query(query, values, (err, result) => {if (err) {console.error('Error inserting data into MySQL:', err);return res.status(500).send('Error storing sensor data');}console.log('Sensor data inserted:', result);res.send('Sensor data received and stored');});
});
代码说明
  • MySQL连接:使用mysql库创建与MySQL数据库的连接,替换为自己的数据库配置。

  • 数据插入逻辑:在接收到传感器数据时,将其插入到sensor_data表中,表结构应包含temperaturehumiditylight_intensitytimestamp等字段。

五、项目总结

在本项目中,我们成功开发了一套基于STM32的智能温室管理可视化系统,全面覆盖了从硬件选择到软件开发的各个环节。该系统通过实时监测温室内的温度、湿度和光照等环境参数,结合智能控制策略,实现了温室环境的自动化管理。

主要功能概述

  1. 实时数据采集:系统利用DHT11和BH1750等传感器,持续监测温室内的温度、湿度和光照强度,并将数据实时传输给中央控制器。

  2. 自动环境控制:根据传感器采集的数据,系统可自动调整风扇、加热器和通风窗等设备,以保持适宜的生长环境,提高作物的生长效率。

  3. 数据可视化:通过Web前端界面,用户可以实时查看温室环境数据和历史记录,直观了解温室的运行状态,并可进行手动控制。

  4. 远程监控与控制:系统支持无线通信,用户可以通过手机或PC进行远程监控和控制,随时随地管理温室,提升了管理的便利性。

  5. 数据分析与智能决策:项目中集成了数据分析模块,可以对收集的环境数据进行分析,挖掘出作物生长的规律,为未来的智能决策提供数据支持。

实现过程回顾

  • 硬件搭建:选择了STM32微控制器作为核心,集成了多种传感器和控制模块,构建了完整的硬件平台。

  • 嵌入式软件开发:使用C语言编写了固件,实现了传感器的初始化、数据采集和控制逻辑。采用了模块化的设计,便于后续的维护和扩展。

  • 后端服务开发:利用Node.js框架开发了RESTful API,处理传感器数据的存储和控制指令的接收,确保系统的高效性和稳定性。

  • 前端界面设计:使用React等前端技术开发用户界面,设计了友好的交互体验,使用户能够轻松地访问和控制温室环境。


http://www.ppmy.cn/news/1511713.html

相关文章

我怎么会这么依赖 GUI?

AWS CLI、.NET 和 Lambda 函数 欢迎来到雲闪世界。在 Windows 上使用 Visual Studio 和 AWS Explorer 绝对会让你变得懒惰。我的意思是,能够通过右键单击项目来构建和部署 Lambda 函数之类的东西真是太棒了,但有时最好了解幕后发生了什么。 尽管如此&am…

爱心动画代码HTML5

这段代码是一个HTML5 Canvas动画,它通过JavaScript创建了一个动态的爱心效果。页面初始化时,首先定义了一些基本设置,如粒子数量、持续时间、速度等。然后,定义了Point和Particle类,用于处理粒子的位置和运动。接着&am…

Linux安装MQTT 服务器(图文教程)

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专为低带宽和不稳定的网络环境设计,非常适合物联网(IoT)应用。 官网地址:https://www.emqx.com/ 一、版本选择 根据自己…

开源的数据库增量订阅和消费的中间件——Cancl

目录 工作原理 MySQL主备复制原理 Canal 工作原理 主要功能和特点 应用场景 实验准备 安装JDK11 下载MySQL8.0 配置canal.admin 配置canal-deployer 测试数据读取 新增一台主机用做被同步的目标机器测试 官方地址:https://github.com/alibaba/canal?ta…

使用 C++ 实现一个简单的数据库连接池

使用 C 实现一个简单的数据库连接池 在现代应用程序中,数据库连接的管理是一个重要的性能瓶颈。频繁地创建和销毁数据库连接会导致显著的性能下降。为了解决这个问题,连接池技术应运而生。本文将介绍如何使用 C 实现一个简单的数据库连接池,…

JAVA--多线程

Java中的多线程是指在同一个Java虚拟机(JVM)中并发执行多个线程的能力。线程是程序执行的最小单元,Java提供了丰富的API来创建和管理线程。以下是Java中实现多线程的一些关键概念和方法: Thread 类:Java提供了Thread类…

jenkins配置+vue打包多环境切换

jenkins配置流水线过程 1.新建item 加入相关的参数就行了。 流水线脚本设置 后端脚本 node {stage checkoutsh"""#每次打包清空工作空间目录rm -rf $workspace/*cd $workspace#到工作空间下从远端svn服务端拉取代码svn co svn://10.1.19.21/repo/技术中台/低…

掌握axios:在TypeScript中进行高效网页数据抓取

在当今的互联网时代,数据已成为企业最宝贵的资产之一。无论是社交媒体分析、市场趋势预测还是用户行为研究,高效地获取和处理网页数据都是至关重要的。本文将通过访问抖音平台的案例,介绍如何在TypeScript中使用axios库进行高效的网页数据抓取…