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);
}
Comentarios
Publicar un comentario