自学内容网 自学内容网

基于STM32的智慧农业监测系统:LoRa通讯、Flutte集成设计流程

一、项目概述

项目目标

在现代农业生产中,智慧农业的理念逐渐兴起,关注如何利用先进的技术提高农业生产效率、保证食品安全和优化资源配置。基于STM32的智慧农业监测系统旨在通过传感器实时监测环境参数(如温湿度、土壤湿度、光照强度等),并将这些数据传输至云端,以支持远程监控和智能决策。这一系统将为农户提供便捷的管理工具,帮助其优化农作物的生长环境,提高农业产量和质量。

技术栈关键词

  • 主控模块:STM32F407ZG

    • 温湿度传感器:DHT22

    • 土壤水分传感器:YL-69

    • 光照传感器:BH1750

    • 风速传感器(可选):Anemometer

    • 通讯模块:LORA

    • 电源模块:18650锂电池 + TP4056充电模块

  • 用户界面:Flutter

二、系统架构

系统架构设计

本系统主要由四个核心模块组成:传感器模块、主控模块、通讯模块和用户界面。每个模块功能明确,通过定义良好的接口进行数据交互,确保系统整体的稳定性与高效性。

数据采集
数据处理
数据上传
数据查询
传感器模块
STM32F407ZG主控模块
LORA通讯模块
云端服务器
Flutter手机APP

组件选择

  1. 主控模块:STM32F407ZG

    • 优势:该微控制器具有高性能的Cortex-M4内核,主频可达168MHz,支持浮点运算,拥有丰富的外设接口(如USART、I2C、ADC等),适合处理多种传感器数据和实现复杂的控制逻辑。
  2. 传感器模块:

    • DHT22温湿度传感器:具有高精度(温度±0.5°C,湿度±2%RH),适合农业环境监测,可通过单总线与STM32连接。

    • YL-69土壤水分传感器:通过电阻原理测量土壤湿度,适合监测土壤水分,帮助判断灌溉需求。

    • BH1750光照传感器:基于I2C接口,能够提供高精度的光照强度测量,适合评估植物光照环境。

    • 风速传感器(Anemometer,选配):通过旋转速度测量风速,帮助监测气候条件。

  3. 通讯模块:LORA模块

    • 特点:LORA是一种低功耗广域网(LPWAN)技术,适合于农业环境的长距离、低速率数据传输,支持远程监控,延长电池使用寿命。
  4. 电源模块:18650锂电池 + TP4056充电模块

    • 设计:18650锂电池提供稳定的电源,TP4056充电模块可确保安全充电,适应不同的环境需求。
  5. 用户界面:Flutter

    • 开发:使用Flutter开发跨平台移动应用,提供友好的用户界面,实现实时数据监控和历史数据查询功能。

软件环境搭建

  1. 开发环境准备:

    • 安装并配置STM32的开发环境,推荐使用STM32CubeIDE或Keil MDK。在IDE中创建新的STM32项目,并选择相应的微控制器型号。
  2. 库文件导入:

    • 下载并导入各个传感器(DHT22、YL-69、BH1750)和LORA模块的库文件,确保代码可以调用这些库中的功能,从而简化开发过程。
  3. Flutter开发环境:

    • 安装Flutter SDK,并配置相关的开发环境(如Android Studio或Visual Studio Code),以便进行移动端应用的开发和调试。

注意事项

  • 在硬件连接时,仔细检查每个连接端口,以确保无误,避免因短路或接错而导致模块损坏。

  • 在调试过程中,建议使用串口监视器查看传感器数据输出,便于快速定位问题。

  • 在进行无线通讯时,确保LORA模块的频率设置符合当地的无线电管理规定,以避免干扰。

四、代码实现过程

在本部分中,我们将详细介绍STM32微控制器的代码实现过程。该过程分为几个主要模块,包括初始化、传感器读取、数据处理、无线数据传输等。我们将逐步实现这些功能,并提供相应的代码示例和解释。

1. 系统总体架构

系统的总体架构包含以下几个模块:

  • 主控模块:STM32F407ZG,负责数据处理与控制。

  • 传感器模块:包括DHT22、YL-69、BH1750等,用于环境数据采集。

  • 通讯模块:LORA模块,负责将数据发送至云端。

  • 电源管理:18650锂电池与TP4056充电模块,确保系统稳定供电。

2. 代码结构

代码的基本结构如下:

  • main.c:主程序文件,负责系统初始化与主循环。

  • sensor.c:传感器模块,负责初始化和读取传感器数据。

  • lora.c:LORA模块,负责数据发送功能。

  • power.c:电源管理模块(可选),负责电源状态监测。

3. 主程序 main.c

以下是主程序的代码示例,负责系统的初始化和数据处理的主循环。

#include "stm32f4xx_hal.h"
#include "dht22.h"
#include "yl69.h"
#include "bh1750.h"
#include "lora.h"

// 传感器数据结构体
typedef struct {
    float temperature;   // 温度
    float humidity;      // 湿度
    float soilMoisture;  // 土壤湿度
    float lightIntensity; // 光照强度
} SensorData;

SensorData sensorData; // 声明传感器数据结构体

// 系统初始化函数
void System_Init() {
    HAL_Init();                 // 初始化HAL库
    SystemClock_Config();       // 配置系统时钟
    DHT22_Init();              // 初始化DHT22传感器
    YL69_Init();               // 初始化YL-69传感器
    BH1750_Init();             // 初始化BH1750传感器
    LORA_Init();               // 初始化LORA模块
}

// 读取传感器数据的函数
void Read_Sensors() {
    sensorData.temperature = DHT22_Read_Temperature(); // 读取DHT22温度
    sensorData.humidity = DHT22_Read_Humidity();       // 读取DHT22湿度
    sensorData.soilMoisture = YL69_Read_SoilMoisture(); // 读取YL-69土壤湿度
    sensorData.lightIntensity = BH1750_Read_LightIntensity(); // 读取BH1750光照强度
}

// 发送数据到LORA的函数
void Send_Data() {
    char dataBuffer[100]; // 数据缓冲区
    snprintf(dataBuffer, sizeof(dataBuffer), 
             "Temperature: %.2f, Humidity: %.2f, Soil Moisture: %.2f, Light Intensity: %.2f",
             sensorData.temperature, sensorData.humidity, 
             sensorData.soilMoisture, sensorData.lightIntensity);
    
    LORA_Send(dataBuffer); // 发送数据到LORA
}

int main(void) {
    System_Init(); // 初始化系统
    while (1) {
        Read_Sensors(); // 读取传感器数据
        Send_Data();    // 发送数据到LORA
        HAL_Delay(60000); // 每60秒读取一次数据
    }
}

4. 传感器模块 sensor.c

此模块负责对各传感器的初始化和数据读取。具体实现如下:

#include "dht22.h"
#include "yl69.h"
#include "bh1750.h"

// 初始化DHT22传感器
void DHT22_Init() {
    // 配置GPIO引脚
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟

    // 设置DHT22引脚为输入模式
    GPIO_InitStruct.Pin = GPIO_PIN_0; // 假设DHT22连接在PA0
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// 从DHT22读取温度
float DHT22_Read_Temperature() {
    float temperature = 0.0;
    // 读取温度的具体实现
    // 参考DHT22的库函数或手动实现
    return temperature; // 返回读取到的温度值
}

// 从DHT22读取湿度
float DHT22_Read_Humidity() {
    float humidity = 0.0;
    // 读取湿度的具体实现
    return humidity; // 返回读取到的湿度值
}

// 初始化YL-69土壤湿度传感器
void YL69_Init() {
    // 配置模拟输入引脚
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟

    // 设置YL-69引脚为模拟输入模式
    GPIO_InitStruct.Pin = GPIO_PIN_1; // 假设YL-69连接在PA1
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// 从YL-69读取土壤湿度
float YL69_Read_SoilMoisture() {
    uint32_t adcValue = HAL_ADC_GetValue(&hadc1); // 假设hadc1是ADC句柄
    float soilMoisture = (float)adcValue / 4096 * 100; // 转换为百分比
    return soilMoisture; // 返回读取到的土壤湿度值
}

// 初始化BH1750光照传感器
void BH1750_Init() {
    // 初始化I2C接口
    HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDR, &cmd, 1, 100); // 假设hi2c1是I2C句柄
}

// 从BH1750读取光照强度
float BH1750_Read_LightIntensity() {
    uint8_t data[2];
    HAL_I2C_Mem_Read(&hi2c1, BH1750_ADDR, BH1750_CMD_READ, I2C_MEMADD_SIZE_8BIT, data, 2, 100);
    uint16_t lux = (data[0] << 8) | data[1]; // 合并高低字节
    float lightIntensity = lux / 1.2; // 转换为Lux
    return lightIntensity; // 返回读取到的光照强度值
}

5. LORA模块 lora.c

此模块负责与LORA模块的初始化和数据发送。具体实现如下:

#include "lora.h"
#include "stm32f4xx_hal.h"

// LORA模块初始化
void LORA_Init() {
    // 配置LORA模块的GPIO引脚
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟

    // 设置LORA模块的引脚
    GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; // 假设LORA模块连接在PB6和PB7
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    // 其他初始化步骤,如配置UART或SPI等
}

// 发送数据到LORA模块
void LORA_Send(char *data) {
    // 发送数据的具体实现
    HAL_UART_Transmit(&huart1, (uint8_t*)data, strlen(data), 100); // 假设huart1是UART句柄
}

6. 电源管理模块 power.c(可选)

该模块负责监测电源状态及电池电量,具体实现如下:

#include "power.h"
#include "stm32f4xx_hal.h"

// 初始化电源管理模块
void Power_Init() {
    // 配置电池电压监测引脚
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟

    // 设置电源状态引脚为输入模式
    GPIO_InitStruct.Pin = GPIO_PIN_2; // 假设电源状态引脚连接在PA2
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// 读取电池电压
float Read_Battery_Voltage() {
    // 假设ADC1用于读取电池电压
    HAL_ADC_Start(&hadc1); // 启动ADC
    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // 等待转换完成
    uint32_t adcValue = HAL_ADC_GetValue(&hadc1); // 获取ADC值
    float voltage = (adcValue / 4096.0) * 3.3; // 转换为电压,假设参考电压为3.3V
    return voltage; // 返回电池电压
}

// 检查电池电量
void Check_Battery_Status() {
    float voltage = Read_Battery_Voltage();
    if (voltage < 3.0) { // 假设3.0V为低电量阈值
        // 执行低电量处理,如进入低功耗模式或关闭某些功能
    }
}

代码时序图

STM32F407ZG DHT22 YL-69 BH1750 LORA模块 电源管理 检查电源状态 返回电池电压 读取温度和湿度 返回温度、湿度 读取土壤湿度 返回土壤湿度 读取光照强度 返回光照强度 发送数据 确认发送 STM32F407ZG DHT22 YL-69 BH1750 LORA模块 电源管理

原文地址:https://blog.csdn.net/qq_40431685/article/details/142860240

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!