GY-39 气压,温湿度,光强度 传感器


一、什么是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. 数据转换

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  mrn ",(float)Bme.Alt);
			    printf("rn Lux: %.2f  luxrn ",(float)Lux/100); 
			
	     printf("rn rn "); 			
		 delay_ms(20000);
			
	}	

在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>