🛠 Connecter un capteur externe en I²C et SPI
Objectifs
Câbler et lire un capteur externe (exemple : BMP280/BME680) sur les bus I²C et SPI du nRF52840. Le SoC route SPI, UART, I²C et I²S sur n'importe quelle broche (PSEL), mais attention aux pièges propres à la Feather : les 3 maîtrès SPI lents partagent leurs instances avec les maîtrès I²C, et le SPIM3 rapide est HS sous alimentation batterie.
Matériel
- 1× Adafruit Feather nRF52840 Express
- 1× module capteur I²C (BMP280, BME680…) + 1× module SPI au choix
- Bibliothèques Adafruit BMP280 Unified + Adafruit BusIO
Code complet
// 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 matériel 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);
}
Vérification attendue
Température et pression défilent chaque seconde. Un Wire.scan I²C liste l'adresse du module (0x76 ou 0x77). Le test est reproductible sur USB et sur batterie uniquement si vous n'avez pas utilisé SPIM3 — testez les deux alimentations avant de valider un projet portable.
Erreurs fréquentes
- SPI fonctionnel sur USB mais pas sur batterie : c'est le bug SPIM3 documenté ; allouez et ignorez le premier objet SPI (CircuitPython) ou forcez un SPIM lent côté Arduino.
- Conflit SPI/I²C : les 3 TWIM partagent des instances avec les SPIM0-2 — « tous les périphériques SPI ne sont pas toujours disponibles » si vous cumulez les bus.
- Pull-up I²C absentes : la plupart des modules Adafruit les intègrent ; un module nu sans pull-up ne répond pas.
- Adresses 0x76/0x77 confondues : le pont J1 du module BMP280 sélectionne l'une ou l'autre.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
neopixel_pulsation.pyPythonled_bouton.pyPythonentrees_num.pyPythonanalogique_lumiere.pyPythonservo_pwm.pyPythonscanner_i2c.pyPython