GY39模块
文章目录
- GY39模块
- 前言
- 一、模块介绍
- 二、arduino代码
前言
前几天买东西的时候买了一个GY39,这个模块集成了温湿度,大气压,海拔,光照一体,使用起来很方面。
一、模块介绍
它有两种工作模式
使用串口模式时需要搭配转接板,我选择了IIC模式,看一下通信协议吧,就是关于高八位和低八位的数据。
看一下接线
二、arduino代码
#include <Wire.h>
#define uint16_t unsigned int
#define iic_add 0x5b
typedef struct
{
uint32_t P;
uint16_t Temp;
uint16_t Hum;
uint16_t Alt;
} bme;
bme Bme;
uint32_t Lux;
void i2c_speed(uint16_t scl_speed)
{
TWSR = 0;
TWBR = ((F_CPU/scl_speed)-16)/2;
}
void setup() {
Serial.begin(115200);
Wire.begin();
i2c_speed(40000);
delay(1);
}
void loop() {
get_bme();
Serial.print("Temp: ");
Serial.print( (float)Bme.Temp/100);
Serial.print(" DegC PRESS : ");
Serial.print( ((float)Bme.P)/100);
Serial.print(" Pa HUM : ");
Serial.print( (float)Bme.Hum/100);
Serial.print(" % ALT:");
Serial.print( Bme.Alt/1000);
Serial.println("m");
get_lux();
Serial.print( "Lux: ");
Serial.print( ((float)Lux)/100);
Serial.println(" lux");
delay(200);
}
void get_bme(void)
{
uint16_t data_16[2]={0};
uint8_t data[10]={0};
iic_read(0x04,data,10);
Bme.Temp=(data[0]<<8)|data[1];
data_16[0]=(data[2]<<8)|data[3];
data_16[1]=(data[4]<<8)|data[5];
Bme.P=(((uint32_t)data_16[0])<<16)|data_16[1];
Bme.Hum=(data[6]<<8)|data[7];
Bme.Alt=(data[8]<<8)|data[9];
}
void get_lux(void)
{
uint16_t data_16[2]={0};
uint8_t data[10]={0};
iic_read(0x00,data,4);
data_16[0]=(data[0]<<8)|data[1];
data_16[1]=(data[2]<<8)|data[3];
Lux=(((uint32_t)data_16[0])<<16)|data_16[1];
}
void iic_read(unsigned char reg,unsigned char *data,uint8_t len )
{
Wire.beginTransmission(iic_add);
Wire.write(reg);
Wire.endTransmission(false);
delayMicroseconds(10);
if(len>4)
Wire.requestFrom(iic_add,10);
else
Wire.requestFrom(iic_add,4);
for (uint8_t i = 0; i < len; i++)
{
data[i] = Wire.read();
}
}
这个模块也有它配套的上位机
我是自己做了APP的界面用来显示的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)