基于STM32的智能灌溉系统
目录
- 引言
- 环境准备工作
- 硬件准备
- 软件安装与配置
- 系统设计
- 系统架构
- 硬件连接
- 代码实现
- 初始化代码
- 传感器读取和控制代码
- 应用场景
- 农业灌溉
- 花园自动灌溉
- 常见问题及解决方案
- 常见问题
- 解决方案
- 结论
1. 引言
智能灌溉系统通过实时监测土壤湿度和环境温度,自动控制灌溉设备的开启和关闭,有效节约水资源,提高灌溉效率。本文将介绍如何使用STM32微控制器设计和实现一个智能灌溉系统。
2. 环境准备工作
硬件准备
- STM32开发板(例如STM32F103C8T6)
- 土壤湿度传感器(例如YL-69)
- 温度传感器(例如DHT11)
- 继电器模块(用于控制水泵)
- 面包板和连接线
- USB下载线
软件安装与配置
- Keil uVision:用于编写、编译和调试代码。
- STM32CubeMX:用于配置STM32微控制器的引脚和外设。
- ST-Link Utility:用于将编译好的代码下载到STM32开发板中。
步骤:
- 下载并安装Keil uVision。
- 下载并安装STM32CubeMX。
- 下载并安装ST-Link Utility。
3. 系统设计
系统架构
智能灌溉系统的基本工作原理是通过STM32微控制器连接土壤湿度传感器和温度传感器,实时监测土壤湿度和环境温度,并通过继电器模块控制水泵的开启和关闭,实现自动灌溉。
硬件连接
- 将YL-69土壤湿度传感器的VCC引脚连接到STM32的5V引脚,GND引脚连接到GND,数据引脚连接到STM32的ADC引脚(例如PA0)。
- 将DHT11温度传感器的VCC引脚连接到STM32的3.3V引脚,GND引脚连接到GND,数据引脚连接到STM32的GPIO引脚(例如PA1)。
- 将继电器模块的控制引脚连接到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. 常见问题及解决方案
常见问题
- 土壤湿度传感器读取不准确
- 检查土壤湿度传感器的连接是否正确。
- 确认传感器的校准是否正确。
- 温度传感器读取错误
- 检查DHT11传感器的连接是否正确。
- 确认传感器的校准是否正确。
解决方案
- 校准传感器
- 使用已知环境校准土壤湿度传感器和DHT11传感器,确保读取值准确。
- 检查连接
- 确认STM32和传感器的连接无误,确保传感器工作正常。
7. 结论
本文介绍了如何使用STM32微控制器和多种传感器实现一个智能灌溉系统,从硬件准备、环境配置到代码实现,详细介绍了每一步的操作步骤。通过本文的学习,读者可以掌握基本的嵌入式开发技能,并将其应用到实际项目中。
相关文章:

基于STM32的智能灌溉系统
目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码传感器读取和控制代码应用场景 农业灌溉花园自动灌溉常见问题及解决方案 常见问题解决方案结论 1. 引言 智能灌溉系统通过实时监测土壤湿度和环境温度,自动控制灌溉设…...
Datawhale AI 夏令营 Task3(半成品,仍在学习理解
课程链接 / 知识点整理 (一)...

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

【MATLAB源码-第243期】基于simulink的CUK斩波电路仿真,输出各节点波形。
操作环境: MATLAB 2022a 1、算法描述 CUK电路是一种高效的直流-直流转换器,它以其独特的能量传递方式和高效的电压转换能力,在许多电力电子应用中得到了广泛的使用。下面将详细描述CUK电路的工作原理、各个组成部分以及其在实际应用中的优…...
springboot项目不能同时跑junit4和junit5的解决方法
springboot项目的maven test只会跑junit4 RunWith注解的测试类,而不会跑junit5 ExtendWith的测试类 解决方法:pom加上以下plugin,版本号需要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小白开发笔记)
适用阅读对象:需要兼顾前端的C#后端开发人员(基础笔记) 目录 一、后端交互-获取实体数据 二、变量 1.声明 2.作用域 三、字符串的处理 四、数组(列表)的处理 1.数组中的SELECT语法(提取特定字段到新数组) 2.数…...
操作系统文件位置指针
文件位置指针 与标准IO的文件读写位置指针一样,系统IO时也会有一个表示位置的指针在移动,会随着读写操作的执行向后自动移动 当需要随机位置进行读写操作时,那么需要移动位置指针的位置 off_t lseek(int fd, off_t offset, int whence); 功…...

设计模式的概念
设计模式主要分为三类:创建类的设计模式、结构型设计模式、行为型设计模式。 创建类的设计模式:简单工厂,工厂模式,抽象工厂,建造者,单例,原型 结构型设计模式:代理模式、享元模式 行…...

VMware17下载与安装
1.下载 通过百度网盘分享的文件:VMware17 链接:https://pan.baidu.com/s/1gCine3d3Rp_l3NYAu5-ojg 提取码: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存储做影视后期及共享
用户背景: 创建最早的综合型航空航天基地,占地5万平方米,每年约300天进行航天试验 挑战: 西北航天基地规模大任务多,分别有不同的项目组负责试验,项目组需要获取试验任务影像资料,用于分析总…...
GitHub每日最火火火项目(8.6)
项目名称:bghira / SimpleTuner 项目介绍:SimpleTuner是一个通用的微调工具包,主要面向Stable Diffusion 2.1、Stable Diffusion 3、DeepFloyd和SDXL等模型。它旨在为这些模型提供一种方便的方式进行微调,以适应不同的应用场景和需…...
LangChain与CI/CD的无缝对接:自动化部署的新前沿
LangChain与CI/CD的无缝对接:自动化部署的新前沿 在当今快速发展的软件开发领域,持续集成/持续部署(CI/CD)已成为提升开发效率和软件质量的关键实践。LangChain,作为一个假设的编程辅助工具,如果存在&…...
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:丰富的扩展包 3.3 社区活动和会议 4.…...

LabVIEW中的Reverse String函数与字节序转换
在LabVIEW中,数据的字节序(也称为端序)问题通常出现在数据传输和存储过程中。字节序可以分为大端(Big-Endian)和小端(Little-Endian),它们分别表示高字节存储在低地址和低字节存储在…...

用OpenCV与MFC写一个简单易用的图像处理程序
工厂里做SOP及测试报告以及员工资格鉴定等常需用到简单的图像处理,PS等软件正版费用不菲,学习起来成本也高。Windows自带的图像处理软件,用起来也不是那么得心应手。因此我用OpenCV与MFC写了一个简单易用的图像处理程序。 程序界面 基于简单…...
go语言的actor框架和air工具有什么区别?
Go语言的Actor框架和Air工具在多个方面存在显著的区别,主要体现在它们的设计目的、功能特性以及应用场景上。 ### Go语言的Actor框架 **设计目的与功能特性**: * **设计目的**:Actor框架是专为高并发和分布式系统设计的编程模型。它通过将系统…...

e6.利用 docker 快速部署自动化运维平台
利用 docker 快速部署自动化运维平台 1. 安装docker2. 拉取镜像3. 启动容器4. 初始化5. 访问测试 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主 机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中…...
回顾前面刷过的算法(4)
今天回顾一下下面三个算法,涉及到了动态规划、合并链表、位运算,好吧,让我们再次手敲一遍 //乘积最大子数组//思路: 维护三个变量,imax最大前缀乘积 imin最小前缀乘积 max最大连续乘积//由于元素有正负,imax和imin需…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

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

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...