ESP32 LoRa for dummys : El bus I2C

Una forma que tiene  ESP32 en comunicarse con periféricos como la pantalla, un modulo LoRa, etc es el bus I2C ( Inter Integrated Circuit ). 

Un bus es un sistema comunciación colectivo, es decir que varios dispositivos se conectan a el para comunicarse con el procesador.

El ESP32 tiene dos I2C que pueden comportarse como maestro o esclavo.



Cuando se trabaja con una placa de desarrollo tenemos dos problemas.

  • Qué pines son los asignados al bus I2C 
    • SCL/SCK: reloj 
    • SDA/SDI: datos
  • Qué dirección es en la que escucha el dispositivo a conectar.


Desconocemos los pines

Los pines SDA y SCL los podemos averiguar en el mapa de pinouts. 

El programa wire.h averigua  de forma automática los pines averiguando la placa de desarrollo que se está utilizando, pero puede que no esté codificado nuestra placa

Por defecto
  • SDA/SDI: GPIO 21
  • SCL/SCK: GPIO 22 

Desconocemos la dirección del periferico

Si conocemos los puertos o pines I2C de la placa de desarrollo ESP32 pero desconocemos la dirección del periferico conectado (p.e. por que no funciona) se puede usar un programa I2C Scanner para averiguarlo  8p.e.  https://randomnerdtutorials.com/guide-for-oled-display-with-arduino/ ) 

Si nos da error es que no está conectado

15:40:58.279 -> I2C Scanner
15:40:58.279 -> Scanning...
15:40:58.279 -> No I2C devices found

No está correctamente cableado

Si no funciona de ninguna de las maneras es que podria ser que el periferico no tiene las resistencias necesarias entre SDA y SCL y 3,3V:
  • 4,7 k ohmios para dispositivos de 5 V 
  • 2,4 k ohmios para dispositivos de 3,3 V.
No están correectamente definido los pines en wire.h

Con el comando "Wire.begin(I2C_SDA, I2C_SCL);" podemos asignar los GPIO donde tenemos los pines

Un ejemplo

#define I2C_SDA 33
#define I2C_SCL 32
#define SEALEVELPRESSURE_HPA (1013.25)

TwoWire I2CBME = TwoWire(0);
Adafruit_BME280 bme;
void setup() {
  I2CBME.begin(I2C_SDA, I2C_SCL, 100000);
  bool status;
  status = bme.begin(0x76, &I2CBME);  
  if (!status) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }

Referencias

Comentarios

Entradas populares de este blog

ESP32 LoRa for dummys - Inicio

SDR - Software Defined Radio - IIIb: Receptores RSP o MSI (MSI3001: MSI2500 + MSI001)

Antena exterior logarítmica UHF/VHF : Metronic 425010 - Ia Características