智慧灌溉平台

news2024/11/29 18:49:02

1.知识百科

  智慧灌溉是运用物联网、云计算、大数据等新一代信息技术,结合农业生产的实际需求,通过传感器采集土壤温湿度、光照强度等信息,利用无线传感网络传输到中央控制系统进行智能控制。智慧灌溉系统由传感器(水位传感器)、无线通信模块(GPRS/CDMA/WLAN/蓝牙)和计算机组成;在农业生产中,通过自动感知环境信息(温度、湿度),实时监控作物生长状况并做出判断和决策。

智慧灌溉

2.开发环境

  本次智慧灌溉平台包含有硬件和软件两部分。其中硬件部分有 基于STM32的主控制器,USB接口水泵、稻田模型、水位监测传感器,硬件配置如下所所示:

  • 主控制器
    主控制器
  • 稻田模型
      稻田模型中添加了水位监测传感器设备。
    在这里插入图片描述
  • 水泵
    在这里插入图片描述
  • 应用APP
    在这里插入图片描述

3.硬件设计

在这里插入图片描述

4.软件设计

  本次硬件主控MCU选择的是ST公司的基于Cortex-M3架构的STM32F103C8T6,供电部分是12V转5V,采用MP2359实现,5V转3.3V则采用AMS1117-3.3实现。软件设计通过HAL库+KEIL软件。

主控MCU: STM32F103C8T6
通信设备: ESP8266WIFI
传感器设备: 水位检测传感器
水泵: USB接口3W水泵
其他: RGB工作状态指示、串口调试接口、ST_Link下载口

4.1 ESP8266WIFI驱动

  ESP8266系列无线模块是一个经济高效的WIFI SOC模块,支持标准IEEE802.11b/g/n协议,内置完整的TCP/IP协议栈。 用户可以使用此系列模块向现有设备添加网络功能,也可以构建独立的网络控制器。

  • 支持STA、AP、STA+AP动作模式;
  • 体积非常小的802.11b/g/n WiFi SOC模块
  • 内置10bit高精度ADC采用低功率32位CPU,兼作应用程序处理器
  • 支持USART、GPIO、IIC、PWM、ADC、SPI等接口时钟频率最大为160MHz
  • 支持smart config、AirKiss一键网络支持多个休眠模式,深休眠电流低到20uA
  • 嵌入式LWIP协议栈
  • 支持SDK二次开发
  • 通用AT指令可以快速使用支持串行本地升级和远程固件升级( FOTA )

  本次采用通用AT指令开发,串口通信,波特率为115200,配置模式为AP+TCP服务器。

/*****************ESP8266初始化*****************
**形参:u8 *wifi_name      -- 热点名称
**			u8 *wifi_password  -- 密码
**			u16 port           -- 端口号
**
**返回:0--成功,其他值 -- 失败
const char *AP_TCPSERVER[]=
{
	"AT\r\n",//测试指令
	"ATE0\r\n",//关闭回显
	"AT+CWMODE=2\r\n",//--设置为AP(热点)模式
	"AT+RST\r\n",//模块重启
	"ATE0\r\n",//关闭回显
	"AT+CWSAP=\"EPS8266_123\",\"01234567\",1,4\r\n", //--设置wifi信息
	"AT+CIPMUX=1\r\n",//设置多连接
	"AT+CIPSERVER=1,10\r\n", //--设置TCP服务器模式,端口号(0~65535)
	"AT+CIFSR\r\n"//查询IP地址
};
************************************************/
u8 Esp8266_AP_TcpServer_Init(u8 *wifi_name,u8 *wifi_password,u16 port)
{
	char buff[100];
	char *p=NULL;
	u8 i=0;
	printf("1.发送测试指令\r\n");
	if(Esp8266_SendCmdCheckStat("AT\r\n","OK\r\n"))return 1;
	printf("2.关回显\r\n");
	if(Esp8266_SendCmdCheckStat("ATE0\r\n","OK\r\n"))return 2;
	printf("3.设置模式\r\n");
	if(Esp8266_SendCmdCheckStat("AT+CWMODE=2\r\n","OK\r\n"))return 3;	
	printf("4.模块复位\r\n");
	if(Esp8266_SendCmdCheckStat("AT+RST\r\n","OK\r\n"))return 4;	
	Delay_Ms(1000);
	Delay_Ms(1000);
	printf("5.关回显\r\n");
	if(Esp8266_SendCmdCheckStat("ATE0\r\n","OK\r\n"))return 5;	
	//字符串拼接
	snprintf(buff,sizeof(buff),"AT+CWSAP=\"%s\",\"%s\",1,4\r\n",wifi_name,wifi_password);
	printf("buff:%s",buff);
	printf("6.设置热点信息\r\n");
	if(Esp8266_SendCmdCheckStat(buff,"OK\r\n"))return 6;	
	printf("7.设置多连接\r\n");
	if(Esp8266_SendCmdCheckStat("AT+CIPMUX=1\r\n","OK\r\n"))return 7;	
	printf("8.设置端口号\r\n");
	snprintf(buff,sizeof(buff),"AT+CIPSERVER=1,%d\r\n",port);
	if(Esp8266_SendCmdCheckStat(buff,"OK\r\n"))return 8;	
	printf("9.查询IP地址\r\n");
	if(Esp8266_SendCmdCheckStat("AT+CIFSR\r\n","OK\r\n"))return 9;
	/*****提取IP地址信息*/
	/*usart3:+CIFSR:APIP,"192.168.4.1"
		+CIFSR:APMAC,"86:f3:eb:a6:be:f9"
		OK
	*/
	p=strstr((char *)usart3_rx_buff,"APIP");
	if(p!=NULL)
	{
		p+=6;
		while((*p!='"') && (*p!='\0'))
		{
			buff[i]=*p;
			p++;
			i++;
		}
	}
	buff[i]='\0';
	printf("buff:%s\r\n",buff);
	strcpy((char *)esp8266_info.esp8266_ip,buff);//IP地址
	strcpy((char *)esp8266_info.esp8266_name,(char *)wifi_name);//wifi名称
	strcpy((char *)esp8266_info.esp8266_key,(char *)wifi_password);//wifi密码
	esp8266_info.esp8266_prot=port;
	return 0;
}

4.2 水位监测传感器

在这里插入图片描述
  本模块工作电压为5V,采用ADC方式采集液位值,原理为印刷电路板侵入水中,阻值会改变,通过测量阻值的变化来测量水位。

在这里插入图片描述
在这里插入图片描述

  • 获取水位值示例
u16 Get_Regular_Channelx(u16 ch)
{
	ADC_ChannelConfTypeDef sConfig = {0};
	sConfig.Channel=ch;//通道号

	sConfig.SamplingTime=ADC_SAMPLETIME_239CYCLES_5;//采样周期
	if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)//ADC通道初始化
   {
     Error_Handler();
   }	
	HAL_ADC_Start(&hadc1);//开启ADC
	HAL_ADC_PollForConversion(&hadc1,20);//等待规则通道转换完成
	return HAL_ADC_GetValue(&hadc1);
}
//采集AD值,多次测量求平均值
int Get_WeatherVal()
{
	u16 buffer[10];
	u32 count=0;
	int i=0,j=0;
	u16 temp;
	for(i=0;i<10;i++)
	{
		buffer[i]=Get_Regular_Channelx(ADC_CHANNEL_8);//100ms采集一次水位值
		Delay_Ms(2);
	}
	for(i=0;i<10-1;i++)
	{
		for(j=0;j<10-1-i;j++)
		{
			if(buffer[j]>buffer[j+1])
			{
					temp=buffer[j];
					buffer[j]=buffer[j+1];
					buffer[j+1]=temp;
			}
		}
	}
	for(j=2;j<8;j++)
	{
		count+=buffer[j];
	}
	return (count/6);
}

4.3 水泵驱动

  本次水泵选择的是3W USB接口抽水电机,通过继电器控制水泵启动和关闭,配合上位机软件和水位传感器实时监测水位值实现电机自动启动和停止工作。低电平启动水泵工作,高电平停止水泵工作。

#define moto_ctl_start() HAL_GPIO_WritePin(moto_clt_GPIO_Port,moto_clt_Pin,GPIO_PIN_RESET)
#define moto_ctl_stop()  HAL_GPIO_WritePin(moto_clt_GPIO_Port,moto_clt_Pin,GPIO_PIN_SET)

4.4 核心控制功能

  设备上电初始化WIFI,等待app连接。水位传感器实时检测当前水位状态,通过APP启动水泵抽水,当前水位值超过设定是阈值,则水泵自动停止工作。
  板载RGB状态指示灯。硬件电源检测正常位红色,WIFI工作工作则红灯闪烁,APP连接成功则白灯闪烁,电机工作则绿灯闪烁。通过RGB灯光状态即可得知当前设备工作状态。

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(usart1_flag)
		{
			usart1_rx_buff[usart1_cnt]='\0';
			printf("rx1=%s,%d\r\n",usart1_rx_buff,usart1_cnt);
			usart1_cnt=0;
			usart1_flag=0;
		}
		if(usart3_flag)
		{
			usart3_rx_buff[usart3_cnt]='\0';
			printf("rx3=%s,%d\r\n",usart3_rx_buff,usart3_cnt);
			if(strstr((char *)usart3_rx_buff,"0,CONNECT"))
			{
				wifi_stat=1;//连接成功
				time=0;
				stat=0;
				RGB_Ctl(0,0,0);
				snprintf(buff,sizeof(buff),"#%d,%d,%d",0,0,threshold_val%101);
				Esp8266_SendData(0,(u8*)buff);//发松数据到客户端
			}
			else if(strstr((char *)usart3_rx_buff,"0,CLOSED"))
			{
				wifi_stat=0;//断开连接
				time=0;
				stat=0;
				RGB_Ctl(0,0,0);
				moto_ctl_stop();
			}
			else if(strstr((char *)usart3_rx_buff,"motor:1"))
			{
				wifi_stat=2;//启动工作
				time=0;
				stat=0;
				RGB_Ctl(0,0,0);
				moto_ctl_start();
				motor_stat=1;
			}
			else if(strstr((char *)usart3_rx_buff,"motor:0"))
			{
				wifi_stat=1;//停止工作
				time=0;
				stat=0;
				RGB_Ctl(0,0,0);
				moto_ctl_stop();
				motor_stat=0;
			}
			else if(strstr((char *)usart3_rx_buff,"max:"))//水位阈值
			{
				//+IPD,0,6:max:97,17
				p=strstr((char *)usart3_rx_buff,"max:");
				p+=strlen("max:");
				threshold_val=atoi(p);
				//printf("threshold_val=%d\r\n",threshold_val);
			}
			usart3_cnt=0;
			usart3_flag=0;
		}
		time++;
		time2++;
		time3++;
		Delay_Ms(1);
		if(wifi_stat==0 && time>=500)//应用app未连接(红灯闪烁)
		{
			time=0;
			stat=!stat;
			if(stat)
				RGB_Ctl(200,0,0);
			else
				RGB_Ctl(0,0,0);
		}
		if(wifi_stat==1 && time>=500)//应用app连接成功(白灯闪烁)
		{
			time=0;
			stat=!stat;
			if(stat)
				RGB_Ctl(255,253,85);
			else
				RGB_Ctl(0,0,0);
		}
		else if(wifi_stat==2 && time>=500)//电机工作(绿灯闪烁)
		{
			time=0;
			stat=!stat;
			if(stat)
				RGB_Ctl(0,255,0);
			else
				RGB_Ctl(0,0,0);
		}
		if(time3>=100)
		{
			time3=0;
			data=Get_WeatherVal();
			temp=data/3900.00*100;
			//printf("data=%.2f.%d\r\n",temp,data);
			if((temp)>=threshold_val)//当前水位值超过设定阈值,则停止电机工作
			{
				if(motor_stat==1)
				{
					time=0;
					stat=0;
					RGB_Ctl(0,0,0);
					moto_ctl_stop();
					motor_stat=0;//关闭电机
					wifi_stat=1;
					snprintf(buff,sizeof(buff),"#%d,%d,%d",motor_stat,threshold_val,threshold_val);
					Esp8266_SendData(0,(u8*)buff);//发松数据到客户端
					time2=0;
				}
			}
		}
		if(time2>=1000 && motor_stat==1 && wifi_stat>=1)//1s上报一次当前水位状态,且需要再电机工作时进行上报
		{
			time2=0;
			snprintf(buff,sizeof(buff),"#%d,%d,%d",motor_stat,((int)temp)%101,threshold_val%101);
			//printf("buff=%s\r\n",buff);
			Esp8266_SendData(0,(u8*)buff);//发松数据到客户端
		}
  }
  /* USER CODE END 3 */
}

5.工程示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1159766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决关于“由于找不到vcruntime140.dll无法继续执行代码”的问题

今天&#xff0c;我就来谈谈关于“由于找不到vcruntime140.dll无法继续执行代码”的问题&#xff0c;为大家提供4个解决方案。希望我的经验和见解能对大家有所帮助。 首先&#xff0c;我们要明确什么是vcruntime140.dll。简单来说&#xff0c;它是一个动态链接库文件&#xff…

进口跨境商城源码:高效、安全、可扩展的电商平台解决方案

电子商务的兴起为跨境贸易提供了前所未有的机会和挑战。在这个全球化的时代&#xff0c;跨境电商平台成为许多企业进军国际市场的首选。然而&#xff0c;搭建一个高效、安全、可扩展的进口跨境商城并非易事。 1. 解决方案概述 我们推出的 "进口跨境商城源码" 提供了一…

3-性能分析-android-基于Choreographer渲染机制详解

3-性能分析-android-基于Choreographer渲染机制详解 一:主线程运行机制的本质1> 引入 Vsync 之前2> 引入 Choreographer二: Choreographer 简介1> 从 Systrace 的角度来看 Choreogrepher 的工作流程2> Choreographer 的工作流程三:Choreographer 处理一帧的逻辑…

【AI视野·今日Sound 声学论文速览 第三十二期】Tue, 24 Oct 2023

AI视野今日CS.Sound 声学论文速览 Tue, 24 Oct 2023 Totally 20 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;nvas3d, 基于任意录音和室内3D信息合成重建不同听角&#xff08;位置&#xff09;处的新的声音。(from apple cmu) website: htt…

CMake基础【学习笔记(八)】

声明此博客为转载 CMake基础 文章目录 CMake基础一、准备知识1.1 C的编译过程1.2 静态链接库和动态链接库1.3 为什么需要CMake1.3.1 g 命令行编译1.3.2 CMake简介 二、CMake基础知识2.1 安装2.2 第一个CMake例子2.3 语法基础2.3.1 指定版本2.3.2 设置项目2.3.3 添加可执行文件…

Python画图之皮卡丘

Python-turtle画出皮卡丘&#xff08;有趣小游戏&#xff09; 一、效果图二、Python代码 一、效果图 二、Python代码 import turtledef getPosition(x, y):turtle.setx(x)turtle.sety(y)print(x, y)class Pikachu:def __init__(self):self.t turtle.Turtle()t self.tt.pensi…

小样本分割的新视角,Learning What Not to Segment【CVPR 2022】

论文地址&#xff1a;Excellent-Paper-For-Daily-Reading/image-segmentation at main 类别&#xff1a;图像分割 时间&#xff1a;2023/11/01 摘要 目前背景&#xff1a;少样本分割 &#xff08;FSS&#xff09; 得到了广泛的发展。以前的大多数工作都在努力通过分类任务衍…

Linux C语言进阶-D5~D6指针及指针的运算

指针好处&#xff1a; 使程序更加间接、紧凑、高效 有效地表示复杂的数据结构 动态分配内存 得到多于一个的函数返回值 在C语言中&#xff0c;内存单元的地址称为指针&#xff0c;专门用来存放地址的变量&#xff0c;称为指针变量 在不影响理解的情况下&#xff0c;对地址、指…

gRPC之grpcui界面工具

1、grpcui界面工具 简单的说&#xff0c;就是gRPC中的postman&#xff0c;grpcui官方地址&#xff1a;https://github.com/fullstorydev/grpcui。 1.1 安装 go get -u github.com/fullstorydev/grpcui go install github.com/fullstorydev/grpcui/cmd/grpcuiv1.2.0[rootzsx …

VueX介绍和工作原理

一、VueX的作用 VueX就是在Vue中专门集中地管理数据的一个Vue插件。 在VueX中的数据不属于任何一个组件&#xff0c;所有的组价都可以访问和修改这个数据。 因此&#xff0c;当我们的多个组件依赖同一个状态&#xff08;如用户信息&#xff09;时&#xff0c;就可以使用VueX…

【Tomcat Servlet】如何在idea上部署一个maven项目?

目录 1.创建项目 2.引入依赖 3.创建目录 4.编写代码 5.打包程序 6.部署项目 7.验证程序 什么是Tomcat和Servlet? 以idea2019为例&#xff1a; 1.创建项目 1.1 首先创建maven项目 1.2 项目名称 2.引入依赖 2.1 网址输入mvnrepository.com进入maven中央仓库->地址…

Docker 学习路线 9:运行容器

要启动一个新的容器&#xff0c;我们使用 docker run 命令&#xff0c;后跟镜像名称。基本语法如下&#xff1a; docker run [选项] 镜像 [COMMAND] [ARG...] 例如&#xff0c;要运行官方的 Nginx 镜像&#xff0c;我们可以使用&#xff1a; docker run -d -p 8080:80 nginx…

Qt5 安装 phonon

Qt5 安装 phonon Qt5 安装 phonon问题描述安装组件 Qt5 安装 phonon 开发环境&#xff1a;Qt Creator 4.6.2 Based on Qt 5.9.6 问题描述 在运行 Qt5 项目时&#xff0c;显示错误&#xff1a; error: Unknown module(s) in QT: phonon这是缺少组件的原因&#xff0c;QT: pho…

MTK联发科天玑9000旗舰5G移动平台处理器_MT6983芯片定制开发

MT6983天玑9000采用台积电4纳米工艺制程&#xff0c;CPU采用“134”三丛集Armv9架构&#xff0c;APU性能提升&#xff0c;ISP处理速度提升&#xff0c;最高支持3.2亿像素摄像头&#xff0c;采用Mali-G710十核GPU&#xff0c;搭载R16 5G调制解调器。 MT6983天玑9000芯片基本概…

吴恩达《机器学习》4-1->4-5:多变量线性回归

一、引入多维特征 在多维特征中&#xff0c;我们考虑的不再是单一的特征&#xff0c;而是一组特征&#xff0c;例如房价模型中可能包括房间数、楼层等多个特征。这些特征将组成一个向量&#xff0c;表示为(&#x1d465;₁, &#x1d465;₂, . . . , &#x1d465;ₙ)&#x…

英语教育目标转变:更加注重实际应用能力培养

今年九月份,北京市教委发布了《关于深入推进高中阶段学校考试招生改革的实施意见》。按照该意见,北京市2024年初三年级学生的初中学业水平考试英语科目听力口语考试与笔试将分离,首次计算机考试将于2023年12月17日进行。 根据《意见》规定,听力口语计算机考试共有两次考试机会…

c++ 实现二叉搜索树

二叉搜索树的概念 二叉搜索树 (BST&#xff0c;Binary Search Tree)&#xff0c;也称二叉排序树或二叉查找树。它要么是一颗空树&#xff0c;要么是满足以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值。若它的右子树不为…

css图片保持比例and图片占满整个div

一、非背景图 ①保持宽度固定 img { width: 200px; height: auto; } ②保持高度固定 img { height: 300px; width: auto; } ③保持比例 /* 比例不变 */ img { max-width: 100%; height: auto; } /* 垂直居中 */ img { max-width: 100%; height: auto; display: block; margin:…

都2023年了,不会还有人不会设计软件测试用例叭?不会吧不会吧

一、概念 测试用例的基本概念&#xff1a; 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素 。 主要步骤&#xff1a; 测试环境——测试步骤—…

有关YOLOV5在测试时,图片大小被调整的问题

执行detect.py文件&#xff0c;在运行栏中出现以下&#xff1a; detect: weightsyolov5s.pt, sourcedata\images, datadata\coco128.yaml, imgsz[640, 640], conf_thres0.25, iou_thres0.45, max_det1000, device, view_imgFalse, save_txtFalse, save_confFalse, save_cropFa…