写点什么

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

发布于: 2020 年 09 月 28 日

摘要:一文带你用小熊派开发板动手做土壤湿度传感器。


一、实验准备


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,我们配置到最大即可



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


1)配置 USART1


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



2)配置 ADC 通道


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


打开 ADC1 通道 3



​---

3)配置 adc


我们保持默认即可:


D.工程设置


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




E.生成代码



三、代码补充


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 world\r\n");
/* 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次获取的平均值值为:%d\r\n",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 °\r\n",Temperature); // //UsartPrintf(&huart1,"%d\r\n",*TEMP130_CAL_ADDR); //UsartPrintf(&huart1,"%d\r\n",*TEMP30_CAL_ADDR); }
复制代码


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


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

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


四、编译+下载


点击编译后,0 error,0 warning



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




五、效果


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



2.打开串口调试助手


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



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


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


附件:BearPiToSoil.zip


点击关注,第一时间了解华为云新鲜技术~


发布于: 2020 年 09 月 28 日阅读数: 37
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

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