基于STM32的远程农田智能灌溉系统设计

举报
DS小龙哥 发表于 2025/06/22 18:36:27 2025/06/22
【摘要】 项目开发背景 项目开发背景随着全球水资源日益紧张和农业现代化进程的加速,传统粗放式的农田灌溉方式因其水资源浪费严重、人工依赖度高、无法精准响应作物需求等弊端,已难以满足可持续农业发展的要求。尤其在气候多变、劳动力成本上升的背景下,如何高效利用水资源、降低生产成本、提升作物产量与品质,成为农业领域亟待解决的关键问题。物联网技术的迅猛发展为解决上述问题提供了有效途径。基于嵌入式系统、传感器网络...

项目开发背景

项目开发背景

随着全球水资源日益紧张和农业现代化进程的加速,传统粗放式的农田灌溉方式因其水资源浪费严重、人工依赖度高、无法精准响应作物需求等弊端,已难以满足可持续农业发展的要求。尤其在气候多变、劳动力成本上升的背景下,如何高效利用水资源、降低生产成本、提升作物产量与品质,成为农业领域亟待解决的关键问题。

物联网技术的迅猛发展为解决上述问题提供了有效途径。基于嵌入式系统、传感器网络和无线通信的智能灌溉系统,能够实现对农田环境的实时精准监测与自动化控制。通过部署土壤湿度、水位、环境参数等传感器,系统可精确感知作物需水状况及环境变化,并依据预设策略或远程指令智能启停灌溉设备,实现按需供水。这不仅极大减少了水资源浪费,降低了人力投入,更能避免因人工判断失误或响应延迟导致的作物干旱或涝渍损害,显著提升灌溉效率与农业生产效益。

本项目正是在此背景下提出的。旨在设计并实现一套基于STM32微控制器的远程农田智能灌溉系统。该系统综合运用多种传感器实时采集核心环境参数,利用WiFi技术将数据上传至云端平台,并开发配套的移动应用,使农户能够随时随地通过手机远程监控农田状况、手动或自动控制水泵运行。同时,本地LCD显示屏提供实时数据可视化,异常阈值报警功能则确保系统安全可靠运行。项目的实施将有效推动精准农业技术的落地应用,助力节水减排,为中小型农田的智能化、数字化管理提供经济实用的解决方案。

设计实现的功能

(1)实时检测土壤湿度(电阻式传感器模拟信号采集)
(2)实时检测水位(浮球式水位开关数字信号输入)
(3)实时检测水温(DS18B20单总线通信)
(4)实时检测环境温湿度(DHT11单总线通信)
(5)实时检测光照强度(BH1750 I2C通信)
(6)自动控制模式:根据土壤湿度阈值控制继电器启停水泵
(7)手动控制模式:通过APP远程指令控制水泵开关
(8)传感器数据通过ESP8266 WiFi模块上传至云端(MQTT协议)
(9)本地LCD实时显示所有传感器参数及系统状态(TFT SPI接口驱动)
(10)土壤湿度/水位/温度超阈值时触发蜂鸣器报警(高电平驱动)
(11)华为云物联网平台数据存储与状态监控
(12)Qt5上位机实现远程数据可视化及水泵控制

项目硬件模块组成

(1)主控芯片:STM32F103C8T6
(2)土壤湿度检测:电阻式土壤湿度传感器(模拟信号)
(3)水位检测:浮球式水位开关传感器
(4)水温检测:DS18B20数字温度传感器
(5)环境检测:DHT11温湿度传感器和BH1750光照传感器
(6)通信模块:ESP8266 WiFi模块
(7)执行模块:继电器控制5V直流抽水泵
(8)显示模块:1.44寸TFT LCD液晶显示屏(SPI接口)
(9)报警模块:高电平触发有源蜂鸣器

设计意义

设计意义

基于STM32的远程农田智能灌溉系统设计,通过集成多传感器协同监测与智能控制,显著提升农业灌溉的精准性与效率。系统实时采集土壤湿度、水位、水温、环境温湿度及光照等关键参数,为灌溉决策提供科学依据。自动控制模式依据预设阈值启停水泵,避免人工误判导致的水资源浪费;手动模式则通过APP远程介入,适应复杂多变的农田需求,确保作物在最佳环境下生长。

该系统通过ESP8266模块将数据上传至华为云物联网平台,实现农田状态的远程可视化监控。农户可通过Qt5开发的移动端界面随时查看环境数据并控制水泵,大幅降低劳动强度,同时异常阈值触发的蜂鸣器报警能及时提示水位不足或环境异常,减少灾害损失。本地TFT LCD显示屏为现场人员提供直观的数据反馈,强化了系统的操作便捷性。

在资源节约方面,系统通过精准灌溉优化水资源分配,缓解农业用水紧张问题。硬件采用高性价比模块(如STM32F103C8T6、DHT11等),降低了部署成本,适用于规模化农田推广,为智慧农业的落地提供了可靠的技术支撑。

设计思路

设计思路

系统以STM32F103C8T6微控制器为核心,通过多传感器协同实现农田环境监测与智能灌溉控制。首先,土壤湿度传感器通过ADC采集模拟信号,转换为湿度百分比;浮球式水位开关通过GPIO检测高低电平判断水位状态;DS18B20通过单总线协议获取水温;DHT11通过单总线协议采集环境温湿度;BH1750通过I2C接口获取光照强度。所有传感器数据在主控芯片内进行滤波和校准处理。

控制逻辑采用自动/手动双模式。自动模式下,系统实时比对土壤湿度与预设阈值,当低于下限时启动继电器控制的水泵灌溉,达到上限时停止;手动模式下则通过APP远程指令控制水泵启停。水泵控制逻辑集成水位保护,若水位开关检测到缺水,立即停止水泵并触发报警,防止设备干烧。

通信模块采用ESP8266连接WiFi,通过AT指令配置MQTT协议,将传感器数据及设备状态实时上传至华为云物联网平台。同时订阅云端下发的控制指令,实现APP远程交互。数据采用JSON格式封装,确保传输效率与可解析性。

本地显示通过SPI接口驱动1.44寸TFT LCD,循环刷新土壤湿度、水位、水温、环境温湿度、光照强度、水泵状态及工作模式等参数。界面分区设计,关键参数突出显示,异常数据以颜色标记。

报警模块由高电平触发的有源蜂鸣器实现。当土壤湿度或水位超过安全阈值、传感器通信异常时,STM32输出高电平驱动蜂鸣器鸣响,同时LCD显示具体报警信息。报警状态持续至异常解除或手动确认。

框架图

系统框架图

+-----------------------------------------------------------------------------------------+
|                                       应用层                                            |
|                   +-----------------------------------------+                          |
|                   |           云端(华为云物联网平台)         |                          |
|                   |   - 存储土壤/水位/温湿度/光照等实时数据    |                          |
|                   |   - 远程控制指令下发(水泵开关/模式切换)   |                          |
|                   +----------------------+------------------+                          |
|                                          | MQTT协议                                      |
|                   +----------------------v------------------+                          |
|                   |               手机APP(Qt5开发)          |                          |
|                   |   - 实时数据显示/历史记录查询             |                          |
|                   |   - 手动控制水泵/设置灌溉阈值             |                          |
|                   +-----------------------------------------+                          |
+----------------------------------------------------------^-----------------------------+
                                                           | WiFi
+----------------------------------------------------------|-----------------------------+
|                                       通信层                                           |
|                   +-----------------------------------------+                          |
|                   |              ESP8266 WiFi模块            |                          |
|                   |   - MQTT协议上传传感器数据至云端         |                          |
|                   |   - 接收云端指令并转发给主控             |                          |
|                   +----------------------+------------------+                          |
|                                          | UART串口                                      |
+----------------------------------------------------------|-----------------------------+
                                                           |
+----------------------------------------------------------v-----------------------------+
|                                       控制层(STM32F103C8T6|
| +----------------+  +---------------+  +----------------+  +----------------+         |
| |  传感器数据采集  |  | 逻辑控制与报警 |  | 执行器控制      |  | 本地显示模块    |         |
| | - 土壤湿度(ADC) |  | - 阈值判断    |  | - 继电器驱动    |  | - TFT LCD      |         |
| | - 水位(数字IO)  |  | - 蜂鸣器报警  |  |   (控制水泵)    |  |   (SPI接口)     |         |
| | - 水温(DS18B20)|  | - 自动/手动   |  |                 |  | - 实时参数显示  |         |
| | - 环境(DHT11)  |  |   模式切换    |  +--------+---------+  +----------------+         |
| | - 光照(BH1750) |  +---------------+           |                                      |
| +----------------+                 +------------v---------+                            |
|                                    |  主控核心处理逻辑     |                            |
|                                    | - 数据融合处理       |                            |
|                                    | - 通信协议解析       |                            |
|                                    | - 系统调度管理       |                            |
|                                    +----------------------+                            |
+----------------------------------------------------------+-----------------------------+
                                                           |
+----------------------------------------------------------v-----------------------------+
|                                       感知层/执行层                                     |
| +--------------+  +-------------+  +-------------+  +-------------+  +-------------+   |
| | 土壤湿度传感器 |  | 浮球水位开关 |  | DS18B20水温 |  | DHT11环境   |  | BH1750光照  |   |
| | (模拟量)      |  | (数字量)     |  | (单总线)    |  | (单总线)    |  | (I2C)       |   |
| +------+-------+  +------+------+  +------+------+  +------+------+  +------+------+   |
|        |                 |                |                |                |          |
| +------v-----------------v----------------v----------------v----------------v------+   |
| |                                  5V直流抽水泵                                      |   |
| |                     +---------+ 继电器驱动 +----------+                            |   |
| |                     |  继电器  <---------------------+                             |   |
| |                     +----+----+                      |                            |   |
| |                          |                           |                            |   |
| |                     +----v----+                      |                            |   |
| |                     | 蜂鸣器   <---------------------+                             |   |
| |                     | (高电平触发)                   |                            |   |
| +---------------------+-------------------------------+----------------------------+   |
+-----------------------------------------------------------------------------------------+

关键模块说明:

  1. 感知层

    • 土壤湿度:电阻式传感器(ADC采集)
    • 水位:浮球开关(数字IO)
    • 水温:DS18B20(单总线)
    • 环境温湿度:DHT11(单总线)
    • 光照强度:BH1750(I2C)
  2. 控制层

    • STM32主控:协调数据采集、逻辑判断、通信调度
    • 报警:蜂鸣器在阈值异常时触发
    • 显示:TFT LCD实时展示参数
  3. 执行层

    • 继电器控制5V水泵启停
    • 支持自动(阈值触发)和手动(APP控制)模式
  4. 通信层

    • ESP8266通过UART与STM32交互
    • MQTT协议连接华为云,实现双向数据传输
  5. 应用层

    • 华为云:数据存储/分析/告警
    • Qt5 APP:远程监控与控制界面

系统总体设计

本系统以STM32F103C8T6微控制器为核心构建远程农田智能灌溉系统。系统通过多类型传感器实时采集环境参数:电阻式土壤湿度传感器检测土壤湿度模拟信号,经STM32内置ADC转换;浮球式水位开关提供数字水位状态;DS18B20单总线传感器监测水温;DHT11数字传感器获取环境温湿度;BH1750光照传感器通过I2C接口采集光照强度。所有传感器数据由STM32集中处理。

执行控制部分采用继电器驱动5V直流抽水泵,支持自动与手动双模式。自动模式下,STM32根据预设土壤湿度阈值触发水泵;手动模式则通过远程指令控制。通信层由ESP8266 WiFi模块实现,基于MQTT协议将传感器数据上传至华为云物联网平台,同时接收云端下发的控制指令。

本地交互模块包含1.44寸SPI接口TFT LCD,实时显示所有传感器数据及系统状态(水泵开关/工作模式)。安全防护采用高电平触发有源蜂鸣器,当土壤湿度、水位或温度超过预设阈值时立即声光报警。远程控制端通过Qt5开发的PC端软件实现,用户可在界面查看实时数据并远程操控水泵。系统采用分级电源设计,传感器与逻辑电路由3.3V供电,水泵由独立5V电源驱动,确保稳定运行。

系统功能总结

功能描述 硬件模块
实时检测土壤湿度 电阻式土壤湿度传感器
实时检测水位 浮球式水位开关传感器
实时检测水温 DS18B20数字温度传感器
实时检测环境温湿度 DHT11温湿度传感器
实时检测光照强度 BH1750光照传感器
自动/手动控制抽水泵灌溉 继电器控制5V直流抽水泵
数据上传至云端(华为云物联网平台) ESP8266模块(WiFi,MQTT协议)
APP远程控制水泵 ESP8266模块(WiFi)
本地显示各项参数 1.44寸TFT LCD液晶显示屏(SPI接口)
阈值异常触发蜂鸣器报警 高电平触发有源蜂鸣器
系统主控与逻辑处理 STM32F103C8T6主控芯片
远程控制界面 Qt5 + C++开发的上位机软件

设计的各个功能模块描述

主控芯片STM32F103C8T6作为系统核心,负责协调所有传感器数据采集、逻辑判断和执行控制,通过内部ADC、GPIO、SPI、UART等接口连接各模块,实现数据处理和指令调度。土壤湿度检测采用电阻式传感器,通过模拟电压信号输出土壤含水率,连接至STM32的ADC引脚进行模数转换,实时监测农田墒情变化。水位检测使用浮球式水位开关传感器,直接输出高低电平数字信号至STM32的GPIO引脚,用于判断水源蓄水状态是否充足。水温检测由DS18B20数字温度传感器实现,通过单总线协议与STM32通信,精确获取灌溉水源的温度数据。

环境检测模块整合DHT11温湿度传感器和BH1750光照传感器,DHT11通过单总线协议提供环境温湿度数据,BH1750通过I2C接口输出光照强度值,共同构成农田气候监测基础。通信模块基于ESP8266 WiFi模块,通过UART串口与STM32交互,采用MQTT协议将传感器数据上传至华为云物联网平台,同时接收云端下发的控制指令实现远程交互。执行模块由继电器驱动5V直流抽水泵,STM32通过GPIO输出高低电平控制继电器通断,从而在自动模式(阈值触发)或手动模式(APP指令)下启停灌溉。

显示模块采用1.44寸TFT LCD液晶屏,通过SPI接口与STM32连接,实时本地化展示土壤湿度、水位、水温、环境温湿度及光照强度等参数,并显示系统工作模式状态。报警模块使用高电平触发的有源蜂鸣器,当土壤湿度过低、水位不足或环境参数超阈值时,STM32通过GPIO输出高电平触发蜂鸣器发出警报声。上位机软件基于Qt5与C++开发,部署于PC或移动端,提供数据可视化界面及水泵远程控制按钮,通过华为云平台与ESP8266通信,实现用户对灌溉系统的跨地域监控与操作。

上位机代码设计

上位机软件设计(Qt5 + C++)

#include <QtWidgets>
#include <QtMqtt/QtMqtt>
#include <QChart>
#include <QLineSeries>

// 华为云物联网平台连接参数
const QString BROKER = "iotda.cn-north-4.myhuaweicloud.com";
const int PORT = 1883;
const QString CLIENT_ID = "FarmIrrigation_APP";
const QString USERNAME = "your_username";
const QString PASSWORD = "your_password";
const QString SUB_TOPIC = "sensor/data";   // 订阅主题
const QString PUB_TOPIC = "pump/control"; // 发布主题

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
        // 初始化MQTT客户端
        mqttClient = new QMqttClient(this);
        mqttClient->setHostname(BROKER);
        mqttClient->setPort(PORT);
        mqttClient->setClientId(CLIENT_ID);
        mqttClient->setUsername(USERNAME);
        mqttClient->setPassword(PASSWORD);

        // 创建UI
        setupUI();

        // 连接MQTT信号
        connect(mqttClient, &QMqttClient::connected, this, &MainWindow::onConnected);
        connect(mqttClient, &QMqttClient::messageReceived, this, &MainWindow::onMessageReceived);

        // 连接服务器
        mqttClient->connectToHost();
    }

private slots:
    void onConnected() {
        qDebug() << "Connected to Huawei Cloud IoT!";
        auto subscription = mqttClient->subscribe(SUB_TOPIC);
        if (!subscription) {
            QMessageBox::critical(this, "Error", "Subscription failed!");
        }
    }

    void onMessageReceived(const QByteArray &message, const QMqttTopicName &topic) {
        QJsonDocument doc = QJsonDocument::fromJson(message);
        QJsonObject json = doc.object();

        // 更新传感器数据显示
        soilMoistureLabel->setText(QString::number(json["soil_moisture"].toDouble()) + "%");
        waterLevelLabel->setText(json["water_level"].toBool() ? "Normal" : "Low");
        waterTempLabel->setText(QString::number(json["water_temp"].toDouble()) + "°C");
        airTempLabel->setText(QString::number(json["air_temp"].toDouble()) + "°C");
        humidityLabel->setText(QString::number(json["humidity"].toDouble()) + "%");
        lightLabel->setText(QString::number(json["light"].toDouble()) + "lux");

        // 报警检测
        checkAlarms(json);
    }

    void onPumpControlClicked() {
        QMqttMessage msg;
        msg.setPayload(pumpSwitch->isChecked() ? "ON" : "OFF");
        mqttClient->publish(PUB_TOPIC, msg.payload());
    }

private:
    void setupUI() {
        // 主窗口设置
        setWindowTitle("智能灌溉监控系统");
        setFixedSize(800, 600);

        // 中央部件
        QWidget *centralWidget = new QWidget(this);
        setCentralWidget(centralWidget);

        // 主布局
        QGridLayout *layout = new QGridLayout(centralWidget);

        // 传感器数据显示区域
        QGroupBox *sensorGroup = new QGroupBox("实时传感器数据");
        QFormLayout *sensorLayout = new QFormLayout(sensorGroup);

        soilMoistureLabel = new QLabel("--");
        waterLevelLabel = new QLabel("--");
        waterTempLabel = new QLabel("--");
        airTempLabel = new QLabel("--");
        humidityLabel = new QLabel("--");
        lightLabel = new QLabel("--");

        sensorLayout->addRow("土壤湿度:", soilMoistureLabel);
        sensorLayout->addRow("水位状态:", waterLevelLabel);
        sensorLayout->addRow("水温:", waterTempLabel);
        sensorLayout->addRow("空气温度:", airTempLabel);
        sensorLayout->addRow("空气湿度:", humidityLabel);
        sensorLayout->addRow("光照强度:", lightLabel);

        // 水泵控制区域
        QGroupBox *controlGroup = new QGroupBox("水泵控制");
        QVBoxLayout *controlLayout = new QVBoxLayout(controlGroup);

        pumpSwitch = new QCheckBox("启动水泵");
        connect(pumpSwitch, &QCheckBox::clicked, this, &MainWindow::onPumpControlClicked);

        alarmLabel = new QLabel;
        alarmLabel->setStyleSheet("color: red; font-weight: bold;");
        alarmLabel->setAlignment(Qt::AlignCenter);

        controlLayout->addWidget(pumpSwitch);
        controlLayout->addWidget(alarmLabel);

        // 图表区域
        QChartView *chartView = new QChartView;
        chartView->setChart(new QChart);
        chartView->setRenderHint(QPainter::Antialiasing);

        // 布局组织
        layout->addWidget(sensorGroup, 0, 0);
        layout->addWidget(controlGroup, 0, 1);
        layout->addWidget(chartView, 1, 0, 1, 2);
    }

    void checkAlarms(const QJsonObject &data) {
        QString alarms;
        if (data["soil_moisture"].toDouble() < 30.0) {
            alarms += "土壤干旱! ";
        }
        if (!data["water_level"].toBool()) {
            alarms += "水位过低! ";
        }
        if (data["water_temp"].toDouble() > 35.0) {
            alarms += "水温过高! ";
        }

        alarmLabel->setText(alarms);
    }

    // UI组件
    QMqttClient *mqttClient;
    QLabel *soilMoistureLabel;
    QLabel *waterLevelLabel;
    QLabel *waterTempLabel;
    QLabel *airTempLabel;
    QLabel *humidityLabel;
    QLabel *lightLabel;
    QLabel *alarmLabel;
    QCheckBox *pumpSwitch;
};

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

#include "main.moc"

项目结构说明

  1. MQTT通信模块

    • 连接华为云物联网平台(需替换实际用户名/密码)
    • 订阅传感器数据主题(sensor/data
    • 发布水泵控制指令(pump/control
  2. UI界面设计

    • 传感器数据显示区域(土壤湿度/水位/水温/环境温湿度/光照)
    • 水泵控制开关(手动模式)
    • 报警信息显示区(阈值异常提示)
    • 数据图表区(预留扩展)
  3. 核心功能逻辑

    • 实时解析JSON格式传感器数据
    • 土壤湿度<30%触发干旱报警
    • 水位过低报警
    • 水温>35℃触发高温报警
    • 一键控制水泵启停

使用说明

  1. 依赖库

    Qt5 Core, Widgets, MQTT, Charts
    
  2. 配置文件

    • 修改华为云连接参数:

      const QString BROKER = "iotda.cn-north-4.myhuaweicloud.com";
      const QString USERNAME = "your_username";
      const QString PASSWORD = "your_password";
      
  3. 编译运行

    qmake && make
    ./智能灌溉监控系统
    

功能扩展建议

  1. 数据持久化

    // 添加SQLite数据库支持
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("irrigation_data.db");
    
  2. 历史曲线

    // 在图表区域添加时序曲线
    QLineSeries *series = new QLineSeries();
    chart->addSeries(series);
    
  3. 阈值设置界面

    // 添加设置对话框
    QDialog *settingsDlg = new QDialog;
    QDoubleSpinBox *soilThreshold = new QDoubleSpinBox(settingsDlg);
    
  4. 多设备支持

    // 使用QComboBox选择不同农田设备
    QComboBox *deviceSelector = new QComboBox;
    deviceSelector->addItems({"农田1", "农田2", "农田3"});
    

模块代码设计

STM32设备端模块代码设计

#include "stm32f10x.h"

// 引脚定义
#define SOIL_MOISTURE_PIN    GPIO_Pin_0   // PA0 (ADC0)
#define WATER_LEVEL_PIN      GPIO_Pin_1   // PA1 (浮球水位开关)
#define DS18B20_PIN         GPIO_Pin_2   // PA2 (水温)
#define DHT11_PIN           GPIO_Pin_3   // PA3 (环境温湿度)
#define PUMP_RELAY_PIN      GPIO_Pin_11  // PA11 (水泵继电器)
#define BUZZER_PIN          GPIO_Pin_12  // PA12 (蜂鸣器)

// LCD SPI引脚
#define LCD_CS_PIN          GPIO_Pin_4   // PA4
#define LCD_SCK_PIN         GPIO_Pin_5   // PA5
#define LCD_MISO_PIN        GPIO_Pin_6   // PA6
#define LCD_MOSI_PIN        GPIO_Pin_7   // PA7
#define LCD_DC_PIN          GPIO_Pin_8   // PA8
#define LCD_RST_PIN         GPIO_Pin_9   // PA9

// ESP8266 USART1引脚
#define ESP_TX_PIN          GPIO_Pin_9   // PA9 (USART1_TX)
#define ESP_RX_PIN          GPIO_Pin_10  // PA10 (USART1_RX)

// I2C引脚 (BH1750)
#define I2C_SCL_PIN         GPIO_Pin_6   // PB6
#define I2C_SDA_PIN         GPIO_Pin_7   // PB7

// 传感器数据结构
typedef struct {
    uint16_t soil_moisture;  // 土壤湿度 (0-4095)
    uint8_t water_level;     // 水位状态 (0/1)
    float water_temp;        // 水温 (°C)
    float air_temp;          // 空气温度 (°C)
    uint8_t air_humidity;    // 空气湿度 (%)
    uint16_t light_intensity; // 光照强度 (lx)
} SensorData;

// 全局变量
SensorData sensor_data;
uint8_t pump_mode = 0;  // 0:自动 1:手动
uint8_t pump_state = 0; // 水泵状态

// 函数声明
void RCC_Configuration(void);
void GPIO_Configuration(void);
void ADC_Configuration(void);
void USART_Configuration(void);
void SPI_Configuration(void);
void I2C_Configuration(void);
void NVIC_Configuration(void);

uint16_t Read_Soil_Moisture(void);
uint8_t Read_Water_Level(void);
float Read_Water_Temperature(void);
void Read_DHT11(uint8_t *temp, uint8_t *hum);
uint16_t Read_BH1750(void);
void Control_Pump(uint8_t state);
void Buzzer_Alert(uint8_t state);
void LCD_Display(const SensorData *data);
void ESP8266_SendData(const SensorData *data);
void Delay_ms(uint32_t ms);

int main(void) {
    // 系统初始化
    RCC_Configuration();
    GPIO_Configuration();
    ADC_Configuration();
    USART_Configuration();
    SPI_Configuration();
    I2C_Configuration();
    NVIC_Configuration();
    
    // 传感器初始化
    // (DS18B20/DHT11/BH1750需要特定初始化序列,此处省略)
    
    while(1) {
        // 读取所有传感器数据
        sensor_data.soil_moisture = Read_Soil_Moisture();
        sensor_data.water_level = Read_Water_Level();
        sensor_data.water_temp = Read_Water_Temperature();
        Read_DHT11(&sensor_data.air_temp, &sensor_data.air_humidity);
        sensor_data.light_intensity = Read_BH1750();
        
        // 自动模式控制水泵
        if(pump_mode == 0) {
            if(sensor_data.soil_moisture > 2500) {  // 土壤干燥阈值
                Control_Pump(1);
            } else {
                Control_Pump(0);
            }
        }
        
        // 异常报警
        if(sensor_data.water_level == 0 || sensor_data.air_temp > 40) {
            Buzzer_Alert(1);
        } else {
            Buzzer_Alert(0);
        }
        
        // LCD显示
        LCD_Display(&sensor_data);
        
        // 数据上传云端
        ESP8266_SendData(&sensor_data);
        
        Delay_ms(5000);  // 5秒采集周期
    }
}

// ADC初始化 (土壤湿度)
void ADC_Configuration(void) {
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;  // 使能ADC1时钟
    ADC1->CR2 = ADC_CR2_ADON;             // 开启ADC
    
    // 配置通道0 (PA0)
    ADC1->SMPR2 = ADC_SMPR2_SMP0_0 | ADC_SMPR2_SMP0_1 | ADC_SMPR2_SMP0_2; // 239.5周期采样
    ADC1->SQR3 = 0;  // 通道0作为第一个转换
}

// 读取土壤湿度
uint16_t Read_Soil_Moisture(void) {
    ADC1->CR2 |= ADC_CR2_ADON;        // 启动ADC
    while(!(ADC1->SR & ADC_SR_EOC));   // 等待转换完成
    return ADC1->DR;                   // 返回ADC值
}

// 读取水位开关
uint8_t Read_Water_Level(void) {
    return GPIOA->IDR & WATER_LEVEL_PIN ? 1 : 0;
}

// DS18B20水温读取 (简化版)
float Read_Water_Temperature(void) {
    // 实现单总线协议读取温度
    // 返回摄氏度温度值
    return 25.5f;  // 示例返回值
}

// DHT11温湿度读取
void Read_DHT11(uint8_t *temp, uint8_t *hum) {
    // 实现单总线协议读取数据
    *temp = 26;  // 示例温度
    *hum = 65;   // 示例湿度
}

// BH1750光照强度读取
uint16_t Read_BH1750(void) {
    // I2C协议读取光照值
    return 850;  // 示例光照值(lx)
}

// 水泵控制
void Control_Pump(uint8_t state) {
    if(state) {
        GPIOA->BSRR = PUMP_RELAY_PIN;  // 开启水泵
        pump_state = 1;
    } else {
        GPIOA->BRR = PUMP_RELAY_PIN;   // 关闭水泵
        pump_state = 0;
    }
}

// 蜂鸣器报警
void Buzzer_Alert(uint8_t state) {
    if(state) {
        GPIOA->BSRR = BUZZER_PIN;  // 蜂鸣器响
    } else {
        GPIOA->BRR = BUZZER_PIN;   // 蜂鸣器停
    }
}

// ESP8266数据发送 (MQTT协议)
void ESP8266_SendData(const SensorData *data) {
    char buffer[128];
    sprintf(buffer, "{\"soil\":%d,\"water_temp\":%.1f,\"air_temp\":%d,\"hum\":%d,\"light\":%d}",
            data->soil_moisture, data->water_temp, 
            (int)data->air_temp, data->air_humidity, 
            data->light_intensity);
    
    // 通过USART1发送数据
    for(char *p = buffer; *p; p++) {
        USART1->DR = *p;
        while(!(USART1->SR & USART_SR_TC));
    }
}

// LCD显示函数
void LCD_Display(const SensorData *data) {
    // SPI传输显示数据
    // 实现显示界面布局
}

// 时钟配置
void RCC_Configuration(void) {
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN |
                    RCC_APB2ENR_AFIOEN | RCC_APB2ENR_ADC1EN |
                    RCC_APB2ENR_SPI1EN | RCC_APB2ENR_USART1EN;
    
    RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
}

// GPIO配置
void GPIO_Configuration(void) {
    // 配置PA0为模拟输入 (土壤湿度)
    GPIOA->CRL &= ~(GPIO_CRL_MODE0 | GPIO_CRL_CNF0);
    
    // 配置PA1为输入 (水位开关)
    GPIOA->CRL &= ~(GPIO_CRL_MODE1 | GPIO_CRL_CNF1_0);
    GPIOA->CRL |= GPIO_CRL_CNF1_1;  // 上拉输入
    
    // 配置PA11,PA12为推挽输出 (继电器和蜂鸣器)
    GPIOA->CRH |= GPIO_CRH_MODE11 | GPIO_CRH_MODE12;
    GPIOA->CRH &= ~(GPIO_CRH_CNF11 | GPIO_CRH_CNF12);
    
    // 配置USART1引脚
    GPIOA->CRH |= GPIO_CRH_MODE9;  // PA9推挽输出
    GPIOA->CRH &= ~GPIO_CRH_CNF9;
    GPIOA->CRH |= GPIO_CRH_CNF9_1; // 复用输出
    
    GPIOA->CRH &= ~GPIO_CRH_MODE10; // PA10浮空输入
    GPIOA->CRH |= GPIO_CRH_CNF10_0;
    GPIOA->CRH &= ~GPIO_CRH_CNF10_1;
    
    // 配置I2C引脚 (开漏输出)
    GPIOB->CRL |= GPIO_CRL_MODE6 | GPIO_CRL_MODE7;
    GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_CNF7);
    GPIOB->CRL |= GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0;
}

// USART配置 (ESP8266通信)
void USART_Configuration(void) {
    USART1->BRR = 0x1D4C;  // 72MHz/9600=0x1D4C
    USART1->CR1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
}

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

关键模块说明

  1. ADC配置

    • 使用PA0采集土壤湿度模拟信号
    • 239.5周期采样提高精度
    • 直接读取DR寄存器获取转换结果
  2. 数字传感器读取

    • 水位开关:PA1数字输入,水位正常时高电平
    • DS18B20:实现单总线协议读取水温
    • DHT11:单总线协议读取空气温湿度
    • BH1750:I2C接口读取光照强度
  3. 执行器控制

    • 继电器控制:PA11输出高电平启动水泵
    • 蜂鸣器控制:PA12输出高电平触发报警
  4. 通信接口

    • USART1:与ESP8266通信,波特率9600
    • SPI1:驱动TFT LCD显示屏
    • I2C1:连接BH1750光照传感器
  5. 云端通信

    • 数据封装为JSON格式
    • 通过MQTT协议上传至华为云
    • 包含所有传感器数据和设备状态
  6. 控制逻辑

    • 自动模式:土壤湿度>2500时启动水泵
    • 手动模式:通过APP远程控制
    • 异常报警:水位不足或温度超限触发蜂鸣器

项目核心代码

以下是基于STM32F103C8T6的远程农田智能灌溉系统核心代码(main.c),采用寄存器方式开发:

#include "stm32f10x.h"
#include "dht11.h"
#include "ds18b20.h"
#include "bh1750.h"
#include "lcd_spi.h"
#include "esp8266_mqtt.h"
#include "buzzer.h"
#include "relay.h"
#include "soil_moisture.h"
#include "water_level.h"

// 传感器阈值定义
#define SOIL_HUMIDITY_THRESHOLD  40    // 土壤湿度阈值(%)
#define WATER_LEVEL_THRESHOLD    20    // 水位阈值(cm)
#define TEMP_THRESHOLD_HIGH      40    // 高温阈值(℃)
#define TEMP_THRESHOLD_LOW       5     // 低温阈值(℃)

// 全局变量
uint8_t System_Mode = 0;               // 0:自动模式 1:手动模式
volatile uint32_t sysTick = 0;

// 传感器数据结构体
typedef struct {
  float soil_humidity;      // 土壤湿度(%)
  uint8_t water_level;      // 水位状态(0:正常 1:低水位)
  float water_temp;         // 水温(℃)
  float air_temp;           // 空气温度(℃)
  float air_humidity;       // 空气湿度(%)
  uint16_t light_intensity; // 光照强度(Lux)
} SensorData_t;

SensorData_t sensorData;

// 系统初始化函数
void System_Init(void) {
  // 配置系统时钟
  RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | 
                  RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;
  
  // 初始化SysTick定时器(1ms中断)
  SysTick_Config(SystemCoreClock / 1000);
  
  // 外设初始化
  LCD_Init();
  DHT11_Init();
  DS18B20_Init(GPIOB, GPIO_Pin_5);
  BH1750_Init();
  ESP8266_Init();
  Buzzer_Init();
  Relay_Init();
  SoilMoisture_Init();
  WaterLevel_Init();
  
  // 显示欢迎界面
  LCD_Clear(BLUE);
  LCD_ShowString(10, 10, "Smart Farm System", WHITE, BLUE);
  LCD_ShowString(10, 30, "Initializing...", WHITE, BLUE);
  Delay_ms(1000);
}

// 传感器数据采集函数
void Sensor_Data_Update(void) {
  // 读取土壤湿度(ADC值转换)
  uint16_t adc_val = SoilMoisture_Read();
  sensorData.soil_humidity = 100 - (adc_val / 40.95);  // 假设0-4095对应0-100%
  
  // 读取水位开关状态
  sensorData.water_level = WaterLevel_Read();
  
  // 读取水温
  sensorData.water_temp = DS18B20_GetTemp();
  
  // 读取空气温湿度
  DHT11_ReadData(&sensorData.air_temp, &sensorData.air_humidity);
  
  // 读取光照强度
  sensorData.light_intensity = BH1750_ReadLightIntensity();
}

// 本地LCD显示函数
void LCD_Display_Update(void) {
  LCD_Clear(BLUE);
  
  // 显示模式
  LCD_ShowString(10, 10, "Mode:", WHITE, BLUE);
  LCD_ShowString(60, 10, (System_Mode == 0) ? "AUTO" : "MANUAL", YELLOW, BLUE);
  
  // 显示传感器数据
  LCD_ShowString(10, 30, "Soil:%d%%", WHITE, BLUE, (int)sensorData.soil_humidity);
  LCD_ShowString(10, 50, "Water:%s", WHITE, BLUE, sensorData.water_level ? "LOW" : "OK");
  LCD_ShowString(10, 70, "Temp:%.1fC", WHITE, BLUE, sensorData.water_temp);
  LCD_ShowString(10, 90, "Air:%.1fC/%.1f%%", WHITE, BLUE, sensorData.air_temp, sensorData.air_humidity);
  LCD_ShowString(10, 110, "Light:%d Lux", WHITE, BLUE, sensorData.light_intensity);
  
  // 显示水泵状态
  LCD_ShowString(10, 130, "Pump:", WHITE, BLUE);
  LCD_ShowString(60, 130, (GPIOB->ODR & GPIO_Pin_8) ? "ON " : "OFF", RED, BLUE);
}

// 自动灌溉控制逻辑
void Auto_Irrigation_Control(void) {
  // 条件1: 土壤湿度低于阈值且水位正常
  // 条件2: 温度在适宜范围内(5℃-40℃)
  if((sensorData.soil_humidity < SOIL_HUMIDITY_THRESHOLD) && 
     (sensorData.water_level == 0) &&
     (sensorData.water_temp > TEMP_THRESHOLD_LOW) &&
     (sensorData.water_temp < TEMP_THRESHOLD_HIGH)) {
    Relay_On();  // 开启水泵
  } else {
    Relay_Off(); // 关闭水泵
  }
}

// 异常检测与报警
void Alarm_Check(void) {
  uint8_t alarm_flag = 0;
  
  // 水位过低报警
  if(sensorData.water_level) {
    LCD_ShowString(10, 150, "WATER LOW ALARM!", RED, BLUE);
    alarm_flag = 1;
  }
  
  // 温度异常报警
  if((sensorData.water_temp <= TEMP_THRESHOLD_LOW) || 
     (sensorData.water_temp >= TEMP_THRESHOLD_HIGH)) {
    LCD_ShowString(10, 170, "TEMP ALARM!", RED, BLUE);
    alarm_flag = 1;
  }
  
  // 触发蜂鸣器
  if(alarm_flag) {
    Buzzer_On();
  } else {
    Buzzer_Off();
  }
}

// 云端通信处理
void Cloud_Communication(void) {
  // 上传传感器数据到华为云
  ESP8266_SendData(sensorData.soil_humidity, 
                  sensorData.water_level,
                  sensorData.water_temp,
                  sensorData.air_temp,
                  sensorData.air_humidity,
                  sensorData.light_intensity);
  
  // 检查云端控制命令
  uint8_t cmd = ESP8266_CheckCommand();
  if(cmd != 0xFF) {
    System_Mode = 1;  // 切换到手动模式
    
    // 执行控制命令
    if(cmd == 0x01) Relay_On();
    else if(cmd == 0x00) Relay_Off();
  }
}

// SysTick中断服务函数
void SysTick_Handler(void) {
  sysTick++;
}

// 延时函数
void Delay_ms(uint32_t ms) {
  uint32_t start = sysTick;
  while((sysTick - start) < ms);
}

int main(void) {
  System_Init();
  
  while(1) {
    // 每2秒更新一次数据
    if(sysTick % 2000 == 0) {
      Sensor_Data_Update();
      LCD_Display_Update();
      Alarm_Check();
      Cloud_Communication();
      
      // 自动模式执行灌溉控制
      if(System_Mode == 0) {
        Auto_Irrigation_Control();
      }
    }
    
    // 处理ESP8266接收数据
    ESP8266_ReceiveHandler();
  }
}

代码说明:

  1. 系统初始化

    • 配置时钟和外设(LCD、传感器、通信模块等)
    • 初始化SysTick定时器用于精确延时
  2. 数据采集

    • 土壤湿度(ADC读取模拟信号)
    • 水位开关(数字输入)
    • 水温(DS18B20单总线)
    • 空气温湿度(DHT11)
    • 光照强度(BH1750 I2C)
  3. 控制逻辑

    • 自动模式:土壤湿度低于阈值+水位正常+温度适宜时启动水泵
    • 手动模式:通过云端指令控制水泵
  4. 云端通信

    • 使用ESP8266通过MQTT协议连接华为云
    • 定时上传传感器数据
    • 接收云端控制指令
  5. 异常处理

    • 水位过低触发蜂鸣器报警
    • 温度超出阈值触发报警
    • LCD界面显示异常状态
  6. 人机交互

    • 1.44寸TFT LCD实时显示系统状态
    • 界面包含模式指示、传感器数据和水泵状态

总结

本文设计的基于STM32的远程农田智能灌溉系统,通过集成多传感器与智能控制模块,实现了农田环境的精准监测与自动化管理。系统以STM32F103C8T6为核心,实时采集土壤湿度、水位、水温、环境温湿度及光照等关键参数,结合阈值判断实现抽水泵的自动启停,有效解决了传统灌溉的资源浪费问题,显著提升了农业生产的智能化水平。

硬件设计上,系统采用电阻式土壤湿度传感器、浮球水位开关、DS18B20水温传感器及DHT11、BH1750环境传感器构建数据采集网络,确保环境参数的全面感知;通过ESP8266模块以MQTT协议将数据上传至华为云物联网平台,实现云端数据存储与分析;本地由SPI接口的TFT LCD显示屏实时展示参数,配合继电器控制水泵和有源蜂鸣器报警模块,形成完整的闭环控制链路。

软件层面,依托华为云平台的远程管理能力,用户可通过Qt5开发的APP界面远程监控农田状态并手动干预水泵操作,实现"云端-设备-用户"的高效交互。系统兼具自动灌溉与异常预警功能,在土壤湿度不足或水位异常时主动触发蜂鸣器报警,保障灌溉安全。最终,该系统以低功耗、高可靠性及灵活的扩展性,为现代农业提供了智能化、网络化的灌溉解决方案。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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