一、什么是GY-39?
GY-39 是一款低成本,气压,温湿度,光强度 传感器模块。工作电压 3-5v,功耗小,安装方便。 其工作原理是,MCU 收集各种传感器数据,统一处理,直接输出计算后的结果,此模块,有两种方式读取数据,即串口 UART(TTL 电平)或者 IIC(2 线)。串口的波特率有 9600bps 与 115200bps,可配置,有连续,询问输出两种方式,可掉电保存设置。可适应不同的工作环境,与单片机及电脑连接。模块另外可以设置单独传感器芯片工作模式,作为简单传感器模块,MCU 不参与数据处理工作。提供 arduino,51,stm32 单片机通讯程序,不提供原理图及内部单片机源码。此 GY39 模块另外赠送安卓手机软件 app 查看数据,且支持 wifi 局域内网连接,手机及电脑同时显示数据。
二、产品参数
1. 特点
- 高性价比
- 内置 MCU 计算传感器数据
- IIC、串口通信格式
- 统一数据输出
- 配相应的上位机软件
2. 技术
3. 应用
- 数字照明管理
- 物联网,智能家居应用
- 气象站监测
- 数字光照度计
- 数字气压计,高度计
- 温湿度计
- 大棚气候监测
三、引脚说明
四、通信协议
1. 串口通信
当 GY-39 模块硬件 PinA(S0)=1 时候使用
2. IIC通信
当 GY-39 模块硬件 PinA(S0)=0 时候使用
五、项目工程
以下IIC通信工程
1. 定义结构体接收数据
typedef struct
{
uint32_t P;
uint16_t Temp;
uint16_t Hum;
uint16_t Alt;
} bme;
bme Bme={0,0,0,0};
2. 引脚初始化
void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能与 I2C有关的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
/* PC3-I2C_SCL、PC5-I2C_SDA*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIOB->BSRR = GPIO_Pin_6;
GPIOB->BSRR = GPIO_Pin_7;
}
3. 向IIC设备写入一个字节数据
u8 Single_WriteI2C_byte(u8 Slave_Address,u8 REG_Address,u8 data)
{
if(I2C_Start()==0) //起始信号
{I2C_Stop(); return RESET;}
I2C_SendByte(Slave_Address); //发送设备地址+写信号
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_SendByte(REG_Address); //内部寄存器地址,
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_SendByte(data); //内部寄存器数据,
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_Stop(); //发送停止信号
return SET;
}
4. 从IIC设备读取一个字节数据
u8 Single_ReadI2C(u8 Slave_Address,u8 REG_Address,u8 *REG_data,u8 length)
{
if(I2C_Start()==0) //起始信号
{I2C_Stop(); return RESET;}
I2C_SendByte(Slave_Address); //发送设备地址+写信号
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_SendByte(REG_Address); //发送存储单元地址
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
if(I2C_Start()==0) //起始信号
{I2C_Stop(); return RESET;}
I2C_SendByte(Slave_Address+1); //发送设备地址+读信号
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
while(length-1)
{
*REG_data++=I2C_RecvByte(); //读出寄存器数据
I2C_SendACK(0); //应答
length--;
}
*REG_data=I2C_RecvByte();
I2C_SendACK(1); //发送停止传输信号
I2C_Stop(); //停止信号
return SET;
}
5. 数据转换文章来源:https://www.toymoban.com/news/detail-541534.html
while(1)
{
if(Single_ReadI2C(0xb6,0x04,raw_data,10))
{
Bme.Temp=(raw_data[0]<<8)|raw_data[1];
data_16[0]=(((uint16_t)raw_data[2])<<8)|raw_data[3];
data_16[1]=(((uint16_t)raw_data[4])<<8)|raw_data[5];
Bme.P=(((uint32_t)data_16[0])<<16)|data_16[1];
Bme.Hum=(raw_data[6]<<8)|raw_data[7];
Bme.Alt=(raw_data[8]<<8)|raw_data[9];
}
if(Single_ReadI2C(0xb6,0x00,raw_data,4))
data_16[0]=(((uint16_t)raw_data[0])<<8)|raw_data[1];
data_16[1]=(((uint16_t)raw_data[2])<<8)|raw_data[3];
Lux=(((uint32_t)data_16[0])<<16)|data_16[1];
printf("Temp: %.2f DegC ",(float)Bme.Temp/100);
printf(" P: %.2f Pa ",(float)Bme.P/100);
printf(" Hum: %.2f ",(float)Bme.Hum/100);
printf(" Alt: %.2f m\r\n ",(float)Bme.Alt);
printf("\r\n Lux: %.2f lux\r\n ",(float)Lux/100);
printf("\r\n \r\n ");
delay_ms(20000);
}
文章来源地址https://www.toymoban.com/news/detail-541534.html
到了这里,关于GY-39 气压,温湿度,光强度 传感器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!