1390|1

6992

帖子

11

TA的资源

版主

楼主
 

[ ST NUCLEO-U575ZI-Q 测评] SHT20温湿度计 [复制链接]

[ ST NUCLEO-U575ZI-Q 测评] 优化OLED显示 - RF/无线 - 电子工程世界-论坛 (eeworld.com.cn)

在驱动OLED的基础上,增加sht20的温湿度显示:

sht20的驱动:

其中sht20.h和sht20.c 是基于麒麟座官方的例程移植的,原作者是张继瑞。源码下载地址:https://github.com/simonliu009/STM32F10x-I2C-SHT20-LCD1602

sht20.h:

#ifndef __SHT20_H
#define __SHT20_H

#include "main.h"

/*SHT20 设备操作相关宏定义,详见手册*/
#define SHT20_ADDRESS  0X40
#define SHT20_Write_Add 0x80   //STM32 hal库 slave地址为读地址
#define SHT20_Read_Add 0x81
#define SHT20_Measurement_RH_HM  0XE5
#define SHT20_Measurement_T_HM  0XE3
#define SHT20_Measurement_RH_NHM  0XF5  //非主机模式地址
#define SHT20_Measurement_T_NHM  0XF3   //非主机模式地址
#define SHT20_READ_REG  0XE7
#define SHT20_WRITE_REG  0XE6
#define SHT20_SOFT_RESET  0XFE

extern I2C_HandleTypeDef hi2c1;
void SHT20_Init(void);
unsigned char SHT20_SoftReset(void);
unsigned char SHT20_Read_Reg(void);
float SHT20_GetTemperature(void);
float SHT20_GetHumidity(void);

#endif

sht20.c

#include "sht20.h"
#include "main.h"
#include <stdio.h>

unsigned char SHT20_SoftReset(void)
{
	uint8_t buffer =SHT20_SOFT_RESET;
	if(HAL_OK==HAL_I2C_Master_Transmit(&hi2c1, SHT20_Write_Add, &buffer, 1, 1000))
	{
		printf("成功\r\n");
		return 0;
	}
	else
	{		
		printf("失败\r\n");
		return 1;
	}
}

unsigned char SHT20_Read_Reg(void)
{
	uint8_t buffer =SHT20_READ_REG;
	if(HAL_OK==HAL_I2C_Master_Transmit(&hi2c1, SHT20_Write_Add, &buffer, 1, 1000))
	{
		if(HAL_OK==HAL_I2C_Master_Receive(&hi2c1, SHT20_Write_Add, &buffer, 1, 1000))
			{
				return buffer;
			}
			else
				{		
					return 1;
				}
	}
	else
	{		
		return 1;
	}

}
unsigned char SHT20_Config(void)//采集温度为14位,采集湿度为12位
{
	uint8_t val;
	val =	(SHT20_Read_Reg()&0x7E)|0x00;
	if(HAL_OK==HAL_I2C_Mem_Write(&hi2c1, (uint16_t)SHT20_Write_Add, (uint16_t)SHT20_WRITE_REG, (uint16_t)I2C_MEMADD_SIZE_8BIT, &val, 1, 1000))
	{
		return 0;
	}
	else
	{
		return 1;
	}
}


void SHT20_Init()
{
	if(SHT20_SoftReset())
	{
		printf("SHT20 复位失败\r\n");
	}
	else
	{
		printf("SHT20 复位成功\r\n");
	}
	HAL_Delay(100);
	if(SHT20_Config())
	{
		printf("初始化失败\r\n");
	}
	else
	{
		printf("初始化成功\r\n");
	}
}

float SHT20_GetTemperature(void)
{
	uint8_t val[3];
	if(HAL_OK==HAL_I2C_Mem_Read(&hi2c1, (uint16_t)SHT20_Write_Add, (uint16_t)SHT20_Measurement_T_HM, (uint16_t)I2C_MEMADD_SIZE_8BIT, val, 3, 1000))
	{
		return (-46.85 + 175.72 * (((val[0]<<8)|(val[1]&0xFC)) / 65536.0));
	}
	else
	{
		printf("error\r\n");
	}
}

float SHT20_GetHumidity(void)
{
	uint8_t val[3];
	if(HAL_OK==HAL_I2C_Mem_Read(&hi2c1, (uint16_t)SHT20_Write_Add, (uint16_t)SHT20_Measurement_RH_HM, (uint16_t)I2C_MEMADD_SIZE_8BIT, val, 3, 1000))
	{
		return -6+125*(((val[0]<<8)|(val[1]&0xF0))/65536.0);
	}
	else
	{
		printf("error\r\n");
	}
}

在原来的工程基础上增加sht20的文件夹,并把sht20.c加入工程:

 把头文件也加入工程:

 在main.c主函数中引入sht20.h,添加代码如下:

SHT20_Init();
  /* USER CODE BEGIN 2 */
	printf("start\r\n");
	char lv[20];
	float spiffs;
	OLED_Init();
	OLED_Clear();
	OLED_Refresh();
	rxtx_it_usart.init();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		tickstart = HAL_GetTick();
	
		

		HAL_Delay(500);
		sprintf(lv,"Temp:%0.2f",SHT20_GetTemperature()); //获取温度并转换为字符串
		OLED_ShowString(0,0,lv,24,1);                    //写入OLED显示缓存
		sprintf(lv,"Humi:%0.2f",SHT20_GetHumidity());    //获取湿度并转换为字符串
		OLED_ShowString(0,30,lv,24,1);                   //写入OLED显示缓存
		OLED_Refresh();                                  //写出到SSD1306

【硬件接线】

 /**I2C1 GPIO Configuration
    PB8     ------> I2C1_SCL
    PB9     ------> I2C1_SDA
    */

连接好后,下载工程到开发板,效果如下图:

 

此帖出自无线连接论坛

最新回复

测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html   详情 回复 发表于 2023-2-2 14:00
点赞 关注
 

回复
举报

1万

帖子

203

TA的资源

管理员

沙发
 

测评汇总:免费申请|ST NUCLEO-U575ZI-Q https://bbs.eeworld.com.cn/thread-1228653-1-1.html

此帖出自无线连接论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表