小熊派学习——硬件IIC获取SHT20温湿度数据

举报
ttking 发表于 2020/09/28 21:12:09 2020/09/28
【摘要】 使用小熊派,通过STM32的硬件IIC获取SHT20温湿度数据,并在串口中打印。掌握小熊派硬件IIC的使用以及SHT20数据的读取

一、实验准备

1.实验环境

  • 一块stm32开发板(推荐使用小熊派),以及数据线

  • 已经安装STM32CubeMX

  • 已经安装KeilMDK,并导入stm32开发板对应的芯片包(小熊派使用的是STM32L431RCT6)

  • 准备一个串口调试助手,我使用的是UartAssist(包含在附件中)

  • 一个SHT20温湿度传感器模块

image.png

2.目标效果

  • 通过CubeMX创建工程并配置参数

  • 获取stm32以硬件IIC获取SHT20传感器值(通过SHT20数据手册转化)

  • 串口1重定向输出温湿度值

二、通过CubeMX生产MDK工程

A.芯片选择

  • 打开CubeMX,进入芯片选择:

image.png

  • 选择自己的stm32芯片(即STM32L431RCT6):

image.png


B.时钟源RCC设置

  • 更改系统时钟源

系统时钟默认使用内部的高速时钟(HSI),选择使用HSE,时钟更精确

  • 设置外部时钟对应的端口

image.png

  • 配置时钟树

STM32L431RCT6系统时钟最大可以为80MHz,我们配置到最大即可

image.png


C.参数配置(对应端口设置)

1)配置USART1

使用USART,模式为异步,波特率为115200,无硬件流控制


image.png


2)配置硬件IIC

知识补充:IIC,集成电路总线,它是一种串行通信总线。有数据线SDA,时钟线SCL


image.png

---

D.工程设置

一些基础的设置,包括工程名、存储位置、工程环境、工程中各个文件的组成


image.png


image.png


E.生成代码

image.png


三、代码补充

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


image.png

小熊派连接在电脑上,代码下载到开发板

image.png

五、效果

1.将小熊派串口1和电脑相连,即拨到 AT-MUC,按下复位键

image.png

2.打开串口调试助手

连接端口,设置波特率为115200

image.png

可以看到,通过SHT20获取的此时温度为25°左右,湿度为65%左右

附件包含SHT20数据手册



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。