作业:
使用I2C获取SHT20传感器温湿度
使用I2C获取AP3216C三合一传感器: 光照, 接近, 红外 三个功能 合并的传感器
cpp#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
cpp#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; }
cpp#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
cpp#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); //换算成数据输出即可 }
cpp/* 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 */
STM32U575RIT6单片机(四)
水水阿水水2025-03-18 12:04
相关推荐
@good_good_study11 分钟前
FreeRTOS内存管理Hello_Embed1 小时前
libmodbus 移植 STM32(基础篇)qq_397562312 小时前
QT工程 , 生成别的电脑运行的exe程序qqssss121dfd3 小时前
STM32H750XBH6的ETH模块移植LWIP想放学的刺客5 小时前
单片机嵌入式试题(第27期)设计可移植、可配置的外设驱动框架的关键要点天昊吖5 小时前
stc8H启用DMA发送后 卡住【踩坑日志】李永奉5 小时前
杰理芯片SDK开发-ENC双麦降噪配置/调试教程BackCatK Chen5 小时前
第 1 篇:软件视角扫盲|TMC2240 软件核心特性 + 学习路径(附工具清单)兆龙电子单片机设计5 小时前
【STM32项目开源】STM32单片机多功能电子秤切糕师学AI6 小时前
ARM 架构中的复位(Reset)与复位流程

