小熊派学习——硬件IIC获取SHT20温湿度数据
一、实验准备
1.实验环境
一块stm32开发板(推荐使用小熊派),以及数据线
已经安装STM32CubeMX
已经安装KeilMDK,并导入stm32开发板对应的芯片包(小熊派使用的是STM32L431RCT6)
准备一个串口调试助手,我使用的是UartAssist(包含在附件中)
一个SHT20温湿度传感器模块
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)配置硬件IIC
知识补充:IIC,集成电路总线,它是一种串行通信总线。有数据线SDA,时钟线SCL
---
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. 读写SHT20寄存器
我们新建SHT20.C、SHT20.H文件,通过Datasheet of SHT20 ,发送对应指令来获取温湿度值(数据手册见附件)。
1)宏定义指令
在SHT20.H中,将各个命令做如下宏定义:(sht20地址是0x80 ,写数据采用0x80,读数据采用0x81)
#define add_w 0x80 //地址写#define add_r 0x81 //地址读/*保持主机,即IIC能不能执行其他操作*/#define measure_temp 0xe3 //读温度 1110 0011#define measure_hum 0xe5 //读湿度 1110 0101#define user_code_w 0xe6 // 写用户寄存器#define user_code_r 0xe7 //读用户寄存器#define RST_code 0xfe //软复位
同时,定义一个结构体存放温湿度数据:
typedef struct{ float tempreture; float humidity;} SHT20_INFO;extern SHT20_INFO sht20Info;
2)读取温湿度数据
读取温湿度数据的方式很简单,通过IIC,先向寄存器写入读取指令,再获取数据。
获取温度,入口参数为measure_hum
float Read_Temp(uint8_t cmd){ uint8_t date = cmd,buff[2]; uint16_t temp=0; float temp1; //发送写指令,发送读取温度的指令 HAL_I2C_Master_Transmit(&hi2c1,add_w,&date,1,100); //发送读指令,传回读取数据的指针 HAL_I2C_Master_Receive(&hi2c1,add_r,buff,2,100); temp = (uint16_t)buff[0]; temp = temp<<8; temp = buff[1]|temp; temp1 = -46.85+175.72*((float)temp/65536); return temp1;}
获取湿度,入口参数measure_hum
float Read_humi(uint8_t cmd){ uint8_t date = cmd,buff[2]; uint16_t humi = 0; float temp1; //发送写指令,发送读取温度的指令 HAL_I2C_Master_Transmit(&hi2c1,add_w,&date,1,100); //发送读指令,传回读取数据的指针 HAL_I2C_Master_Receive(&hi2c1,add_r,buff,2,100); humi = (uint16_t)buff[0]; humi = humi<<8; humi = buff[1]|humi; temp1 = -6+125*((float)humi/65536); return temp1;}
最后,我们将获取的值传入结构体
void GetData(void){sht20Info.tempreture = Read_Temp(measure_temp);sht20Info.humidity = Read_humi(measure_hum);}
注意,温湿度的转化公式,根据数据手册得来,一定要查看数据手册哦~
main函数中while循环如下:
别忘记加入 #include "sht20.h"
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ printf("hello\r\n"); HAL_Delay(1000); GetData(); printf("tem:%.2f, humi:%.2f",sht20Info.tempreture,sht20Info.humidity); }
四、编译+下载
点击编译后,0 error,0 warning
小熊派连接在电脑上,代码下载到开发板
五、效果
1.将小熊派串口1和电脑相连,即拨到 AT-MUC,按下复位键
2.打开串口调试助手
连接端口,设置波特率为115200
可以看到,通过SHT20获取的此时温度为25°左右,湿度为65%左右
附件包含SHT20数据手册
- 点赞
- 收藏
- 关注作者
评论(0)