實踐案例丨利用小熊派開發板獲取土壤濕度傳感器的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

 

 

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM