• 实践案例丨利用小熊派开发板获取土壤湿度传感器的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 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

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

  • 相关阅读:
    node相关--socket.io
    node相关--WebSocket
    node工具--express
    node工具--connect
    HTTP基础01--web与互联网基础
    nodeAPI--HTTP
    nodeAPI--TCP
    js:语言精髓笔记13--语言技巧
    js:语言精髓笔记12--动态语言特性(2)
    js:语言精髓笔记11--动态语言特性(1)
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/13744722.html
Copyright © 2020-2023  润新知