🛠 Connecter un capteur externe en I²C et SPI
Objetivos
Conectar y leer un sensor externo (ejemplo: BMP280/BME680) en los buses I²C y SPI del nRF52840. El SoC enruta SPI, UART, I²C e I²S a cualquier pin (PSEL), pero tenga cuidado con las peculiaridades propias de la Feather: los 3 maestros SPI lentos comparten sus instancias con los maestros I²C, y el SPIM3 rápido no funciona con alimentación por batería.
Material
- 1× Adafruit Feather nRF52840 Express
- 1× módulo de sensor I²C (BMP280, BME680…) + 1× módulo SPI a elección
- Librerías Adafruit BMP280 Unified + Adafruit BusIO
Código completo
// nrf52840-spi-i2c-capteur-externe.ino
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // par defaut: I2C sur Wire
void setup {
Serial.begin(115200);
Wire.begin; // TWI sur les broches Feather SDA/SCL
// AVERTISSEMENT: board.SPI/SPI par defaut peut allouer SPIM3 (<=32 MHz),
// qui NE FONCTIONNE PAS sur batterie (bug materiel documente par Adafruit,
// la ligne ne devient correcte que lorsque VUSB est alimente). Sur batterie,
// forcez un SPIM lent: SPIClass spi(SPI1); ou workaround CircuitPython.
if (!bmp.begin_I2C(0x76, &Wire)) {
Serial.println("BMP280 absent sur 0x76 (essayer 0x77)");
while (1) delay(100);
}
Serial.println("BMP280 OK");
}
void loop {
Serial.print(bmp.readTemperature, 2); Serial.print(" C ");
Serial.print(bmp.readPressure / 100.0f, 2); Serial.println(" hPa");
delay(1000);
}
Verificación esperada
La temperatura y la presión se muestran cada segundo. Un Wire.scan de I²C lista la dirección del módulo (0x76 o 0x77). La prueba es reproducible tanto por USB como por batería únicamente si no ha utilizado SPIM3 — pruebe ambas fuentes de alimentación antes de validar un proyecto portátil.
Errores frecuentes
- SPI funcional por USB pero no por batería: es el bug de SPIM3 documentado; asigne y descarte el primer objeto SPI (CircuitPython) o fuerce un SPIM lento en Arduino.
- Conflicto SPI/I²C: los 3 TWIM comparten instancias con los SPIM0-2 — «no todos los dispositivos SPI están siempre disponibles» si acumula buses.
- Faltan las resistencias de pull-up I²C: la mayoría de los módulos Adafruit las incluyen; un módulo sin pull-up no responde.
- Direcciones 0x76/0x77 confundidas: el puente J1 del módulo BMP280 selecciona una u otra.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
neopixel_pulsation.pyPythonled_bouton.pyPythonentrees_num.pyPythonanalogique_lumiere.pyPythonservo_pwm.pyPythonscanner_i2c.pyPython