首页 > 分享 > 实践案例丨利用小熊派开发板获取土壤湿度传感器的ADC值

实践案例丨利用小熊派开发板获取土壤湿度传感器的ADC值

一、实验准备

1.实验环境

•一块stm32开发板(推荐使用小熊派),以及数据线

•已经安装STM32CubeMX

•已经安装KeilMDK,并导入stm32开发板对应的芯片包(小熊派使用的是STM32L431RCT6)

•准备一个串口调试助手,我使用的是UartAssist(包含在附件中)

•一个土壤湿度传感器模块

2.目标效果

•通过CubeMX创建工程并配置参数

•获取stm32以硬件IIC获取SHT20传感器值(通过SHT20数据手册转化)

•串口1重定向输出土壤湿度值

二、通过CubeMX生产MDK工程

A.芯片选择

打开CubeMX,进入芯片选择:

选择自己的stm32芯片(即STM32L431RCT6): 

B.时钟源RCC设置

•更改系统时钟源

系统时钟默认使用内部的高速时钟(HSI),选择使用HSE,时钟更精确

•设置外部时钟对应的端口

•配置时钟树

STM32L431RCT6系统时钟最大可以为80MHz,我们配置到最大即

image.png

C.参数配置(对应端口设置)

1)配置USART1

使用USART,模式为异步,波特率为115200,无硬件流控制

image.png

2)配置ADC通道

知识补充:ADC,模拟-数字转换器,可以将连续变化的模拟信号转化为离散的数字信号。其中,小熊派的ADC1的通道三已经被引出,即PC2

打开ADC1通道3

image.png

---

配置adc

我们保持默认即可:

 image.png

D.工程设置

一些基础的设置,包括工程名、存储位置、工程环境、工程中各个文件的组成

image.png

image.png

E.生成代码

image.png

三、代码补充

1. 串口1输出重定向

我们知道printf是打印函数,原理是根据传入的字符串参数格式化打印输出到stdout中。我们需要让printf打印到串口之中,只需要在usart.c文件中模仿printf写一个输出函数即可

•在添加头文件

/* USER CODE BEGIN 0 */ #include <stdarg.h> #include <string.h> #include <stdio.h> /* USER CODE END 0 */

•写输出函数

/* USER CODE BEGIN 1 */ void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...) { unsigned char UsartPrintfBuf[296]; va_list ap; unsigned char *pStr = UsartPrintfBuf; va_start(ap, fmt); vsprintf((char *)UsartPrintfBuf, fmt, ap); //格式化 va_end(ap); while(*pStr != 0) { USART1->TDR = *pStr++; while((USART1->ISR & 0x40) == 0); } } //使用方法:UsartPrintf(&huart1,"hello worldrn"); /* USER CODE END 1 */

注意:自己添加的代码,需要在begin和end之间

2. 读取传感器ADC值

我们获取传感器adc的值,通过在实验室多次测量不同土壤湿度的ADC值,来表示土壤湿润程度

主函数代码

while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_ADC_Start(&hadc1); //开启ADC1 HAL_ADC_PollForConversion(&hadc1,50); //等待ADC转化完成 for(num=0;num<20;num++) { AD_Value += HAL_ADC_GetValue(&hadc1); } AD_Value = AD_Value/20; //ADC转换的数据20次的平均值 UsartPrintf(&huart1,"ADC20次获取的平均值值为:%drn",AD_Value); Temperature = ((int16_t)(AD_Value-*TEMP30_CAL_ADDR)*1.0/(int16_t)(*TEMP130_CAL_ADDR-*TEMP30_CAL_ADDR))+30; UsartPrintf(&huart1,"Temperature is %.2f °rn",Temperature); // //UsartPrintf(&huart1,"%drn",*TEMP130_CAL_ADDR); //UsartPrintf(&huart1,"%drn",*TEMP30_CAL_ADDR); }

代码很简单,但是如果我们需要获取更精确的值,可以加入各种滤波算法。然后根据实验值,判断土壤湿润程度。

我通过实验发现,在空气中获取的值为1300左右,包上湿润的餐巾纸后,值为两位数以下。

因此我们可以粗略判断,土壤越湿度,值越小;相反,土壤越干,值越大。

四、编译+下载

点击编译后,0 error,0 warning

小熊派连接在电脑上,代码下载到开发板

五、效果

1.将小熊派串口1和电脑相连,即拨到 AT-MUC,按下复位键

2.打开串口调试助手

连接端口,设置波特率为115200

可以看到,在空气中获取的值为1200-1300;此时,我们不仅掌握了ADC的使用,还掌握了土壤湿度传感器的使用

附件中包含本文工程文件(cubemx + keilMDK)

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com

相关知识

【平头哥RVB2601创意应用开发】花卉浇水指示器
Arduino与水泵实验+土壤湿度传感器
土壤湿度传感器,出远门再也不怕花没人浇水了
基于瑞萨RA MCU的简易智能养花系统设计
土壤湿度传感器
基于STM32的智能花盆浇水系统设计
土壤湿度传感器的应用
Arduino使用土壤湿度传感器
基于Zigbee的智能温室大棚系统(附详细使用教程+完整代码+原理图+完整课设报告)
STM32智能农田监测系统教程

网址: 实践案例丨利用小熊派开发板获取土壤湿度传感器的ADC值 https://m.huajiangbk.com/newsview514377.html

所属分类:花卉
上一篇: 巴西木的养护方法
下一篇: 白兰花晒干能泡水喝吗?有何功效?