当前位置: 首页 > article >正文

STM32U575RIT6单片机(四)

作业:  

使用I2C获取SHT20传感器温湿度

使用I2C获取AP3216C三合一传感器:  光照, 接近, 红外 三个功能 合并的传感器

#ifndef SHT20_H
#define SHT20_H

#include "stdint.h"
#include "i2c.h"
#include "stdio.h"
//1、确定从机的设备地址(代码不需要)
#define SHT20_ADDR 0x40
//2、确定主机的读写地址
#define SHT20_READ_ADDR 0x81
#define SHT20_WRITE_ADDR 0x80
//3、测量温度和湿度的命令
#define T_CMD 0xf3		//温度测量
#define RH_CMD 0xf5	//湿度测量
float SHT20_Send(uint8_t cmd);
void T_RH();

#endif
#include "sht20.h"
/****************************************************************
函数名:SHT20_Send(uint8_t Devaddr,uint8_t cmd)
功能:SHT20的发送函数
参数1:设备地址
参数2:发送的命令
返回值:成功返回测量的数据,失败返回0
****************************************************************/
float SHT20_Send(uint8_t cmd)
{
	uint8_t buff[2]={0};
	HAL_StatusTypeDef ret;
	ret = HAL_I2C_Master_Transmit(&hi2c1,SHT20_WRITE_ADDR,&cmd,1,100);		//发送写命令
	if(ret==HAL_OK)
	{
		HAL_Delay(85);
		HAL_I2C_Master_Receive(&hi2c1,SHT20_READ_ADDR,buff,2,100);			//接受数据
		uint16_t val = buff[0]<<8|buff[1];
		return val;
	}
	return 0;		//失败返回 0
}
/****************************************************************
函数名:T_RH()
功能:读取温度湿度
参数:无
返回值:无
****************************************************************/
void T_RH()
{
	float S_T = SHT20_Send(T_CMD);		//测量温度
	float S_RH = SHT20_Send(RH_CMD);		//测量湿度
	float rh = -6+125*(S_RH/65536);
	float t = -46.85+175.72*(S_T/65535);
	printf("温度:%.2f℃\t湿度:%.2f%%\n",t,rh);
	//换算成数据输出即可
}
int fputc(int ch,FILE *FP)
{
	while(!(USART1->ISR&1<<7));
	USART1->TDR = ch;
	return ch;
}
#ifndef AP3216C_H
#define AP3216C_H
 
#include "stdint.h"
#include "i2c.h"
#include "stdio.h"
//1、确定从机的设备地址
#define AP3216C_ADDR 0x1e
//2、确定主机的读写地址
#define AP3216C_WRITE_ADDR  (AP3216C_ADDR << 1)      		// 写地址:0x3C
#define AP3216C_READ_ADDR   ((AP3216C_ADDR << 1) | 1)		// 读地址:0x3D
//3、测量温度和湿度的命令
#define SYS_CFG_REG 0x00			// 系统配置寄存器
#define ALS_CMD 0x0c					//环境光测量
#define PS_CMD 0x0e					//接近测量
#define IRLED_CMD 0x0a				//红外测量
//相关函数声明
void AP3216C_Init(void);			//初始化AP3216C
void ALS_PS_IRLED();					//读取环境光、接近、红外
 
#endif
#include "ap3216c.h"
// 初始化传感器为ALS+PS+IR模式
void AP3216C_Init(void) 
{
    uint8_t cfg_cmd[2] = {SYS_CFG_REG, 0x03};  // 模式011: ALS+PS+IR
    HAL_I2C_Master_Transmit(&hi2c1, AP3216C_WRITE_ADDR, cfg_cmd, 2, 100);
    HAL_Delay(100);  // 等待传感器稳定
}
// 读取ALS原始值(16位)
static uint16_t ReadALS(void) 
{
    uint8_t buff[2];
    HAL_I2C_Mem_Read(&hi2c1, AP3216C_READ_ADDR, ALS_CMD, I2C_MEMADD_SIZE_8BIT, buff, 2, 100);
    return (buff[1] << 8) | buff[0];  // 合并高低字节
}
// 读取PS原始值(10位)
static uint16_t ReadPS(void) 
{
    uint8_t buff[2];
    HAL_I2C_Mem_Read(&hi2c1, AP3216C_READ_ADDR, PS_CMD, I2C_MEMADD_SIZE_8BIT, buff, 2, 100);
    return ((buff[1] & 0x3F) << 4) | (buff[0] & 0x0F);  // 提取10位数据
}
// 读取IR原始值(16位)
static uint16_t ReadIRLED(void) 
{
    uint8_t buff[2];
    HAL_I2C_Mem_Read(&hi2c1, AP3216C_READ_ADDR, IRLED_CMD, I2C_MEMADD_SIZE_8BIT, buff, 2, 100);
    return (buff[1] << 8) | buff[0];
}
//读取环境光、温度、湿度
void ALS_PS_IRLED()
{
	float S_ALS = ReadALS();		//测量环境光
	uint16_t S_PS = ReadPS();		//测量接近
	uint16_t S_IRLED = ReadIRLED();		//测量红外
	float ALS_lux = S_ALS * 0.36f;  // 转换为lux(默认范围1)
	printf("环境光:%8.2f lux\t接近:%-4d\t红外:%-4d\n",ALS_lux,S_PS,S_IRLED);
	//换算成数据输出即可
}
  /* USER CODE BEGIN Includes */
  #include "sht20.h"
  #include "ap3216c.h"
  /* USER CODE END Includes */

  /* USER CODE BEGIN 2 */
  AP3216C_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(500);
		T_RH();						//读取温度、湿度
		ALS_PS_IRLED();		//读取环境光、接近、红外
  }
  /* USER CODE END 3 */

原文地址:https://blog.csdn.net/qq_51349750/article/details/146327338
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/589711.html

相关文章:

  • 基于WebRTC与P2P技术,嵌入式视频通话EasyRTC实现智能硬件音视频交互,适配Linux、ARM、RTOS、LiteOS
  • 深度学习处理时间序列(1)
  • 嵌入式学习笔记-C语言知识点:栈的作用,C语言函数参数的入栈顺序,C++ 拷贝构造函数,数组名和指针的区别与联系,指针运算,指针和引用
  • Apache Spark_解决生产环境数据倾斜问题方案及思路
  • Tomcat新手入门指南:从零开始安装与基本配置
  • Python驱动CATIA自动化建模:科赫雪花算法实现与工程应用
  • 《解锁华为黑科技:MindSpore+鸿蒙深度集成奥秘》
  • 咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包
  • Bash语言的手动测试
  • Keepalived 多主模型与 LVS 高可用
  • 基于System V的共享内存函数使用指南
  • Flume详解——介绍、部署与使用
  • 2025深圳国际数字能源展全球招商启动,9月18日盛大开启
  • XGPT x DeepSeek:微步AI安全助手满血升级
  • 蓝桥杯备考-----》差分数组+二分答案 借教室
  • python局部变量和全局变量
  • nodejs 使用 puppeteer 打印PDF 有元素没有打印出来
  • 什么是广播系统语言传输指数 STIPA
  • 【云原生技术】容器技术的发展史
  • 市场监管总局升级12315平台 专项整治四大市场顽疾保障消费安全