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

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

  • 相关阅读:
    BZOJ 1391: [Ceoi2008]order
    BZOJ 4504: K个串
    2019 年百度之星·程序设计大赛
    POJ 2398 Toy Storage (二分 叉积)
    POJ 2318 TOYS (二分 叉积)
    HDU 6697 Closest Pair of Segments (计算几何 暴力)
    HDU 6695 Welcome Party (贪心)
    HDU 6693 Valentine's Day (概率)
    HDU 6590 Code (判断凸包相交)
    POJ 3805 Separate Points (判断凸包相交)
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/13744722.html
Copyright © 2011-2022 走看看