diciembre 01, 2016

ESP8266 Mini D1 con sensor de presión barométrica GY-BMP280-3.3

Para montar nuestra propia estación meteorológica es fundamental tener un sensor de presión, he estado probando el GY-BMP280, un sensor que vale menos de 2€ comprándolo en cualquier página china.


Se trata de una pequeña placa que trae el sensor de Bosch y los pines para conexion I2C y SPI. Por comodidad, y uso de pines he probado el protocolo I2C montado en una placa MiniD1. Una de las cosas poco claras es el tema del pinout, a que pins debe conectarse en la MiniD1 la señal de reloj (SCL) y la de datos (SDA), urgando un poco en la documentación del código hardware/esp8266com/esp8266/ vemos las declaraciones de pines del chip ESP8266 a la placa MiniD1:

#########################################################################
# variants/d1_mini/pins_arduino.h
#########################################################################
#define PIN_WIRE_SDA (4) // D2
#define PIN_WIRE_SCL (5) // D1
static const uint8_t SDA = PIN_WIRE_SDA;
static const uint8_t SCL = PIN_WIRE_SCL;
static const uint8_t LED_BUILTIN = 2;
static const uint8_t BUILTIN_LED = 2;
static const uint8_t D0   = 16;
static const uint8_t D1   = 5;
static const uint8_t D2   = 4;
static const uint8_t D3   = 0;
static const uint8_t D4   = 2;
static const uint8_t D5   = 14;
static const uint8_t D6   = 12;
static const uint8_t D7   = 13;
static const uint8_t D8   = 15;
static const uint8_t RX   = 3;
static const uint8_t TX   = 1;

Por defecto la librería Wire de Arduino se reemplaza con la TwoWire que define begin con los pines SDA y SCL:

#########################################################################
# ~/Arduino/hardware/esp8266com/esp8266/libraries/Wire/Wire.cpp
#########################################################################
static int default_sda_pin = SDA;
static int default_scl_pin = SCL;
// Constructors ////////////////////////////////////////////////////////////////
TwoWire::TwoWire(){}
// Public Methods //////////////////////////////////////////////////////////////
void TwoWire::begin(int sda, int scl){
  default_sda_pin = sda;
  default_scl_pin = scl;
  twi_init(sda, scl);
  flush();
}

Estos por defecto están mapeados a D1 y D2 (4, 5) según la tabla de traducción anterior, en la documentación se explica más o menos:

#########################################################################
~/Arduino/hardware/esp8266com/esp8266$ vi doc/libraries.md
## I2C (Wire library)
Wire library currently supports master mode up to approximately 450KHz.
Before using I2C, pins for SDA and SCL need to be set by calling
`Wire.begin(int sda, int scl)`, i.e. `Wire.begin(0, 2)` on ESP-01,
else they default to pins 4(SDA) and 5(SCL).
#########################################################################

Para testear los dispositivos i2c hay una libreria muy interesante, que scanea las direcciones en las que se pueden encontrar https://github.com/mcauser/i2cdetect . Con un poco de código el BMP280 aparece en la posición 0x76.


#########################################################################
#include
#include
void setup() {
  Wire.begin(0, 2); -> D3,D4
  //Wire.begin();
  Serial.begin(9600);
  Serial.println("i2cdetect example\n");
  Serial.print("Scanning address range 0x03-0x77\n\n");
}
void loop() {
  i2cdetect();  // default range from 0x03 to 0x77
  delay(2000);
}

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
############################################################################

Trás esto debemos hacer un par de cambios al código de prueba de Adafruit_BMP280:
- Antes de nada definimos los pines en los que tenemos el I2C: Wire.begin(D3,D4);
- Indicamos la dirección del I2C:
 Adafruit_BMP280 bme; // I2C
 bme.begin(0x76)

Ya deberíamos poder ver los resultados del sensor por el puerto serie:

Temperature = 21.09 *C
Pressure = 100162.88 Pa
Approx altitude = 97.21 m

Si queremos un ejemplo completo en: http://lazyzero.de/en/elektronik/esp8266/diy_weather/start podemos ver un sensor de humedad, temperatura y este mismo de presión con su código completo.

comentarios: