# 环境
- JRE(Java Runtime Environment)
- STM32CubeMX v6.3.0
- HAL 库 L4 v1.7.0
- Keil5-MDK
环境搭建参考:STM32CubeMX 学习记录 -- 安装配置与使用
如果不想去官网下,也可以从我的百度云分享里下载 STM32CubeMX 和 HAL 库
链接:https://pan.baidu.com/s/10MKGKPNQrIxZnuMZvVKqkg
提取码:zjor
# 硬件
- 小熊派开发板
- 土壤七合一传感器(水分、温度、电导率、氮磷钾、PH 值)
- RS485 转 TTL 模块
# 接线图
- 小熊派的
5v
电源接土壤传感器的电源正
- 小熊派的
GND
接土壤传感器的电源地
- 小熊派的
3.3v
电源接转接模块的VCC
- 小熊派的
GND
接转接模块的GND
- 小熊派的
UART2_TX
接转接模块的TXD
- 小熊派的
UART2_RX
接转接模块的RXD
- 转接模块的
A+
接土壤传感器的485-A
- 转接模块的
B-
接土壤传感器的485-B
# 创建工程
打开 STM32CubeMX,选择新建一个工程,如下图
在输入框中输入 stm32l431rc
,选中,然后双击选择中间 LQFP64
的这款,如下图
查看原理图, KEY1
按键对应的引脚为 PB2
,如下图
在 STM32CubeMX 中选择 PB2
引脚输出模式为 GPIO_input
设置 PB2
输出方式和别名,如下图
设置 UART1
为异步输出,该串口是用来和 PC 端进行通信,波特率就用默认的 115200,如下图
设置 UART2
为异步输出,该串口用来和土壤传感器进行通信,我们上面的硬件接线也是使用的是 UART2
串口。土壤传感器的波特率为 9600,所以工程里该串口波特率设置为 9600,如下图
时钟使用内部默认时钟,设置为最高 80MHz
最后配置生成工程设置,如下图
最后选择右上角的 GENERATE CODE
,即可完成工程的创建
# 在 Keil5-MDK 中编写代码
进入 MDK-ARM
目录,打开工程,在 usart.c
中编写如下代码
/* USER CODE BEGIN 1 */ | |
int fputc(int ch, FILE *file) | |
{ | |
uint8_t temp[1] = {ch}; | |
HAL_UART_Transmit(&huart1, temp, 1, 0xff); | |
return HAL_OK; | |
} | |
/* USER CODE END 1 */ |
并在该文件头部添加头文件
/* USER CODE BEGIN 0 */ | |
#include "stdio.h" | |
/* USER CODE END 0 */ |
重写 fputc
可以将 printf
函数的输出重定向到 uart1
串口上,就可以通过串口助手显示出来
在 main.c
中,首先添加头文件
/* USER CODE BEGIN Includes */ | |
#include "stdio.h" | |
/* USER CODE END Includes */ |
然后在 main 函数的 while 循环中编写如下代码
/* USER CODE BEGIN 3 */ | |
// 如果检测到 KEY1 按下 | |
if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET) | |
{ | |
// 按键去抖 | |
HAL_Delay(20); | |
while (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET); | |
HAL_Delay(20); | |
// 发送问询帧 | |
uint8_t askData[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09}; | |
HAL_UART_Transmit(&huart2, askData, 8, 0xff); | |
// 接收应答帧 | |
uint8_t result[13]; | |
HAL_UART_Receive(&huart2, result, 13, 0xff); | |
for (int i = 0; i < 13; i++) | |
{ | |
printf(" %x ", result[i]); | |
} | |
} |
这里的 HAL_UART_Transmit
和 HAL_UART_Receive
都是用的 uart2
串口,向我们的土壤传感器发送和接收数据。
查阅土壤传感器的用户手册,想要获取数据,要先发送一个问询帧,如下
因此,我们根据用户手册里的示例,向 uart2
串口发送一个如代码所示的问询帧,然后接收返回来的应答帧,最后输出到串口助手上就好啦
# 编译、烧录程序
勾选 MicroLIB
库很重要,不然会无法向串口助手输出数据
勾选 reset and run
可以让程序烧录完成后自动运行。
设置完成后点击确定,OK
点击编译,然后烧录,下图所示表示烧录成功
打开串口助手,这里我用的是 QCOM。打开端口,然后按下小熊派的 KEY1
按键,可以看到串口助手打印出了应答帧的信息,如下图
根据土壤传感器的用户手册,可以解析出温度数据为: 0x01 0x03(十六进制) = 259(十进制)
,所以当前温度为 25.9 ℃