当前位置: 首页 > news >正文

基于STM32的智能灌溉系统

目录

  1. 引言
  2. 环境准备工作
    • 硬件准备
    • 软件安装与配置
  3. 系统设计
    • 系统架构
    • 硬件连接
  4. 代码实现
    • 初始化代码
    • 传感器读取和控制代码
  5. 应用场景
    • 农业灌溉
    • 花园自动灌溉
  6. 常见问题及解决方案
    • 常见问题
    • 解决方案
  7. 结论

1. 引言

智能灌溉系统通过实时监测土壤湿度和环境温度,自动控制灌溉设备的开启和关闭,有效节约水资源,提高灌溉效率。本文将介绍如何使用STM32微控制器设计和实现一个智能灌溉系统。

2. 环境准备工作

硬件准备

  1. STM32开发板(例如STM32F103C8T6)
  2. 土壤湿度传感器(例如YL-69)
  3. 温度传感器(例如DHT11)
  4. 继电器模块(用于控制水泵)
  5. 面包板和连接线
  6. USB下载线

软件安装与配置

  1. Keil uVision:用于编写、编译和调试代码。
  2. STM32CubeMX:用于配置STM32微控制器的引脚和外设。
  3. ST-Link Utility:用于将编译好的代码下载到STM32开发板中。
步骤:
  1. 下载并安装Keil uVision。
  2. 下载并安装STM32CubeMX。
  3. 下载并安装ST-Link Utility。

3. 系统设计

系统架构

智能灌溉系统的基本工作原理是通过STM32微控制器连接土壤湿度传感器和温度传感器,实时监测土壤湿度和环境温度,并通过继电器模块控制水泵的开启和关闭,实现自动灌溉。

硬件连接

  1. 将YL-69土壤湿度传感器的VCC引脚连接到STM32的5V引脚,GND引脚连接到GND,数据引脚连接到STM32的ADC引脚(例如PA0)。
  2. 将DHT11温度传感器的VCC引脚连接到STM32的3.3V引脚,GND引脚连接到GND,数据引脚连接到STM32的GPIO引脚(例如PA1)。
  3. 将继电器模块的控制引脚连接到STM32的GPIO引脚(例如PA2),并通过继电器模块控制水泵。

4. 代码实现

初始化代码

#include "stm32f1xx_hal.h"
#include "adc.h"
#include "dht11.h"
#include "usart.h"void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART2_UART_Init(void);int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();MX_USART2_UART_Init();DHT11_Init();while (1) {// 读取土壤湿度传感器值uint32_t soilMoisture = HAL_ADC_GetValue(&hadc1);// 读取温度传感器值DHT11_DataTypedef DHT11_Data;DHT11_ReadData(&DHT11_Data);// 根据传感器数据控制继电器if (soilMoisture < 3000) { // 土壤湿度低于设定值,启动水泵HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);} else { // 土壤湿度高于设定值,关闭水泵HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);}// 通过串口输出传感器数据char buffer[50];sprintf(buffer, "Soil: %lu, Temp: %d.%d C, Hum: %d.%d %%\r\n", soilMoisture,DHT11_Data.Temperature, DHT11_Data.TemperatureDecimal,DHT11_Data.Humidity, DHT11_Data.HumidityDecimal);HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);HAL_Delay(2000);}
}void SystemClock_Config(void) {// 配置系统时钟
}static void MX_GPIO_Init(void) {// 初始化GPIO__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}static void MX_ADC1_Init(void) {// 初始化ADC1ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;if (HAL_ADC_Init(&hadc1) != HAL_OK) {Error_Handler();}sConfig.Channel = ADC_CHANNEL_0;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {Error_Handler();}HAL_ADC_Start(&hadc1);
}static void MX_USART2_UART_Init(void) {// 初始化USART2huart2.Instance = USART2;huart2.Init.BaudRate = 115200;huart2.Init.WordLength = UART_WORDLENGTH_8B;huart2.Init.StopBits = UART_STOPBITS_1;huart2.Init.Parity = UART_PARITY_NONE;huart2.Init.Mode = UART_MODE_TX_RX;huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart2.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart2) != HAL_OK) {Error_Handler();}
}

传感器读取和控制代码

#include "dht11.h"
#include "adc.h"void DHT11_Init(void) {// 初始化DHT11传感器GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_1;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}void DHT11_ReadData(DHT11_DataTypedef *DHT11_Data) {uint8_t i, j;uint8_t data[5] = {0};// 启动信号HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);HAL_Delay(18);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);HAL_Delay(20);// 等待DHT11响应HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);HAL_Delay(40);// 读取数据for (j = 0; j < 5; j++) {for (i = 0; i < 8; i++) {while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET);HAL_Delay(40);if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET) {data[j] |= (1 << (7 - i));}while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET);}}DHT11_Data->Humidity = data[0];DHT11_Data->HumidityDecimal = data[1];DHT11_Data->Temperature = data[2];DHT11_Data->TemperatureDecimal = data[3];
}uint32_t ReadSoilMoisture(void) {// 读取土壤湿度传感器值return HAL_ADC_GetValue(&hadc1);
}void ControlPump(GPIO_PinState state) {// 控制水泵的开启和关闭HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, state);
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

5. 应用场景

农业灌溉

本系统可以应用于农业灌溉,通过自动监测土壤湿度和环境温度,智能控制灌溉设备,提高农业生产效率,节约水资源。

花园自动灌溉

本系统还可以应用于家庭花园的自动灌溉,通过实时监测花园的土壤湿度,自动控制灌溉设备,确保植物健康生长。

6. 常见问题及解决方案

常见问题

  1. 土壤湿度传感器读取不准确
    • 检查土壤湿度传感器的连接是否正确。
    • 确认传感器的校准是否正确。
  2. 温度传感器读取错误
    • 检查DHT11传感器的连接是否正确。
    • 确认传感器的校准是否正确。

解决方案

  1. 校准传感器
    • 使用已知环境校准土壤湿度传感器和DHT11传感器,确保读取值准确。
  2. 检查连接
    • 确认STM32和传感器的连接无误,确保传感器工作正常。

7. 结论

本文介绍了如何使用STM32微控制器和多种传感器实现一个智能灌溉系统,从硬件准备、环境配置到代码实现,详细介绍了每一步的操作步骤。通过本文的学习,读者可以掌握基本的嵌入式开发技能,并将其应用到实际项目中。

 

相关文章:

基于STM32的智能灌溉系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码传感器读取和控制代码应用场景 农业灌溉花园自动灌溉常见问题及解决方案 常见问题解决方案结论 1. 引言 智能灌溉系统通过实时监测土壤湿度和环境温度&#xff0c;自动控制灌溉设…...

Datawhale AI 夏令营 Task3(半成品,仍在学习理解

课程链接 / 知识点整理 &#xff08;一&#xff09;...

细腻呵护静音生活缓冲器,家具中的隐形侍者

在忙碌的生活节奏中&#xff0c;家是我们寻找宁静与放松的避风港。而家具缓冲器&#xff0c;就像一位隐形的侍者&#xff0c;在不经意间为我们营造出温馨、宁静的居住环境。它们静静地工作&#xff0c;细腻地呵护着每一处细节&#xff0c;让家的每一次触碰成为一次尊享体验。 细…...

【MATLAB源码-第243期】基于simulink的CUK斩波电路仿真,输出各节点波形。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 CUK电路是一种高效的直流-直流转换器&#xff0c;它以其独特的能量传递方式和高效的电压转换能力&#xff0c;在许多电力电子应用中得到了广泛的使用。下面将详细描述CUK电路的工作原理、各个组成部分以及其在实际应用中的优…...

springboot项目不能同时跑junit4和junit5的解决方法

springboot项目的maven test只会跑junit4 RunWith注解的测试类&#xff0c;而不会跑junit5 ExtendWith的测试类 解决方法&#xff1a;pom加上以下plugin&#xff0c;版本号需要3.0.0-M5及以上 <plugin><groupId>org.apache.maven.plugins</groupId><art…...

【IO】使用消息队列完成两个进程之间相互通信

目录 1、使用消息队列完成两个进程之间相互通信 2、共享内存实现两个进程之间的通信 3、思维导图 1、使用消息队列完成两个进程之间相互通信 //msgsnd.c #include <myhead.h>// 要发送的消息类型 struct msgbuf {long mtype;char mtext[1024]; };// 定义一个宏&#…...

Web开发:用C#的逻辑理解VUE语法(VUE + Webapi小白开发笔记)

适用阅读对象&#xff1a;需要兼顾前端的C#后端开发人员&#xff08;基础笔记&#xff09; 目录 一、后端交互-获取实体数据 二、变量 1.声明 2.作用域 三、字符串的处理 四、数组(列表)的处理 1.数组中的SELECT语法&#xff08;提取特定字段到新数组&#xff09; 2.数…...

操作系统文件位置指针

文件位置指针 与标准IO的文件读写位置指针一样&#xff0c;系统IO时也会有一个表示位置的指针在移动&#xff0c;会随着读写操作的执行向后自动移动 当需要随机位置进行读写操作时&#xff0c;那么需要移动位置指针的位置 off_t lseek(int fd, off_t offset, int whence); 功…...

设计模式的概念

设计模式主要分为三类&#xff1a;创建类的设计模式、结构型设计模式、行为型设计模式。 创建类的设计模式&#xff1a;简单工厂&#xff0c;工厂模式&#xff0c;抽象工厂&#xff0c;建造者&#xff0c;单例&#xff0c;原型 结构型设计模式&#xff1a;代理模式、享元模式 行…...

VMware17下载与安装

1.下载 通过百度网盘分享的文件&#xff1a;VMware17 链接&#xff1a;https://pan.baidu.com/s/1gCine3d3Rp_l3NYAu5-ojg 提取码&#xff1a;ek25 --来自百度网盘超级会员V3的分享 2.安装...

mv命令学习

移动和重命名文件 mv mv命令的作用就是将文件系统的文件从一个地方移动到另一个地方。 $ pwd /home/scott/libby $ ls libby_arrowrock.jpg libby_bak.jpg libby.jpg ➥libby_on_couch.jpg on_floor $ ls ~/pictures/dogs libby_on_floor_01.jpg libby_on_floor_03.jpg li…...

西北航天基地采用Infortrend NAS存储做影视后期及共享

用户背景&#xff1a; 创建最早的综合型航空航天基地&#xff0c;占地5万平方米&#xff0c;每年约300天进行航天试验 挑战&#xff1a; 西北航天基地规模大任务多&#xff0c;分别有不同的项目组负责试验&#xff0c;项目组需要获取试验任务影像资料&#xff0c;用于分析总…...

GitHub每日最火火火项目(8.6)

项目名称&#xff1a;bghira / SimpleTuner 项目介绍&#xff1a;SimpleTuner是一个通用的微调工具包&#xff0c;主要面向Stable Diffusion 2.1、Stable Diffusion 3、DeepFloyd和SDXL等模型。它旨在为这些模型提供一种方便的方式进行微调&#xff0c;以适应不同的应用场景和需…...

LangChain与CI/CD的无缝对接:自动化部署的新前沿

LangChain与CI/CD的无缝对接&#xff1a;自动化部署的新前沿 在当今快速发展的软件开发领域&#xff0c;持续集成/持续部署&#xff08;CI/CD&#xff09;已成为提升开发效率和软件质量的关键实践。LangChain&#xff0c;作为一个假设的编程辅助工具&#xff0c;如果存在&…...

Laravel为什么会成为最优雅的PHP框架?

目录 1. 设计哲学 1.1 表达性语法 1.2 约定优于配置 1.3 优雅的异常处理 2. 核心特性 2.1 Eloquent ORM 2.2 路由系统 2.3 Blade模板引擎 2.4 Artisan命令行工具 3. 社区支持 3.1 丰富的文档和教程 3.2 Packalyst&#xff1a;丰富的扩展包 3.3 社区活动和会议 4.…...

LabVIEW中的Reverse String函数与字节序转换

在LabVIEW中&#xff0c;数据的字节序&#xff08;也称为端序&#xff09;问题通常出现在数据传输和存储过程中。字节序可以分为大端&#xff08;Big-Endian&#xff09;和小端&#xff08;Little-Endian&#xff09;&#xff0c;它们分别表示高字节存储在低地址和低字节存储在…...

用OpenCV与MFC写一个简单易用的图像处理程序

工厂里做SOP及测试报告以及员工资格鉴定等常需用到简单的图像处理&#xff0c;PS等软件正版费用不菲&#xff0c;学习起来成本也高。Windows自带的图像处理软件&#xff0c;用起来也不是那么得心应手。因此我用OpenCV与MFC写了一个简单易用的图像处理程序。 程序界面 基于简单…...

go语言的actor框架和air工具有什么区别?

Go语言的Actor框架和Air工具在多个方面存在显著的区别&#xff0c;主要体现在它们的设计目的、功能特性以及应用场景上。 ### Go语言的Actor框架 **设计目的与功能特性**&#xff1a; * **设计目的**&#xff1a;Actor框架是专为高并发和分布式系统设计的编程模型。它通过将系统…...

e6.利用 docker 快速部署自动化运维平台

利用 docker 快速部署自动化运维平台 1. 安装docker2. 拉取镜像3. 启动容器4. 初始化5. 访问测试 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主 机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中…...

回顾前面刷过的算法(4)

今天回顾一下下面三个算法&#xff0c;涉及到了动态规划、合并链表、位运算&#xff0c;好吧&#xff0c;让我们再次手敲一遍 //乘积最大子数组//思路: 维护三个变量&#xff0c;imax最大前缀乘积 imin最小前缀乘积 max最大连续乘积//由于元素有正负&#xff0c;imax和imin需…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...