En aquest exemple pràctic veurem com comunicar el sensor de temperatura i pressió BMP280 utilitzant el bus SPI amb Arduino.
Aquest sensor és força comú i el pots trobar tant Amazon com a Aliexpress per un preu molt assequible.
Permet mesurar tant la temperatura com la pressió atmosfèrica i gràcies a la llibreria d'Adafruit, Adafruit_BMP280 , podràs treballar amb ell mitjançant el protocol I2C com amb el bus SPI.
En aquest cas faré servir 2 sensors per poder provar el funcionament del bus SPI amb Arduino.
Si vols saber més sobre el sensor et recomano que facis una ullada al full de característiques tècniques del BMP280 .
El següent esquema elèctric us mostra com connectar dos sensors BMP280 utilitzant el bus SPI amb Arduino.
Cada sensor BMP280 té 6 pins.
VCC : pin d'alimentació. Admet una tensió de 1,8V a 3,3V
GND : presa de terra.
SCL (SCK) : pin de senyal de rellotge en protocol I2C i senyal de rellotge bus SPI.
SDA (MOSI) : pin de dades en protocol I2C i pin MOSI bus SPI (sortida mestre).
CSB (SS) : pin SS per seleccionar l'esclau al bus SPI.
SDO (MIS) : pin MIS bus SPI (entrada mestre).
La connexió dels pins és la següent:
Connexió pins de cada sensor amb Arduino
Fixa't que a les connexions els pins SCK, MOSI i MISSO dels dos sensors van als mateixos pins d'Arduino, és a dir, comparteix connexió. No obstant això, per al pin de SS de selecció dʻesclau cada sensor es connecta amb un pin diferent.
El sensor 1 es connecta al pin 9 i el sensor 2 al pin 10.
I un cop connectat passem a veure el codi.
Per poder programar aquest sensor utilitzarem la llibreria de Adafruit Adafruit_BMP280 . Al gestor de llibreries cerca la llibreria i la instal·les.
Quan la intentes instal·lar et pregunta si vols instal·lar altres llibreries que són necessàries perquè la llibreria d'Adafruit funcioni. Feu clic a Install all .
Ara ja està tot llest. El codi que faré servir és el següent.
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS_2 (9)
#define BMP_CS_1 (10)
// Instancia de los dos sensores
Adafruit_BMP280 sensor1(BMP_CS_1);
Adafruit_BMP280 sensor2(BMP_CS_2);
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // Cuando se configura por software
void setup() {
Serial.begin(9600);
Serial.println(F("Iniciando ejemplo BMP280 SPI"));
Serial.println("----------------------------");
if (!sensor1.begin()) {
Serial.println(F("No se ha encontrado el primer sensor (9)"));
while (1);
}
if (!sensor2.begin()) {
Serial.println(F("No se ha encontrado el segundo sensor (10)"));
while (1);
}
}
void loop() {
// Mostrar información sensor 1
Serial.println("Sensor 1");
mostrarInfoSensor(sensor1);
Serial.println("Sensor 2");
mostrarInfoSensor(sensor2);
Serial.println("-------------------------------------------");
Serial.println();
delay(5000);
}
void mostrarInfoSensor(Adafruit_BMP280 sensor){
Serial.print(F("Temperatura = "));
Serial.print(sensor.readTemperature());
Serial.println(" *C");
Serial.print(F("Presion = "));
Serial.print(sensor.readPressure());
Serial.println(" Pa");
Serial.println();
}
El primer és importar totes les llibreries necessàries. Després crea 5 constants per emmagatzemar els pins SCD, MISS, MOSI i els dos pins SS de selecció d'esclau.
Després cal crear dos objectes de la classe Adafruit_BMP280 que s'anomenen sensor1 i sensor2 . Aquest constructor està sobrecarregat i pot admetre 0, 1 o 4 paràmetres.
Quan no admet paràmetres estàs indicant que treballaràs amb I2C, quan indiques un únic paràmetre li estàs dient que utilitzaràs el bus SPI amb Arduino per maquinari. El paràmetre indica el pin on heu connectat el SS (selector d'esclau).
Finalment, quan indiques tots els pins del bus SPI amb Arduino estàs dient a la llibreria que treballaràs a través de SPI per programari.
En el nostre cas fem servir la sobrecàrrega que admet un únic paràmetre i passem el pin SS de cada sensor.
A la funció setup() cridem a la funció begin() per iniciar cada sensor. En cas de no poder iniciar el sensor, mostra un missatge pel monitor sèrie i no continua.
A la funció és on consultarem la temperatura i la pressió atmosfèrica. He creat una funció que s'anomena mostrar InfoSensor (sensor) que admet un paràmetre que és l'objecte de la classe Adafruti_BMP280 .
Dins aquesta funció es consulta la temperatura amb la funció readTemperature() i la pressió amb readPressure() . Després es mostra la informació pel monitor sèrie.
Finalment, es fa una espera de 5 segons entre cada mesura.
Només queda una cosa, comprovar que tot funciona correctament carregant el codi a Arduino i obrint el monitor sèrie.
Apareixerà una cosa semblant a la imatge anterior.
Amb això donem per finalitzat aquest tutorial del bus SPI amb Arduino i el sensor BMP280.
Aquest tutorial has pogut comprovar com utilitzar el protocol de comunicacions SPI amb Arduino i has vist un exemple de comunicació amb el sensor de temperatura i pressió BMP280. Es tracta d'una altra funcionalitat que inclouen els microcontroladors com els que porten integrats els Arduino.
Això no vol dir que sempre hagis de fer servir SPI amb Arduino o I2C. Cada projecte requerirà utilitzar una tecnologia i un protocol concret.
L'important és conèixer cadascun i poder triar conseqüentment.
Si el que necessites és una comunicació bidireccional full-duplex mitjançant un protocol flexible i robust amb un consum d'energia baix i transmissió de dades a gran velocitat, SPI amb Arduino pot ser una bona opció.
Qualsevol dubte o suggeriment als comentaris d'aquí a baix. Gràcies :)
Gràcies a Shutterstock per la cessió de les imatges.