gy39传感器stm32f103c8t6代码
时间: 2025-07-08 16:45:59 浏览: 7
### GY-39 传感器与 STM32F103C8T6 的通信实现
GY-39 是一款基于 I²C 接口的环境光强度、红外线和紫外线传感器,常用于光照强度检测、智能家居等场景。在 STM32F103C8T6 平台上,可以通过 HAL 库结合 I²C 总线实现数据读取。
#### 硬件连接配置
GY-39 使用标准的 I²C 协议进行通信,其默认地址为 `0x52`(7 位地址),因此写地址为 `0xA4`,读地址为 `0xA5`。在使用 CubeMX 配置时,需要启用 **I²C1** 或其他可用的 I²C 模块,并设置为 **I²C Master** 模式。确保 SCL 和 SDA 引脚正确映射到 GPIO 上(例如 PB6 和 PB7)[^3]。
#### 初始化代码
通过 CubeMX 生成初始化代码后,在主程序中调用 HAL_I2C_Mem_Read 函数来读取 GY-39 中的寄存器值。以下是完整的示例代码:
```c
#include "main.h"
#include <stdio.h>
I2C_HandleTypeDef hi2c1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
int __io_putchar(int ch) {
HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
return ch;
}
// GY-39 寄存器定义
#define GY39_SLAVE_ADDR 0x52 << 1 // 设备地址左移一位,形成 8 位格式
#define GY39_REG_DATA 0x04 // 数据寄存器地址
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
uint8_t buffer[6]; // 存储读取的原始数据
uint32_t visible_light, infrared, uv;
while (1)
{
// 从 GY-39 读取 6 字节数据
if (HAL_I2C_Mem_Read(&hi2c1, GY39_SLAVE_ADDR, GY39_REG_DATA, 1, buffer, 6, HAL_MAX_DELAY) == HAL_OK)
{
// 解析数据:可见光、红外线、紫外线强度
visible_light = (buffer[0] << 8) | buffer[1];
infrared = (buffer[2] << 8) | buffer[3];
uv = (buffer[4] << 8) | buffer[5];
// 打印数据到串口调试助手
printf("Visible Light: %lu lux\r\n", visible_light);
printf("Infrared: %lu lux\r\n", infrared);
printf("UV: %lu lux\r\n", uv);
}
else
{
printf("Failed to read from GY-39 sensor.\r\n");
}
HAL_Delay(1000); // 每秒读取一次
}
}
```
#### I²C 初始化函数
CubeMX 自动生成的 I²C 初始化函数如下:
```c
static void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // I2C 时钟频率设为 100kHz
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
}
```
#### 注意事项
1. **设备地址验证**:某些 GY-39 模块可能支持地址更改,建议使用逻辑分析仪或 I²C 扫描工具确认实际地址。
2. **电源管理**:确保 GY-39 的 VCC 连接到 3.3V 电源,避免因电压不匹配导致通信失败。
3. **拉电阻配置**:I²C 总线上的 SDA 和 SCL 引脚应连接上拉电阻(通常为 4.7kΩ)以保证信号完整性。
阅读全文
相关推荐


















