基于STM32的远程农田智能灌溉系统设计
项目开发背景
项目开发背景
随着全球水资源日益紧张和农业现代化进程的加速,传统粗放式的农田灌溉方式因其水资源浪费严重、人工依赖度高、无法精准响应作物需求等弊端,已难以满足可持续农业发展的要求。尤其在气候多变、劳动力成本上升的背景下,如何高效利用水资源、降低生产成本、提升作物产量与品质,成为农业领域亟待解决的关键问题。
物联网技术的迅猛发展为解决上述问题提供了有效途径。基于嵌入式系统、传感器网络和无线通信的智能灌溉系统,能够实现对农田环境的实时精准监测与自动化控制。通过部署土壤湿度、水位、环境参数等传感器,系统可精确感知作物需水状况及环境变化,并依据预设策略或远程指令智能启停灌溉设备,实现按需供水。这不仅极大减少了水资源浪费,降低了人力投入,更能避免因人工判断失误或响应延迟导致的作物干旱或涝渍损害,显著提升灌溉效率与农业生产效益。
本项目正是在此背景下提出的。旨在设计并实现一套基于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----+ | | |
| | | 蜂鸣器 <---------------------+ | |
| | | (高电平触发) | | |
| +---------------------+-------------------------------+----------------------------+ |
+-----------------------------------------------------------------------------------------+
关键模块说明:
-
感知层
- 土壤湿度:电阻式传感器(ADC采集)
- 水位:浮球开关(数字IO)
- 水温:DS18B20(单总线)
- 环境温湿度:DHT11(单总线)
- 光照强度:BH1750(I2C)
-
控制层
- STM32主控:协调数据采集、逻辑判断、通信调度
- 报警:蜂鸣器在阈值异常时触发
- 显示:TFT LCD实时展示参数
-
执行层
- 继电器控制5V水泵启停
- 支持自动(阈值触发)和手动(APP控制)模式
-
通信层
- ESP8266通过UART与STM32交互
- MQTT协议连接华为云,实现双向数据传输
-
应用层
- 华为云:数据存储/分析/告警
- 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"
项目结构说明
-
MQTT通信模块:
- 连接华为云物联网平台(需替换实际用户名/密码)
- 订阅传感器数据主题(
sensor/data
) - 发布水泵控制指令(
pump/control
)
-
UI界面设计:
- 传感器数据显示区域(土壤湿度/水位/水温/环境温湿度/光照)
- 水泵控制开关(手动模式)
- 报警信息显示区(阈值异常提示)
- 数据图表区(预留扩展)
-
核心功能逻辑:
- 实时解析JSON格式传感器数据
- 土壤湿度<30%触发干旱报警
- 水位过低报警
- 水温>35℃触发高温报警
- 一键控制水泵启停
使用说明
-
依赖库:
Qt5 Core, Widgets, MQTT, Charts
-
配置文件:
-
修改华为云连接参数:
const QString BROKER = "iotda.cn-north-4.myhuaweicloud.com"; const QString USERNAME = "your_username"; const QString PASSWORD = "your_password";
-
-
编译运行:
qmake && make ./智能灌溉监控系统
功能扩展建议
-
数据持久化:
// 添加SQLite数据库支持 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("irrigation_data.db");
-
历史曲线:
// 在图表区域添加时序曲线 QLineSeries *series = new QLineSeries(); chart->addSeries(series);
-
阈值设置界面:
// 添加设置对话框 QDialog *settingsDlg = new QDialog; QDoubleSpinBox *soilThreshold = new QDoubleSpinBox(settingsDlg);
-
多设备支持:
// 使用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++);
}
关键模块说明
-
ADC配置:
- 使用PA0采集土壤湿度模拟信号
- 239.5周期采样提高精度
- 直接读取DR寄存器获取转换结果
-
数字传感器读取:
- 水位开关:PA1数字输入,水位正常时高电平
- DS18B20:实现单总线协议读取水温
- DHT11:单总线协议读取空气温湿度
- BH1750:I2C接口读取光照强度
-
执行器控制:
- 继电器控制:PA11输出高电平启动水泵
- 蜂鸣器控制:PA12输出高电平触发报警
-
通信接口:
- USART1:与ESP8266通信,波特率9600
- SPI1:驱动TFT LCD显示屏
- I2C1:连接BH1750光照传感器
-
云端通信:
- 数据封装为JSON格式
- 通过MQTT协议上传至华为云
- 包含所有传感器数据和设备状态
-
控制逻辑:
- 自动模式:土壤湿度>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();
}
}
代码说明:
-
系统初始化:
- 配置时钟和外设(LCD、传感器、通信模块等)
- 初始化SysTick定时器用于精确延时
-
数据采集:
- 土壤湿度(ADC读取模拟信号)
- 水位开关(数字输入)
- 水温(DS18B20单总线)
- 空气温湿度(DHT11)
- 光照强度(BH1750 I2C)
-
控制逻辑:
- 自动模式:土壤湿度低于阈值+水位正常+温度适宜时启动水泵
- 手动模式:通过云端指令控制水泵
-
云端通信:
- 使用ESP8266通过MQTT协议连接华为云
- 定时上传传感器数据
- 接收云端控制指令
-
异常处理:
- 水位过低触发蜂鸣器报警
- 温度超出阈值触发报警
- LCD界面显示异常状态
-
人机交互:
- 1.44寸TFT LCD实时显示系统状态
- 界面包含模式指示、传感器数据和水泵状态
总结
本文设计的基于STM32的远程农田智能灌溉系统,通过集成多传感器与智能控制模块,实现了农田环境的精准监测与自动化管理。系统以STM32F103C8T6为核心,实时采集土壤湿度、水位、水温、环境温湿度及光照等关键参数,结合阈值判断实现抽水泵的自动启停,有效解决了传统灌溉的资源浪费问题,显著提升了农业生产的智能化水平。
硬件设计上,系统采用电阻式土壤湿度传感器、浮球水位开关、DS18B20水温传感器及DHT11、BH1750环境传感器构建数据采集网络,确保环境参数的全面感知;通过ESP8266模块以MQTT协议将数据上传至华为云物联网平台,实现云端数据存储与分析;本地由SPI接口的TFT LCD显示屏实时展示参数,配合继电器控制水泵和有源蜂鸣器报警模块,形成完整的闭环控制链路。
软件层面,依托华为云平台的远程管理能力,用户可通过Qt5开发的APP界面远程监控农田状态并手动干预水泵操作,实现"云端-设备-用户"的高效交互。系统兼具自动灌溉与异常预警功能,在土壤湿度不足或水位异常时主动触发蜂鸣器报警,保障灌溉安全。最终,该系统以低功耗、高可靠性及灵活的扩展性,为现代农业提供了智能化、网络化的灌溉解决方案。
- 点赞
- 收藏
- 关注作者
评论(0)