«

»

Ott 30

Stampa Articolo

SPX-14241 BME280

L’SPX-14241 BME280 CCS811 è uno dei sensori creati dalla SparkX qualche mese fa uno spin-off della Sparkfun stessa che ha realizzato alcune interessanti board.

SPX-14241 BME280 CCS811

 

Il progetto della SPX-14241 BME280 CCS811 è nato come sensore di qualità dell’aria in grado di misurare:

  • Pressione barometrica
  • Umidità
  • Temperatura
  • Altitudine
  • TVOCs
  • Equivalent CO2 (or eCO2)

ed in particolare il sensore BMP280, su cui mi concetro in questo articolo ti può dare informazioni relative ai primi tre con le precisioni:

  • Temp Range: -40C to 85C
  • Humidity Range: 0 – 100% RH, =-3% from 20-80%
  • Pressure Range: 30,000Pa to 110,000Pa, relative accuracy of 12Pa, absolute accuracy of 100Pa
  • Altitude Range: 0 to 30,000 ft (9.2 km), relative accuracy of 3.3 ft (1 m) at sea level, 6.6 (2 m) at 30,000 ft.

Siccome sia il BME280 sia il CCS811 comunicano via I2C con il micro controllore ho dedicato un primo articolo alla verifica delle caratteristiche del BME280 ed un prossimo articolo lo dedicheremo all’utilizzo di entrambi i sensori.

Collegamenti della SPX-14241 BME280

Il collegamento, essendo I2c, necessita solo di 4 cavi:

  • +3v3
  • Gnd
  • Sda
  • Scl

ti consiglio di utilizzare cavi di colori differenti per non rischiare di invertire SDA ed SCL causando una non comunicazione tra il sensore ed il controller.

Ecco i collegamenti lato sensore:

SPX-14241 BME280 CCS811Arduino connection spx

mentre lato arduino puoi sfruttare i collegamenti SDA ed SCL presenti in alto a destra dalla versione R3:

SPX-14241 Arduino connection leonardo

Le librerie SPX-14241

le librerie che puoi utilizzare, comprensive di esempi per arduino, le puoi scaricare direttamente dal gitHub del produttore:

e dal quale ho preso il primo esempio per la connessione al BME280.

Lo sketch SPX-14241 BME280

Tra gli esempi che trovi nella libreria BME280 c’è il seguente:

#include <stdint.h>
#include "SparkFunBME280.h"
#include "Wire.h"
#include "SPI.h"

BME280 mySensor;

void setup() {
	mySensor.settings.commInterface = I2C_MODE;
	mySensor.settings.I2CAddress = 0x77;
	
	//***Operation settings*****************************//
	
	//renMode can be: 0, Sleep mode / 1 or 2, Forced mode / 3, Normal mode
	mySensor.settings.runMode = 3; //Normal mode
	
	//tStandby can be: 0, 0.5ms / 1, 62.5ms / 2, 125ms / 3, 250ms
	//                 4, 500ms / 5, 1000ms / 6, 10ms /  7, 20ms
	mySensor.settings.tStandby = 0;
	
	//filter can be off or number of FIR coefficients to use:
	//  0, filter off / 1, coefficients = 2 / 2, coefficients = 4
	//  3, coefficients = 8 / 4, coefficients = 16
	mySensor.settings.filter = 0;
	
	//tempOverSample can be:
	//  0, skipped
	//  1 through 5, oversampling *1, *2, *4, *8, *16 respectively
	mySensor.settings.tempOverSample = 1;

	//pressOverSample can be:
	//  0, skipped
	//  1 through 5, oversampling *1, *2, *4, *8, *16 respectively
    mySensor.settings.pressOverSample = 1;
	
	//humidOverSample can be:
	//  0, skipped
	//  1 through 5, oversampling *1, *2, *4, *8, *16 respectively
	mySensor.settings.humidOverSample = 1;
	
	Serial.begin(57600);
  while (!Serial) { ; }
	Serial.print("Program Started\n");
	Serial.print("Starting BME280... result of .begin(): 0x");
	
	//Calling .begin() causes the settings to be loaded
	delay(10);  //Make sure sensor had enough time to turn on. 
	            //BME280 requires 2ms to start up.
	Serial.println(mySensor.begin(), HEX);

	Serial.print("Displaying ID, reset and ctrl regs\n");
	
	Serial.print("ID(0xD0): 0x");
	Serial.println(mySensor.readRegister(BME280_CHIP_ID_REG), HEX);
	Serial.print("Reset register(0xE0): 0x");
	Serial.println(mySensor.readRegister(BME280_RST_REG), HEX);
	Serial.print("ctrl_meas(0xF4): 0x");
	Serial.println(mySensor.readRegister(BME280_CTRL_MEAS_REG), HEX);
	Serial.print("ctrl_hum(0xF2): 0x");
	Serial.println(mySensor.readRegister(BME280_CTRL_HUMIDITY_REG), HEX);

	Serial.print("\n\n");

	Serial.print("Displaying all regs\n");
	uint8_t memCounter = 0x80;
	uint8_t tempReadData;
	for(int rowi = 8; rowi < 16; rowi++ ) {
		Serial.print("0x");
		Serial.print(rowi, HEX);
		Serial.print("0:");
		for(int coli = 0; coli < 16; coli++ ) {
			tempReadData = mySensor.readRegister(memCounter);
			Serial.print((tempReadData >> 4) & 0x0F, HEX);//Print first hex nibble
			Serial.print(tempReadData & 0x0F, HEX);//Print second hex nibble
			Serial.print(" ");
			memCounter++;
		}
		Serial.print("\n");
	}
	
	
	Serial.print("\n\n");
	
	Serial.print("Displaying concatenated calibration words\n");
	Serial.print("dig_T1, uint16: ");
	Serial.println(mySensor.calibration.dig_T1);
	Serial.print("dig_T2, int16: ");
	Serial.println(mySensor.calibration.dig_T2);
	Serial.print("dig_T3, int16: ");
	Serial.println(mySensor.calibration.dig_T3);
	
	Serial.print("dig_P1, uint16: ");
	Serial.println(mySensor.calibration.dig_P1);
	Serial.print("dig_P2, int16: ");
	Serial.println(mySensor.calibration.dig_P2);
	Serial.print("dig_P3, int16: ");
	Serial.println(mySensor.calibration.dig_P3);
	Serial.print("dig_P4, int16: ");
	Serial.println(mySensor.calibration.dig_P4);
	Serial.print("dig_P5, int16: ");
	Serial.println(mySensor.calibration.dig_P5);
	Serial.print("dig_P6, int16: ");
	Serial.println(mySensor.calibration.dig_P6);
	Serial.print("dig_P7, int16: ");
	Serial.println(mySensor.calibration.dig_P7);
	Serial.print("dig_P8, int16: ");
	Serial.println(mySensor.calibration.dig_P8);
	Serial.print("dig_P9, int16: ");
	Serial.println(mySensor.calibration.dig_P9);
	
	Serial.print("dig_H1, uint8: ");
	Serial.println(mySensor.calibration.dig_H1);
	Serial.print("dig_H2, int16: ");
	Serial.println(mySensor.calibration.dig_H2);
	Serial.print("dig_H3, uint8: ");
	Serial.println(mySensor.calibration.dig_H3);
	Serial.print("dig_H4, int16: ");
	Serial.println(mySensor.calibration.dig_H4);
	Serial.print("dig_H5, int16: ");
	Serial.println(mySensor.calibration.dig_H5);
	Serial.print("dig_H6, uint8: ");
	Serial.println(mySensor.calibration.dig_H6);
		
	Serial.println();
}

void loop() {

	Serial.print("Temperature: ");
	Serial.print(mySensor.readTempC(), 2);
	Serial.println(" degrees C");

	Serial.print("Temperature: ");
	Serial.print(mySensor.readTempF(), 2);
	Serial.println(" degrees F");

	Serial.print("Pressure: ");
	Serial.print(mySensor.readFloatPressure(), 2);
	Serial.println(" Pa");

	Serial.print("Altitude: ");
	Serial.print(mySensor.readFloatAltitudeMeters(), 2);
	Serial.println("m");

	Serial.print("Altitude: ");
	Serial.print(mySensor.readFloatAltitudeFeet(), 2);
	Serial.println("ft");	

	Serial.print("%RH: ");
	Serial.print(mySensor.readFloatHumidity(), 2);
	Serial.println(" %");
	
	Serial.println();
	
	delay(1000);

}

in cui le prime linee includono le librerie necessarie alla comunicazione con il sensore ed al recupero dei dati rilevati;

linea 6: definisci l’istanza mySensor della classe BME280 che userai per collegarti al sensore;

linee 09-10: imposta l’interfaccia di comunicazione con il sensore in I2C, in quanto il BME280 può usare anche la comunicazione SPI ma lo useremo in I2C. Imposta anche l’indirizzo con cui desideri comunicare ( vedi paragrafo “SPX-14241 BME280 CCS811” ) con il sensore BME280;

linea 15: imposta la modalità di funzionamento “Normal”;

linea 19: imposta il tempo di standby a 0.5ms;

linea 24: non impostare alcun filtro per questo primo test;

linea 29: imposta il numero di campionamenti della temperatura da 1 a 5 come valore corrispondono a valori da 1 a 16;

linea 34:  imposta il numero di campionamenti della pressione barometrica da 1 a 5 come valore corrispondono a valori da 1 a 16;

linea 39:  imposta il numero di campionamenti dell’umidità da 1 a 5 come valore corrispondono a valori da 1 a 16;

linea 41: imposta la comunicazione con il monitor seriale;

linea 42: attendi che sia stato aperto un canale seriale di comunicazione, questa linea l’ho aggiunta perché la utilizzo con una arduino leonardo ed è utile avere un sistema di attesa della connessione seriale;

linea 47: attendi 10 millisecondi per consentire al BME280 di inizializzarsi;

linea 49: inizializza il sensore e restituisce il risultato sul monitor seriale;

linee 51-124: esegui delle routine di inizializzazione e calibrazione del sensore restituendo sul monitor seriale il risultato di ciascun registro impostato;

linee 129-131: leggi la temperatura usando il metodo readTempC, in gradi centigradi o Celsius, e pubblicando nel monitor seriale il risultato letto;

linee 133-135: leggi la temperatura usando il metodo readTempF, in gradi fahrenheit, e pubblicando nel monitor seriale il risultato letto;

linee 137-139: leggi la pressione barometrica in Pa usando il metodo readFloatPressure;

linee 141-143: leggi l’altitudine con il metodo readFloatAltitudeMeters in metri;

linee 145-147: leggi l’altitudine con il metodo readFloatAltitudeFeet in piedi;

linee 149-151: leggi la temperatura rilavata con il metodo readFloatHumidity in percentuale;

Dopo aver ricaricato lo sketch apri il monitor seriale e troverai l’output seguente:

SPX-14241 Arduino serial output

in cui i valori riportati in fondo saranno, probabilmente, quelli più chiari e vorrai rilavare con il sensore SPX-14241 BME280.

Address SPX-14241 BME280 CCS811

Tra le serigrafie che trovi sul retro della nuova board ci sono gli indirizzi che devi utilizzare per comunicare con il sensore:

BME280 CCS811

Fonte: https://cdn.sparkfun.com/

Se lasci la piazzola sulla sinistra non collegata imposti l’indirizzo del BME280 a 0x77 altrimenti lo sposti su 0x76.

aa

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/spx-14241-bme280.html

1 ping

  1. SPX-14241 BME280 CCS811 - Alfieri Mauro Elettronica

    […] « SPX-14241 BME280 […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>