基于STM32的农业病虫害检测检测系统:OpenCV、MQTT、Flask框架、MySQL(代码示例)
一、项目概述
随着全球农业现代化的不断推进,智能农业监测系统应运而生。此项目旨在通过实时监测土壤湿度、温度等环境数据,结合作物生长状态的分析,提高农业生产效率和作物质量。通过引入STM32单片机、OpenCV图像处理技术和后端数据分析系统,项目能够有效解决农业生产中的以下问题:
实时监测:传统农业依赖人工监测,效率低,且易受主观因素影响。本项目通过自动化监测,提供实时数据。
病虫害检测:利用图像处理技术,及时识别作物病虫害,减少损失。
数据分析与决策支持:后端系统分析历史数据,提供科学的农业管理建议。
通过上述功能,本项目为农民提供了一种高效、可靠的农业管理工具,推动农业生产智能化。
二、系统架构
系统架构设计需满足数据采集、处理和分析的需求。整体架构可分为以下几个主要部分:
数据采集模块:使用STM32单片机连接土壤湿度传感器和温度传感器,定时采集土壤和气候数据。
数据处理模块:通过OpenCV对作物生长状态进行图像分析,检测病虫害。
后端系统:服务器端处理分析数据,提供决策支持,并通过API将数据传递给前端应用。
数据库系统:存储历史数据,便于后续的趋势分析和决策支持。
系统架构图
采集数据
分析结果
存储数据
历史数据
数据采集模块
数据处理模块
后端系统
数据库
前端应用
选型与技术栈单片机:STM32系列,具备丰富的IO接口和低功耗特性。
传感器:土壤湿度传感器、温度传感器(如DHT11)。
图像处理:OpenCV库,用于图像采集和处理。
通信协议:使用MQTT或HTTP协议进行数据传输。
后端框架:Python Flask框架,便于快速开发RESTful API。
数据库:MySQL或SQLite,用于存储历史数据。
三、环境搭建
硬件环境STM32开发板
土壤湿度传感器
温度传感器(DHT11)
摄像头模块(如USB摄像头)
路由器(用于网络连接)
软件环境开发工具:Keil uVision或STM32CubeIDE
编程语言:C/C++(STM32部分),Python(后端部分)
数据库管理系统:MySQL或SQLite
图像处理库:OpenCV
安装步骤 STM32开发环境配置:下载并安装STM32CubeIDE。
配置开发板的连接,安装对应的驱动程序。
Python环境配置:安装Python:
sudo apt-get install python3 python3-pip 1
安装Flask和OpenCV:
pip install Flask opencv-python 1 数据库配置:
安装MySQL:
sudo apt-get install mysql-server 1
创建数据库和表:
CREATE DATABASE smart_agriculture; USE smart_agriculture; CREATE TABLE sensor_data ( id INT AUTO_INCREMENT PRIMARY KEY, moisture FLOAT, temperature FLOAT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ); 12345678 注意事项
确保STM32开发板与PC的连接正常,避免串口配置错误。
在安装OpenCV时,可能需要安装额外的依赖库,确保图像处理功能正常。
四、代码实现
数据采集模块(STM32)在智能农业监测系统中,数据采集模块是系统的核心部分,负责实时采集土壤湿度和温度数据。这里我们使用STM32单片机,通过连接DHT11温度传感器和土壤湿度传感器,定期进行数据采集。以下是STM32的数据采集代码示例及详细说明。
代码示例#include "stm32f4xx_hal.h" #include "dht11.h" // 包含DHT11传感器的库 #include "soil_moisture.h" // 自定义土壤湿度传感器库 // 定义传感器引脚 #define DHT11_PIN GPIO_PIN_1 #define SOIL_MOISTURE_PIN GPIO_PIN_2 // 定义采集周期 #define SAMPLE_PERIOD 5000 // 5秒采样一次 // 函数原型 void SystemClock_Config(void); static void MX_GPIO_Init(void); void collectSensorData(void); int main(void) { // 初始化HAL库 HAL_Init(); // 配置系统时钟 SystemClock_Config(); // 初始化GPIO MX_GPIO_Init(); // 主循环 while (1) { collectSensorData(); // 采集传感器数据 HAL_Delay(SAMPLE_PERIOD); // 延时5秒 } } void collectSensorData(void) { float humidity, temperature, soilMoisture; // 读取DHT11传感器数据 if (DHT11_Read(DHT11_PIN, &humidity, &temperature) == HAL_OK) { // 成功读取温度和湿度 printf("Temperature: %.2f °C, Humidity: %.2f %%n", temperature, humidity); } else { // 读取失败 printf("Failed to read from DHT11n"); } // 读取土壤湿度传感器数据 soilMoisture = SoilMoisture_Read(SOIL_MOISTURE_PIN); printf("Soil Moisture: %.2fn", soilMoisture); } // 系统时钟配置函数 void SystemClock_Config(void) { // 这里配置系统时钟,具体内容根据使用的STM32型号进行调整 } // GPIO初始化函数 static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // 开启GPIO时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); // 配置DHT11引脚 GPIO_InitStruct.Pin = DHT11_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // DHT11为输入引脚 GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置土壤湿度传感器引脚 GPIO_InitStruct.Pin = SOIL_MOISTURE_PIN; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; // 模拟输入 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 代码说明库引用:
#include "stm32f4xx_hal.h":包含STM32硬件抽象层库,提供对硬件的抽象接口。
#include "dht11.h":包含DHT11传感器的驱动库,负责读取温度和湿度数据。
#include "soil_moisture.h":自定义的土壤湿度传感器库,用于读取土壤湿度值。
宏定义:
DHT11_PIN 和 SOIL_MOISTURE_PIN:定义DHT11和土壤湿度传感器的连接引脚。
SAMPLE_PERIOD:定义数据采集的时间间隔,这里设置为5秒。
主函数:
HAL_Init():初始化HAL库。
SystemClock_Config():配置系统时钟,具体实现根据所选STM32型号设置。
MX_GPIO_Init():初始化GPIO引脚。
数据采集函数 collectSensorData:
使用DHT11_Read函数读取DHT11传感器的温度和湿度数据,返回成功与否的状态。
使用SoilMoisture_Read函数读取土壤湿度数据,并打印到控制台。
GPIO引脚配置:
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;:将引脚设置为模拟输入模式,以便读取土壤湿度传感器的模拟信号。
GPIO_InitStruct.Pin = DHT11_PIN;:选择用于DHT11的GPIO引脚。
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;:将该引脚设置为输入模式,因为DHT11传感器需要读取数据。
GPIO_InitStruct.Pull = GPIO_NOPULL;:设置引脚不使用上拉或下拉电阻,以确保DHT11传感器正常工作。
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);:初始化GPIO引脚。
对土壤湿度传感器引脚进行类似的配置:
数据处理模块(OpenCV)在数据处理模块中,我们利用OpenCV库对作物的生长状态进行分析,特别是对病虫害的检测。以下是一个基本的使用OpenCV进行图像处理的代码示例。
代码示例import cv2 import numpy as np def detect_pests(image_path): # 读取输入图像 image = cv2.imread(image_path) # 转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 使用高斯模糊去噪声 blurred = cv2.GaussianBlur(gray, (5, 5), 0) # 边缘检测 edges = cv2.Canny(blurred, 100, 200) # 寻找轮廓 contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 在原图上绘制轮廓 for contour in contours: if cv2.contourArea(contour) > 100: # 过滤小轮廓 cv2.drawContours(image, [contour], -1, (0, 255, 0), 2) # 绘制绿色轮廓 # 显示结果 cv2.imshow('Detected Pests', image) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ == "__main__": detect_pests('crop_image.jpg') # 替换为实际的作物图像路径
123456789101112131415161718192021222324252627282930 代码说明库引用:
import cv2:导入OpenCV库。
import numpy as np:导入NumPy库,用于数值计算。
函数 detect_pests:
def detect_pests(image_path):定义一个函数,接收图像路径作为参数。
cv2.imread(image_path):读取指定路径的图像。
cv2.cvtColor(image, cv2.COLOR_BGR2GRAY):将图像转换为灰度图,以便于后续处理。
图像处理步骤:
cv2.GaussianBlur(gray, (5, 5), 0):对灰度图应用高斯模糊,以减少噪声。
cv2.Canny(blurred, 100, 200):使用Canny边缘检测算法提取边缘。
cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE):寻找图像中的轮廓。
轮廓绘制:
遍历所有轮廓,使用cv2.drawContours在原图上绘制超过100个像素的轮廓。结果显示:
cv2.imshow('Detected Pests', image):显示处理后的图像。
cv2.waitKey(0)和cv2.destroyAllWindows():等待用户
后端系统在后端系统中,我们将使用Flask框架处理前端发来的请求,提供数据接口,并将处理后的数据存储到数据库中。以下是一个简单的后端实现示例。
代码示例from flask import Flask, request, jsonify import mysql.connector app = Flask(__name__) # 数据库连接配置 db_config = { 'user': 'your_username', 'password': 'your_password', 'host': 'localhost', 'database': 'smart_agriculture' } @app.route('/submit_data', methods=['POST']) def submit_data(): """接收传感器数据并存储到数据库""" data = request.json moisture = data.get('moisture') temperature = data.get('temperature') try: # 连接数据库 connection = mysql.connector.connect(**db_config) cursor = connection.cursor() # 插入数据 insert_query = "INSERT INTO sensor_data (moisture, temperature) VALUES (%s, %s)" cursor.execute(insert_query, (moisture, temperature)) connection.commit() return jsonify({"message": "Data inserted successfully!"}), 201 except mysql.connector.Error as err: return jsonify({"error": str(err)}), 500 finally: cursor.close() connection.close() @app.route('/get_data', methods=['GET']) def get_data(): """获取历史传感器数据""" try: connection = mysql.connector.connect(**db_config) cursor = connection.cursor() # 查询数据 cursor.execute("SELECT * FROM sensor_data ORDER BY timestamp DESC") results = cursor.fetchall() # 转换为字典列表 data = [{"id": row[0], "moisture": row[1], "temperature": row[2], "timestamp": row[3]} for row in results] return jsonify(data), 200 except mysql.connector.Error as err: return jsonify({"error": str(err)}), 500 finally: cursor.close() connection.close() if __name__ == "__main__": app.run(debug=True)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 代码说明库引用:
from flask import Flask, request, jsonify:导入Flask相关模块,用于创建Web应用和处理HTTP请求。
import mysql.connector:导入MySQL连接器,用于连接和操作MySQL数据库。
Flask应用配置:
app = Flask(__name__):创建Flask应用实例。数据库连接配置:
db_config字典中包含数据库的连接信息,包括用户名、密码、主机和数据库名称。数据提交接口:
@app.route('/submit_data', methods=['POST']):定义一个POST请求的路由,用于接收传感器数据。
data = request.json:获取请求中的JSON数据。
通过mysql.connector.connect(**db_config)连接数据库。
使用SQL INSERT语句将传感器数据插入数据库。
数据获取接口:
@app.route('/get_data', methods=['GET']):定义一个GET请求的路由,用于返回历史传感器数据。
执行SQL SELECT语句查询所有传感器数据,并将结果转换为字典列表。
返回JSON格式的响应。
启动Flask应用:
if __name__ == "__main__": app.run(debug=True):在调试模式下启动Flask应用。 数据库设计为了支持智能农业监测系统的功能,我们需要设计合适的数据库结构。以下是数据库表的简单设计:
数据库表结构CREATE TABLE sensor_data ( id INT AUTO_INCREMENT PRIMARY KEY, moisture FLOAT NOT NULL, temperature FLOAT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ); 123456 表结构说明
id:主键,自增字段,用于唯一标识每条记录。
moisture:土壤湿度值,浮点型,表示当前的土壤湿度。
temperature:温度值,浮点型,表示当前环境温度。
五、项目总结
在本项目中,我们设计并实现了一个智能农业监测系统,主要功能包括实时监测土壤湿度和温度,利用图像处理技术检测作物生长状态(如病虫害),并将数据存储到数据库中以供后续分析。系统架构明确,模块分工合理,具体实现步骤如下:
数据采集模块:使用STM32单片机和传感器(DHT11和土壤湿度传感器)进行实时数据采集。
定期将采集到的数据通过后端接口发送到服务器。
图像处理模块:利用OpenCV进行作物图像处理,通过边缘检测和轮廓提取分析作物的健康状况。
针对检测到的病虫害,生成相应的分析结果。
后端系统:使用Flask框架搭建RESTful API,接收前端提交的传感器数据,并将其存储到MySQL数据库中。
提供获取历史数据的接口,方便用户查看历史记录并进行数据分析。
数据库管理: 设计合理的数据库表结构,以存储传感器数据及其时间戳,支持数据的高效存取和查询。相关知识
基于STM32的花卉大棚环境监测系统设计
基于STM32的智能花盆浇水系统设计
基于flask框架花卉艺术交流平台设计与实现 (python+mysql+论文)
基于知识图谱的病虫害检测及防治推荐系统
基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的玉米病虫害检测系统(Python+PySide6界面+训练代码)
基于STM32和云平台的花卉养护系统设计(微信小程序)(209)
基于STM32设计的环境检测设备
基于物联网的智能浇水系统(STM32+华为云IOT)
基于深度学习的玉米病虫害检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)
基于机器视觉的害虫种类及计数检测研究
网址: 基于STM32的农业病虫害检测检测系统:OpenCV、MQTT、Flask框架、MySQL(代码示例) https://www.huajiangbk.com/newsview536075.html
上一篇: 高大花木防治病虫方法多 |
下一篇: 大数据下的农作物病虫害智能监控与 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039