GY39部分
标题
GY-39 是一款低成本,气压,温湿度,光强度 传感器模块。工作电压 3-5v,功耗小,安装方便。 其工作原理是,MCU 收集各种传感器数据, 统一处理,直接输出计算后的结果, 此模块,有两种方式读取数据,即 串口 UART(TTL 电平)或者 IIC(2 线)。 串口的波特率有 9600bps 与 115200bps,可配置, 有连续,询问输出两种方式,可掉电保存设置。 可适应不同的工作环境,与单片机及电脑连接。 模块另外可以设置单独传感器芯片工作模式, 作为简单传感器模块,MCU 不参与数据处理工作。
提供 arduino,51,stm32 单片机通讯程序,不提供原理图及内部单片机源码。 此 GY39 模块另外赠送安卓手机软件 app 查看数据,且支持 wifi 局域内网连接, 手机及电脑同时显示数据。
GY39使用手册
GY39含有三种工作模式:
我们用ESP8266连接它属于MCU IIC模式,根据产品手册的引脚介绍。
CT DR分别对应 SCL SDA引脚。其他接线VCC 3.3V;GND GND。
QT部分
请参考上篇文章 https://editor.csdn.net/md/?articleId=136130418
arduino 代码部分
#include <Wire.h>
//#include <i2cmaster.h>
/*
GY-39-----mini
VCC----VCC
SCL----A5
SDA----A4
GND--GND
*/
//
#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)
{
/* initialize TWI clock: 40 kHz clock, TWPS = 0 => prescaler = 1 */
//TWSR = 0; /* no prescaler */
//TWBR = ((F_CPU/scl_speed)-16)/2; /* must be > 10 for stable operation */
}
void setup() {
Serial.begin(9600);
Wire.begin();
i2c_speed(40000);
delay(1);
}
void loop() {
get_bme();
Serial.print("温度: ");
Serial.print( (float)Bme.Temp/100);
Serial.print(" DegC 压力 : ");
Serial.print( ((float)Bme.P)/100);
Serial.print(" Pa 湿度 : ");
Serial.print( (float)Bme.Hum/100);
Serial.print(" % 高度:");
Serial.print( Bme.Alt/1000);
Serial.println("m");
get_lux();
Serial.print( "光强: ");
Serial.print( ((float)Lux)/100);
Serial.println(" lux");
delay(1000);
}
void get_bme(void)
{
uint16_t data_16[2]={0};
uint8_t data[10]={0};
iic_read(0x04,data,10);
//iic_read2(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_read2(0x00,data,4);
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 )//#include <Wire.h>
{
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();
}
}
//void iic_read2(unsigned char add,unsigned char *data,unsigned char len)//#include <i2cmaster.h>
//{
// i2c_start_wait(0xb6);
// i2c_write(add);
// i2c_start_wait(0xb6+1);
// while(len-1)
// {
// *data++=i2c_readAck();
// len--;
// }
// *data=i2c_readNak();
// i2c_stop();
//}