乐趣区

关于物联网:实践案例丨利用小熊派开发板获取土壤湿度传感器的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,咱们配置到最大即可

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 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)

附件:BearPiToSoil.zip

点击关注,第一工夫理解华为云陈腐技术~

退出移动版