小熊派学习——硬件IIC获取SHT20温湿度数据
【摘要】 使用小熊派,通过STM32的硬件IIC获取SHT20温湿度数据,并在串口中打印。掌握小熊派硬件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数据手册
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)