摘要:一文帶你用小熊派開發板動手做土壤濕度傳感器。
一、實驗准備
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)