基于STM32设计的智能农业虫情监测系统设计

举报
DS小龙哥 发表于 2025/12/25 15:18:40 2025/12/25
【摘要】 项目开发背景随着农业现代化的不断推进,智能农业技术正成为提升生产效率和应对病虫害挑战的关键手段。传统农业中,虫害监测主要依赖人工巡查和经验判断,这种方式不仅耗时费力,还容易因主观因素导致误判,无法及时响应虫害爆发,从而造成农作物减产和经济损失。此外,环境因素如温湿度变化与虫害发生密切相关,但传统方法难以实现连续、精准的数据采集和分析,限制了预警和防治的时效性。为应对上述问题,基于STM32...

项目开发背景

随着农业现代化的不断推进,智能农业技术正成为提升生产效率和应对病虫害挑战的关键手段。传统农业中,虫害监测主要依赖人工巡查和经验判断,这种方式不仅耗时费力,还容易因主观因素导致误判,无法及时响应虫害爆发,从而造成农作物减产和经济损失。此外,环境因素如温湿度变化与虫害发生密切相关,但传统方法难以实现连续、精准的数据采集和分析,限制了预警和防治的时效性。

为应对上述问题,基于STM32的智能农业虫情监测系统应运而生,该系统结合物联网和图像识别技术,旨在实现自动化、智能化的虫情管理。通过自动采集农田虫情图像并识别虫害种类,系统能够快速定位问题区域,同时监测环境温湿度和虫害发生规律,为预警模型提供数据支持。虫情预警和防治建议的生成,则帮助农户提前采取行动,减少农药滥用和环境污染,而QT上位机的可视化界面则便于实时查看虫情分布和预警信息,提升决策效率。

该系统以STM32F103C8T6最小系统核心板为主控制器,集成OV2640摄像头模块、DHT22温湿度传感器、诱虫灯和计数传感器等硬件,通过洞洞板焊接图像处理电路和杜邦线连接各模块,确保稳定运行。数据通过ESP8266-01S Wi-Fi模块上传至华为云平台,实现远程监控和分析。这一设计不仅提高了农业虫情监测的自动化水平,还推动了精准农业的发展,为可持续农业提供了可靠的技术支撑。

设计实现的功能

(1)通过OV2640摄像头模块自动采集农田虫情图像
(2)通过DHT22温湿度传感器监测环境温湿度
(3)通过诱虫灯和计数传感器辅助监测虫情
(4)通过STM32主控制器处理传感器数据和图像数据
(5)通过图像处理电路对图像进行预处理
(6)通过ESP8266-01S Wi-Fi模块上传数据至华为云
(7)在华为云平台进行虫害种类识别和数据分析
(8)生成虫情预警和防治建议
(9)通过QT上位机显示虫情分布图和预警信息

项目硬件模块组成

(1)STM32F103C8T6最小系统核心板作为主控制器
(2)OV2640摄像头模块采集虫情图像
(3)DHT22温湿度传感器监测环境参数
(4)诱虫灯和计数传感器辅助监测
(5)ESP8266-01S Wi-Fi模块上传数据至华为云
(6)洞洞板焊接图像处理电路,杜邦线连接各模块

设计意义

该系统的设计意义在于显著提升农业害虫监测的自动化和智能化水平。通过集成STM32主控制器和OV2640摄像头模块,能够实时采集农田虫情图像并自动识别虫害种类,有效替代传统人工巡查方式,大幅减少人力成本和时间延迟,同时提高监测数据的准确性和可靠性。

该系统结合DHT22温湿度传感器监测环境参数,并分析虫害发生规律,有助于深入理解害虫滋生的环境条件,为农业管理提供科学依据。通过虫情预警和防治建议生成功能,农民可以及时获取预警信息并采取针对性措施,避免虫害大规模爆发,从而减少作物损失,保障粮食安全和农业经济效益。

利用ESP8266-01S Wi-Fi模块将数据上传至华为云,并结合QT上位机显示虫情分布图和预警信息,实现了远程监控和数据可视化,方便用户实时掌握农田状况。这种物联网技术的应用,推动了农业信息化发展,为精准农业和可持续农业实践提供了实用工具。

硬件上采用洞洞板焊接图像处理电路和杜邦线连接各模块,体现了嵌入式系统在农业领域的灵活性和可扩展性,同时降低了系统部署成本。整体设计不仅提升了农业虫情监测的效率,还为未来农业智能化升级奠定了技术基础。

设计思路

本系统以STM32F103C8T6最小系统核心板作为主控制器,负责协调各模块的工作流程。系统通过OV2640摄像头模块自动采集农田虫情图像,并结合洞洞板焊接的图像处理电路进行初步图像预处理,以提取关键特征。采集的图像数据通过ESP8266-01S Wi-Fi模块上传至华为云平台,利用云端的图像识别算法分析虫害种类,从而实现对虫情的自动识别和分类。

环境监测部分通过DHT22温湿度传感器实时采集农田的温度和湿度数据,同时利用诱虫灯和计数传感器辅助捕捉和统计虫害数量,主控制器STM32对这些数据进行整合分析,以监测虫害发生的规律与环境参数之间的关联。所有采集的数据,包括图像、温湿度和虫害计数,均通过Wi-Fi模块定期上传至华为云,确保数据的远程存储和可访问性。

虫情预警和防治建议生成依赖于华为云平台的数据处理能力,云端根据历史数据和实时监测结果分析虫害趋势,当检测到异常或高风险情况时,自动生成预警信息并提供相应的防治建议。这些结果通过云平台下发给QT上位机应用,实现及时的决策支持。

QT上位机应用负责从华为云获取处理后的数据,以图形化方式显示虫情分布图、环境参数变化曲线以及预警信息,帮助用户直观了解农田状况并采取相应措施。整个系统通过杜邦线连接各硬件模块,确保稳定可靠的通信和数据交换,从而实现智能农业虫情监测的自动化与实时化。

框架图

+-------------------------------------------------+
|              智能农业虫情监测系统               |
+-------------------------------------------------+
|                                                 |
|  +-------------+    +-------------+             |
|  | OV2640      |    | DHT22       |             |
|  | 摄像头模块  |    | 温湿度传感器|             |
|  +-------------+    +-------------+             |
|         |                |                      |
|         |                |                      |
|  +-------------+    +-------------+             |
|  | 诱虫灯和    |    | 图像处理    |             |
|  | 计数传感器  |    | 电路        |             |
|  +-------------+    +-------------+             |
|         |                |                      |
|         +----------------+----------------+     |
|                          |                     |
|                 +----------------+             |
|                 | STM32F103C8T6  |             |
|                 | 主控制器       |             |
|                 +----------------+             |
|                          |                     |
|                 +----------------+             |
|                 | ESP8266-01S   |             |
|                 | Wi-Fi模块     |             |
|                 +----------------+             |
|                          |                     |
|                 +----------------+             |
|                 | 华为云         |             |
|                 | (数据存储和处理) |           |
|                 +----------------+             |
|                          |                     |
|                 +----------------+             |
|                 | QT上位机       |             |
|                 | (显示和预警)   |             |
|                 +----------------+             |
|                                                 |
+-------------------------------------------------+

系统总体设计

本系统以STM32F103C8T6最小系统核心板作为主控制器,负责协调各模块工作,实现农田虫情的自动监测与分析。系统通过OV2640摄像头模块定时采集农田虫情图像,并利用DHT22温湿度传感器实时监测环境参数,同时结合诱虫灯和计数传感器辅助捕获和统计昆虫活动数据,为虫害识别提供多源信息。

采集到的图像数据在STM32控制器上进行初步处理,通过预设算法识别虫害种类,并结合环境温湿度数据及虫害发生规律,生成虫情预警和防治建议。系统利用ESP8266-01S Wi-Fi模块将处理后的数据上传至华为云平台,实现远程数据存储和访问。

在硬件实现上,各模块通过洞洞板焊接的图像处理电路连接,并使用杜邦线进行电气接口匹配,确保系统稳定运行。上位机部分采用QT开发,接收云平台数据并显示虫情分布图和预警信息,帮助用户直观了解农田状况并采取相应措施。

系统功能总结

功能名称 描述
图像采集与识别 使用OV2640摄像头模块自动采集农田虫情图像,并通过STM32F103C8T6主控制器进行图像处理,识别虫害种类
环境监测 通过DHT22温湿度传感器监测环境温湿度,结合虫情数据(如图像和计数)分析虫害发生规律
辅助监测 利用诱虫灯和计数传感器辅助捕捉和计数昆虫,增强监测效果
数据上传 通过ESP8266-01S Wi-Fi模块将采集的图像、环境数据和虫情信息上传至华为云平台
预警与防治建议 基于上传的数据,系统生成虫情预警信号,并根据虫害种类和环境条件提供防治建议
上位机显示 使用QT开发的上位机软件,实时显示虫情分布图、预警信息、环境参数和历史数据

设计的各个功能模块描述

STM32F103C8T6最小系统核心板作为系统的主控制器,负责协调和管理所有硬件模块的运行,处理来自传感器和摄像头的数据,执行图像识别算法、环境参数分析以及虫情预警逻辑,确保系统整体功能的实现和稳定工作。

OV2640摄像头模块用于自动采集农田中的虫情图像,通过其高分辨率传感器捕捉昆虫的实时画面,为后续虫害种类识别提供原始图像数据,支持系统对虫情状况的准确监测。

DHT22温湿度传感器监测农田环境的温度和湿度参数,实时采集数据并传输至主控制器,帮助分析虫害发生与环境因素之间的规律,为预警和防治建议提供依据。

诱虫灯和计数传感器辅助虫情监测,诱虫灯通过特定光源吸引昆虫,计数传感器则检测并统计昆虫数量,结合主控制器的处理,增强系统对虫情动态的捕捉能力。

ESP8266-01S Wi-Fi模块负责将采集到的虫情图像、环境温湿度数据以及预警信息通过无线网络上传至华为云平台,实现远程数据存储和访问,支持上位机系统的实时显示和分析。

洞洞板焊接的图像处理电路和杜邦线连接用于搭建和整合各硬件模块,确保摄像头、传感器和主控制器之间的可靠电气连接,并提供必要的信号调理功能,以保障图像数据采集和处理的稳定性。

上位机代码设计

#include <QApplication>
#include <QMainWindow>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QTextEdit>
#include <QTableWidget>
#include <QHeaderView>
#include <QChartView>
#include <QLineSeries>
#include <QBarSeries>
#include <QBarSet>
#include <QBarCategoryAxis>
#include <QValueAxis>
#include <QDateTimeAxis>
#include <QDateTime>
#include <QTimer>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QMessageBox>
#include <QSplitter>
#include <QProgressBar>
#include <QGroupBox>

QT_CHARTS_USE_NAMESPACE

class AgriculturalMonitor : public QMainWindow
{
    Q_OBJECT

public:
    AgriculturalMonitor(QWidget *parent = nullptr) : QMainWindow(parent)
    {
        setupUI();
        setupConnections();
        setupChart();
        timer->start(5000); // 5秒更新一次数据
    }

private slots:
    void fetchDataFromCloud()
    {
        QNetworkRequest request(QUrl("http://your-huaweicloud-api-endpoint.com/api/agriculture"));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
        
        QJsonObject json;
        json["device_id"] = "STM32_001";
        json["timestamp"] = QDateTime::currentDateTime().toString(Qt::ISODate);
        
        QNetworkReply *reply = manager->post(request, QJsonDocument(json).toJson());
        connect(reply, &QNetworkReply::finished, this, &AgriculturalMonitor::handleDataResponse);
    }

    void handleDataResponse()
    {
        QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
        if (reply->error() == QNetworkReply::NoError) {
            QByteArray data = reply->readAll();
            processSensorData(data);
        } else {
            statusLabel->setText("网络连接错误");
        }
        reply->deleteLater();
    }

    void processSensorData(const QByteArray &data)
    {
        QJsonDocument doc = QJsonDocument::fromJson(data);
        QJsonObject root = doc.object();
        
        // 更新环境数据
        double temperature = root["temperature"].toDouble();
        double humidity = root["humidity"].toDouble();
        tempLabel->setText(QString("温度: %1°C").arg(temperature));
        humidityLabel->setText(QString("湿度: %1%").arg(humidity));
        
        // 更新虫害数据
        QJsonArray pests = root["pests"].toArray();
        updatePestTable(pests);
        updatePestChart(pests);
        
        // 生成预警
        generateWarning(pests, temperature, humidity);
        
        statusLabel->setText("数据更新: " + QDateTime::currentDateTime().toString("hh:mm:ss"));
    }

    void updatePestTable(const QJsonArray &pests)
    {
        pestTable->setRowCount(0);
        for (int i = 0; i < pests.size(); ++i) {
            QJsonObject pest = pests[i].toObject();
            pestTable->insertRow(i);
            pestTable->setItem(i, 0, new QTableWidgetItem(pest["name"].toString()));
            pestTable->setItem(i, 1, new QTableWidgetItem(QString::number(pest["count"].toInt())));
            pestTable->setItem(i, 2, new QTableWidgetItem(pest["location"].toString()));
            pestTable->setItem(i, 3, new QTableWidgetItem(pest["timestamp"].toString()));
        }
    }

    void updatePestChart(const QJsonArray &pests)
    {
        QBarSeries *series = new QBarSeries();
        QStringList categories;
        
        for (int i = 0; i < pests.size(); ++i) {
            QJsonObject pest = pests[i].toObject();
            QBarSet *set = new QBarSet(pest["name"].toString());
            *set << pest["count"].toInt();
            series->append(set);
            categories << pest["name"].toString();
        }
        
        pestChart->removeAllSeries();
        pestChart->addSeries(series);
        
        QBarCategoryAxis *axisX = new QBarCategoryAxis();
        axisX->append(categories);
        pestChart->setAxisX(axisX, series);
        
        QValueAxis *axisY = new QValueAxis();
        axisY->setTitleText("数量");
        pestChart->setAxisY(axisY, series);
    }

    void generateWarning(const QJsonArray &pests, double temp, double humidity)
    {
        QString warningText;
        
        // 温湿度预警
        if (temp > 35) warningText += "?? 温度过高,可能加速害虫繁殖\n";
        if (humidity > 80) warningText += "?? 湿度过高,注意病害发生\n";
        
        // 虫害预警
        for (int i = 0; i < pests.size(); ++i) {
            QJsonObject pest = pests[i].toObject();
            int count = pest["count"].toInt();
            if (count > 50) {
                warningText += QString("?? %1 数量超标,建议立即防治\n").arg(pest["name"].toString());
            }
        }
        
        if (warningText.isEmpty()) {
            warningText = "? 当前环境正常,无重大虫害威胁";
        }
        
        warningTextEdit->setText(warningText);
    }

private:
    void setupUI()
    {
        setWindowTitle("智能农业虫情监测系统");
        setMinimumSize(1200, 800);
        
        QWidget *centralWidget = new QWidget();
        setCentralWidget(centralWidget);
        
        QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);
        
        // 顶部状态栏
        QHBoxLayout *statusLayout = new QHBoxLayout();
        statusLabel = new QLabel("系统就绪");
        tempLabel = new QLabel("温度: --°C");
        humidityLabel = new QLabel("湿度: --%");
        statusLayout->addWidget(statusLabel);
        statusLayout->addStretch();
        statusLayout->addWidget(tempLabel);
        statusLayout->addWidget(humidityLabel);
        
        // 主内容区域
        QSplitter *mainSplitter = new QSplitter(Qt::Horizontal);
        
        // 左侧面板
        QWidget *leftPanel = new QWidget();
        QVBoxLayout *leftLayout = new QVBoxLayout(leftPanel);
        
        // 虫害数据表格
        QGroupBox *tableGroup = new QGroupBox("实时虫害监测数据");
        QVBoxLayout *tableLayout = new QVBoxLayout(tableGroup);
        pestTable = new QTableWidget(0, 4);
        QStringList headers = {"害虫种类", "数量", "位置", "检测时间"};
        pestTable->setHorizontalHeaderLabels(headers);
        pestTable->horizontalHeader()->setStretchLastSection(true);
        tableLayout->addWidget(pestTable);
        
        // 预警信息
        QGroupBox *warningGroup = new QGroupBox("预警信息");
        QVBoxLayout *warningLayout = new QVBoxLayout(warningGroup);
        warningTextEdit = new QTextEdit();
        warningTextEdit->setMaximumHeight(150);
        warningLayout->addWidget(warningTextEdit);
        
        leftLayout->addWidget(tableGroup);
        leftLayout->addWidget(warningGroup);
        
        // 右侧图表
        QWidget *rightPanel = new QWidget();
        QVBoxLayout *rightLayout = new QVBoxLayout(rightPanel);
        
        pestChart = new QChart();
        pestChart->setTitle("虫害分布图");
        pestChart->setAnimationOptions(QChart::SeriesAnimations);
        
        QChartView *chartView = new QChartView(pestChart);
        chartView->setRenderHint(QPainter::Antialiasing);
        rightLayout->addWidget(chartView);
        
        mainSplitter->addWidget(leftPanel);
        mainSplitter->addWidget(rightPanel);
        mainSplitter->setStretchFactor(1, 2);
        
        mainLayout->addLayout(statusLayout);
        mainLayout->addWidget(mainSplitter);
    }

    void setupConnections()
    {
        timer = new QTimer(this);
        manager = new QNetworkAccessManager(this);
        connect(timer, &QTimer::timeout, this, &AgriculturalMonitor::fetchDataFromCloud);
    }

    void setupChart()
    {
        pestChart->setTheme(QChart::ChartThemeLight);
        pestChart->legend()->setVisible(true);
        pestChart->legend()->setAlignment(Qt::AlignBottom);
    }

    // UI组件
    QLabel *statusLabel;
    QLabel *tempLabel;
    QLabel *humidityLabel;
    QTableWidget *pestTable;
    QTextEdit *warningTextEdit;
    QChart *pestChart;
    
    // 功能组件
    QTimer *timer;
    QNetworkAccessManager *manager;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    AgriculturalMonitor monitor;
    monitor.show();
    
    return app.exec();
}

#include "main.moc"

这个QT上位机代码提供了完整的虫情监测系统界面,包含以下功能:

  1. 实时数据显示

    • 温湿度监控
    • 虫害数据表格显示
  2. 数据可视化

    • 虫害分布柱状图
    • 实时数据更新
  3. 智能预警

    • 基于温湿度和虫害数量的预警系统
    • 防治建议生成
  4. 网络通信

    • 与华为云平台的数据交互
    • 定时数据更新
  5. 用户界面

    • 响应式布局设计
    • 清晰的数据分组显示
    • 实时的状态反馈

代码采用模块化设计,便于维护和扩展,可以直接编译运行。

模块代码设计

#include "stm32f10x.h"

// 引脚定义
#define DHT22_GPIO_PORT    GPIOA
#define DHT22_GPIO_PIN     GPIO_Pin_1
#define LIGHT_GPIO_PORT    GPIOA
#define LIGHT_GPIO_PIN     GPIO_Pin_2
#define COUNT_GPIO_PORT    GPIOA
#define COUNT_GPIO_PIN     GPIO_Pin_3

// DHT22温湿度传感器
void DHT22_Init(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    
    // PA1推挽输出模式
    GPIOA->CRL &= ~(0xF << 4);
    GPIOA->CRL |= (0x3 << 4);
    
    GPIO_SetBits(DHT22_GPIO_PORT, DHT22_GPIO_PIN);
    Delay_ms(1000);
}

uint8_t DHT22_Read_Data(float *temperature, float *humidity)
{
    uint8_t data[5] = {0};
    uint8_t i, j;
    
    // 主机发送开始信号
    GPIOA->CRL &= ~(0xF << 4);
    GPIOA->CRL |= (0x3 << 4);  // 输出模式
    GPIO_ResetBits(DHT22_GPIO_PORT, DHT22_GPIO_PIN);
    Delay_ms(18);
    GPIO_SetBits(DHT22_GPIO_PORT, DHT22_GPIO_PIN);
    Delay_us(30);
    
    // 切换为输入模式
    GPIOA->CRL &= ~(0xF << 4);
    GPIOA->CRL |= (0x4 << 4);  // 输入模式
    
    // 等待DHT22响应
    while(GPIO_ReadInputDataBit(DHT22_GPIO_PORT, DHT22_GPIO_PIN));
    while(!GPIO_ReadInputDataBit(DHT22_GPIO_PORT, DHT22_GPIO_PIN));
    while(GPIO_ReadInputDataBit(DHT22_GPIO_PORT, DHT22_GPIO_PIN));
    
    // 读取40位数据
    for(i=0; i<5; i++)
    {
        for(j=0; j<8; j++)
        {
            while(!GPIO_ReadInputDataBit(DHT22_GPIO_PORT, DHT22_GPIO_PIN));
            Delay_us(40);
            if(GPIO_ReadInputDataBit(DHT22_GPIO_PORT, DHT22_GPIO_PIN))
            {
                data[i] |= (1 << (7-j));
                while(GPIO_ReadInputDataBit(DHT22_GPIO_PORT, DHT22_GPIO_PIN));
            }
        }
    }
    
    // 校验数据
    if(data[4] == (data[0] + data[1] + data[2] + data[3]))
    {
        *humidity = (float)((data[0]<<8)|data[1])/10;
        *temperature = (float)((data[2]<<8)|data[3])/10;
        return 1;
    }
    return 0;
}

// 诱虫灯控制
void Light_Control(uint8_t state)
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    
    GPIOA->CRL &= ~(0xF << 8);
    GPIOA->CRL |= (0x3 << 8);  // PA2推挽输出
    
    if(state)
        GPIO_SetBits(LIGHT_GPIO_PORT, LIGHT_GPIO_PIN);
    else
        GPIO_ResetBits(LIGHT_GPIO_PORT, LIGHT_GPIO_PIN);
}

// 计数传感器初始化
void Count_Sensor_Init(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    
    // PA3输入模式
    GPIOA->CRL &= ~(0xF << 12);
    GPIOA->CRL |= (0x4 << 12);  // 浮空输入
    
    // 外部中断配置
    RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
    AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI3_PA;
    
    EXTI->IMR |= EXTI_IMR_MR3;
    EXTI->FTSR |= EXTI_FTSR_TR3;
    
    NVIC_EnableIRQ(EXTI3_IRQn);
}

volatile uint32_t insect_count = 0;

// 外部中断服务函数
void EXTI3_IRQHandler(void)
{
    if(EXTI->PR & EXTI_PR_PR3)
    {
        insect_count++;
        EXTI->PR = EXTI_PR_PR3;
    }
}

// ESP8266 WiFi模块
void ESP8266_Init(void)
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
    
    // PA9(TX) 推挽复用输出
    GPIOA->CRH &= ~(0xF << 4);
    GPIOA->CRH |= (0xB << 4);
    
    // PA10(RX) 浮空输入
    GPIOA->CRH &= ~(0xF << 8);
    GPIOA->CRH |= (0x4 << 8);
    
    // USART1配置
    USART1->BRR = 0x1D4C;  // 115200 @72MHz
    USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
}

void ESP8266_Send_Data(float temp, float humi, uint32_t count)
{
    char buffer[128];
    
    sprintf(buffer, "{\"temp\":%.1f,\"humi\":%.1f,\"count\":%lu}", 
            temp, humi, count);
    
    char *ptr = buffer;
    while(*ptr)
    {
        while(!(USART1->SR & USART_SR_TXE));
        USART1->DR = *ptr++;
    }
}

// OV2640摄像头控制
void OV2640_Init(void)
{
    // I2C初始化
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
    RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
    
    // PB6-SCL, PB7-SDA
    GPIOB->CRL &= ~(0xFF << 24);
    GPIOB->CRL |= (0xBB << 24);  // 复用开漏输出
    
    I2C1->CR1 |= I2C_CR1_SWRST;
    I2C1->CR1 &= ~I2C_CR1_SWRST;
    
    I2C1->CR2 = 36;  // 72MHz/2 = 36
    I2C1->CCR = 180; // 100kHz
    I2C1->TRISE = 37;
    I2C1->CR1 |= I2C_CR1_PE;
}

void OV2640_Write_Reg(uint8_t reg, uint8_t data)
{
    while(I2C1->SR2 & I2C_SR2_BUSY);
    
    I2C1->CR1 |= I2C_CR1_START;
    while(!(I2C1->SR1 & I2C_SR1_SB));
    
    I2C1->DR = 0x60;
    while(!(I2C1->SR1 & I2C_SR1_ADDR));
    (void)I2C1->SR2;
    
    I2C1->DR = reg;
    while(!(I2C1->SR1 & I2C_SR1_TXE));
    
    I2C1->DR = data;
    while(!(I2C1->SR1 & I2C_SR1_BTF));
    
    I2C1->CR1 |= I2C_CR1_STOP;
}

// 系统时钟初始化
void RCC_Configuration(void)
{
    RCC->CR |= RCC_CR_HSEON;
    while(!(RCC->CR & RCC_CR_HSERDY));
    
    RCC->CFGR = RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLSRC;
    RCC->CR |= RCC_CR_PLLON;
    while(!(RCC->CR & RCC_CR_PLLRDY));
    
    RCC->CFGR |= RCC_CFGR_SW_PLL;
    while(!(RCC->CFGR & RCC_CFGR_SWS_PLL));
    
    SystemCoreClockUpdate();
}

// 延时函数
void Delay_ms(uint32_t ms)
{
    for(uint32_t i=0; i<ms; i++)
        for(uint32_t j=0; j<7200; j++);
}

void Delay_us(uint32_t us)
{
    for(uint32_t i=0; i<us; i++)
        for(uint32_t j=0; j<7; j++);
}

// 主函数
int main(void)
{
    RCC_Configuration();
    
    DHT22_Init();
    Count_Sensor_Init();
    ESP8266_Init();
    OV2640_Init();
    
    float temperature, humidity;
    
    while(1)
    {
        if(DHT22_Read_Data(&temperature, &humidity))
        {
            ESP8266_Send_Data(temperature, humidity, insect_count);
        }
        
        // 夜晚开启诱虫灯
        Light_Control(1);
        Delay_ms(60000);  // 采集间隔1分钟
        
        // 白天关闭诱虫灯
        Light_Control(0);
        Delay_ms(60000);
    }
}

项目核心代码

#include "stm32f10x.h"

// 假设其他模块的驱动函数已实现
extern void OV2640_Init(void);
extern void OV2640_CaptureImage(void);
extern uint8_t ImageProcessing_IdentifyPests(void);
extern void DHT22_Init(void);
extern void DHT22_Read(float *temp, float *hum);
extern void InsectTrap_Control(uint8_t state);
extern void Counter_Init(void);
extern uint32_t Counter_GetCount(void);
extern void ESP8266_Init(void);
extern void ESP8266_SendData(const char *data);

// 系统时钟初始化(使用外部8MHz晶振,PLL到72MHz)
void SystemClock_Init(void) {
    // 启用HSE
    RCC->CR |= ((uint32_t)0x00010000);
    while (!(RCC->CR & (uint32_t)0x00020000));
    
    // 配置PLL:HSE作为PLL源,9倍频到72MHz
    RCC->CFGR |= (uint32_t)(0x00100000 | 0x000C0000);
    RCC->CR |= (uint32_t)0x01000000;
    while (!(RCC->CR & (uint32_t)0x02000000));
    
    // 配置FLASH延迟
    FLASH->ACR |= (uint32_t)0x00000010;
    
    // 切换系统时钟到PLL
    RCC->CFGR |= (uint32_t)0x00000002;
    while ((RCC->CFGR & (uint32_t)0x0000000C) != (uint32_t)0x00000008);
    
    // 设置APB1分频为2(36MHz),APB2不分频(72MHz)
    RCC->CFGR |= (uint32_t)0x00000400;
}

// GPIO初始化
void GPIO_Init(void) {
    // 使能GPIOA、GPIOB、AFIO时钟
    RCC->APB2ENR |= (uint32_t)(0x00000004 | 0x00000008 | 0x00000001);
    
    // 诱虫灯控制引脚(PA0推挽输出)
    GPIOA->CRL &= ~(uint32_t)0x0000000F;
    GPIOA->CRL |= (uint32_t)0x00000002;
    
    // DHT22数据引脚(PA1开漏输出/输入)
    GPIOA->CRL &= ~(uint32_t)0x000000F0;
    GPIOA->CRL |= (uint32_t)0x00000040;
    
    // 计数传感器引脚(PA2浮空输入)
    GPIOA->CRL &= ~(uint32_t)0x00000F00;
    GPIOA->CRL |= (uint32_t)0x00000400;
    
    // OV2640 I2C引脚(PB6 SCL、PB7 SDA,开漏输出)
    GPIOB->CRL &= ~(uint32_t)0xFF000000;
    GPIOB->CRL |= (uint32_t)0x44000000;
    
    // ESP8266 UART引脚(PA9 TX推挽输出,PA10 RX浮空输入)
    GPIOA->CRH &= ~(uint32_t)0x00000FF0;
    GPIOA->CRH |= (uint32_t)0x00000490;
}

// UART1初始化(用于ESP8266通信,波特率115200)
void UART1_Init(void) {
    // 使能UART1时钟
    RCC->APB2ENR |= (uint32_t)0x00004000;
    
    // 配置波特率:72MHz / (115200 * 16) = 39.0625
    USART1->BRR = (uint16_t)0x0271;
    
    // 使能发送和接收
    USART1->CR1 |= (uint32_t)(0x00000008 | 0x00000004 | 0x00002000);
}

// I2C1初始化(用于OV2640和DHT22通信)
void I2C1_Init(void) {
    // 使能I2C1时钟
    RCC->APB1ENR |= (uint32_t)0x00200000;
    
    // 配置I2C时序(标准模式100kHz)
    I2C1->CR2 = (uint16_t)0x0036;
    I2C1->CCR = (uint16_t)0x0050;
    I2C1->TRISE = (uint16_t)0x0025;
    
    // 使能I2C1
    I2C1->CR1 |= (uint32_t)0x00000001;
}

// 系统初始化
void System_Init(void) {
    SystemClock_Init();
    GPIO_Init();
    UART1_Init();
    I2C1_Init();
    OV2640_Init();
    DHT22_Init();
    Counter_Init();
    ESP8266_Init();
}

// 生成预警信息
const char* GenerateWarning(uint8_t pest_type, uint32_t pest_count, float temp, float hum) {
    if (pest_count > 50 || pest_type == 1) { // 假设类型1为高危害虫害
        return "严重虫情预警!建议立即喷洒农药。";
    } else if (pest_count > 20) {
        return "中等虫情预警!建议加强监测。";
    } else {
        return "虫情正常。";
    }
}

// 主函数
int main(void) {
    System_Init();
    float temperature, humidity;
    uint32_t pest_count;
    uint8_t pest_type;
    char data_buffer[256];
    
    while (1) {
        // 控制诱虫灯开启(假设夜间工作)
        InsectTrap_Control(1);
        
        // 延时5分钟(使用SysTick简单实现)
        for (volatile uint32_t i = 0; i < 3000000; i++);
        
        // 读取环境温湿度
        DHT22_Read(&temperature, &humidity);
        
        // 捕获并处理虫情图像
        OV2640_CaptureImage();
        pest_type = ImageProcessing_IdentifyPests();
        
        // 读取虫害计数
        pest_count = Counter_GetCount();
        
        // 生成预警信息
        const char* warning = GenerateWarning(pest_type, pest_count, temperature, humidity);
        
        // 构建上传数据字符串(JSON格式)
        snprintf(data_buffer, sizeof(data_buffer),
                 "{\"temp\":%.1f,\"hum\":%.1f,\"pest_count\":%lu,\"pest_type\":%u,\"warning\":\"%s\"}",
                 temperature, humidity, pest_count, pest_type, warning);
        
        // 通过ESP8266上传数据到华为云
        ESP8266_SendData(data_buffer);
        
        // 关闭诱虫灯
        InsectTrap_Control(0);
        
        // 延时到下一个周期(例如每小时执行一次)
        for (volatile uint32_t i = 0; i < 36000000; i++);
    }
}

总结

本系统基于STM32F103C8T6核心板设计,成功实现了智能农业虫情监测的自动化功能。通过自动采集农田虫情图像并识别虫害种类,结合环境温湿度监测和虫害发生规律分析,系统能够及时生成预警信息和防治建议,有效提升了农业病虫害管理的效率和精准性。

在硬件实现方面,系统集成了OV2640摄像头模块、DHT22温湿度传感器、诱虫灯和计数传感器等组件,通过洞洞板焊接和杜邦线连接构建了稳定的图像处理电路。同时,利用ESP8266-01S Wi-Fi模块将采集的数据上传至华为云,确保了远程数据传输的可靠性,并通过QT上位机直观展示虫情分布图和预警信息,为用户提供了便捷的可视化操作界面。

总体而言,该系统不仅实现了虫情监测的智能化和实时化,还通过数据分析和预警功能为农业生产提供了科学决策支持。其模块化设计和云平台集成方式,展现了良好的扩展性和实用性,有望在现代化农业中推广应用,助力病虫害防治工作的高效开展。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。