Error bmp280 con mas perifericos (presiones negativas)

Buenas
Tengo un problema con el sensor bmp280, a ver si alguno me puede decir que estoy haciendo mal
Lo primero que he hecho es cambiar la dirección en el archivo “bmp280.h” a 0x76,
Luego he probado primero con conexion spi y me dice que no reconoce el dispositivo:

#include <SPI.h>
#include <Adafruit_BMP280.h>

#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   (10)

//Adafruit_BMP280 bmp; // I2C
Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

void setup() {
  Serial.begin(9600);
  while ( !Serial ) delay(100);   // wait for native usb
  Serial.println(F("BMP280 test"));
  unsigned status;
  status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
  //status = bmp.begin();
  if (!status) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
                      "try a different address!"));
    Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(),16);
    Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
    Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
    Serial.print("        ID of 0x60 represents a BME 280.\n");
    Serial.print("        ID of 0x61 represents a BME 680.\n");
    while (1) delay(10);
  }

  /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}

void loop() {
    Serial.print(F("Temperature = "));
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");

    Serial.print(F("Pressure = "));
    Serial.print(bmp.readPressure());
    Serial.println(" Pa");

    Serial.print(F("Approx altitude = "));
    Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */
    Serial.println(" m");

    Serial.println();
    delay(2000);
}

salida serial:
Imagen1

foto conexiones:

Como no me funcionaba he probado con el i2c y si que me funciona:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_BMP280.h>


#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   (10)

Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

void setup() {
  Serial.begin(9600);
  while ( !Serial ) delay(100);   // wait for native usb
  Serial.println(F("BMP280 test"));
  unsigned status;
  //status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
  status = bmp.begin();
  if (!status) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
                      "try a different address!"));
    Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(),16);
    Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
    Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
    Serial.print("        ID of 0x60 represents a BME 280.\n");
    Serial.print("        ID of 0x61 represents a BME 680.\n");
    while (1) delay(10);
  }

  /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}

void loop() {
    Serial.print(F("Temperature = "));
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");

    Serial.print(F("Pressure = "));
    Serial.print(bmp.readPressure());
    Serial.println(" Pa");

    Serial.print(F("Approx altitude = "));
    Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */
    Serial.println(" m");

    Serial.println();
    delay(2000);
}

salida serial:
Imagen2

conexiones:

El PROBLEMA me viene al incluir en el programa el resto de periféricos: añado pantalla oled I2C y dht22 :

#include <Adafruit_BMP280.h>  //para el mmodulo bmp280
#include <Adafruit_SSD1306.h> //para pantalla oled
#include <Adafruit_GFX.h> //para pantalla oled
#include <Wire.h> //para I2C (pantalla oled y bmp)
#include <LowPower.h> //para el modo sleep
#include <DHT.h> //para senson temp y hum
#include <GFButton.h>  //biblioteca manejo botones
#include <SPI.h>  //para conexion spi 

//definimos las constantes
#define DHTPIN 4  //pin conectado del dht
#define DHTTYPE DHT22 //modelo del dht
#define ANCHO_PANTALLA 128 // ancho pantalla OLED
#define ALTO_PANTALLA 64 // alto pantalla OLED
const int wakeUpPin = 2; //para despertar arduino hay que conectar el boton al pin 2 o 3

//declaramos los vectores para t, h y p
int dim=12;
float temp[12]={0,0,0,0,0,0,0,0,0,0,0,0};
float hum[12]={0,0,0,0,0,0,0,0,0,0,0,0};
float pre[12]={0,0,0,0,0,0,0,0,0,0,0,0};
float t;
float p;
float h;
float hic;
volatile bool despierto = false; // variable para la interrupcion

//declaramos  los perifericos 
Adafruit_BMP280 bmp; //el bmp280-->bmp
Adafruit_SSD1306 oled(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1); //la pantalla oled-->oled
DHT dht(DHTPIN, DHTTYPE); //el dht22-->dht


void setup() {
   Serial.begin(9600);
   pinMode(wakeUpPin, INPUT);   // Configure wake up pin as input.
   oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Iniciar pantalla OLED en la dirección 0x3C
   oled.cp437(true);  //Activar página de código 437 para los simbolos
   dht.begin();  // Iniciar el sensor DHT
   bmp.begin();  // Iniciar el sensor bmp
   bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */

   oled.clearDisplay();
   oled.setTextSize(3);
   // Color del texto
   oled.setTextColor(WHITE);
   oled.setCursor(8, 32);
   oled.println("hhola ");
   oled.display(); 
   delay(2000);
}
void loop() {
  //leemos los datos 
   t=dht.readTemperature(); 
   h = dht.readHumidity();
   hic = dht.computeHeatIndex(t, h);
   p = bmp.readPressure()/100;   // almacena en variable el valor de presion divido  por 100 para covertirlo a hectopascales

   //mostramos datos en serial
    Serial.println("------------------------------------------------");
   Serial.print(F("Temperatura = "));
    Serial.print(t);
    Serial.println(" *C");
    Serial.print(F("humedad = "));
    Serial.print(h);
    Serial.println(" %");
    Serial.print(F("presion = "));
    Serial.print(p);
    Serial.println(" hpa");
    Serial.print(F("sensacion termica = "));
    Serial.print(hic);
    Serial.println(" *C");
   
  //mostramos los datos en pantalla
  oled.clearDisplay(); // Limpiar buffer
  oled.setTextSize(2); //tamaño de texto
  oled.setTextColor(WHITE);  // Color del texto
  oled.setCursor(8, 0);
  oled.print("T: ");
  oled.println(t);
  oled.setCursor(8, 16);
  oled.print("H: ");
  oled.println(h);
  oled.setCursor(8, 32);
  oled.print("P: ");
  oled.println(p);
  oled.setCursor(1, 48);
  oled.print("Sen: ");
  oled.println(hic,1);
  oled.display(); //enviamos datos al oled
  delay(2000);
  
}

salida serial:
Imagen3

las conexiones son iguales que en la segunda foto. mis preguntas son:
¿que tengo mal en la conexion spi para que no me reconozca el sensor?
¿por que si uso conexion i2c inicialmente me funciona pero si inicializo la pantalla oled, que tambien va por i2c pero con diferente direccion (creo), me da presiones negativas?

Gracias por vuestro tiempo!

He modicado levemente tu código y quisiera que me digas si sigue comportándose mal

#include <Adafruit_BMP280.h>  //para el mmodulo bmp280
#include <Adafruit_SSD1306.h> //para pantalla oled
#include <Adafruit_GFX.h> //para pantalla oled
#include <Wire.h> //para I2C (pantalla oled y bmp)
#include <LowPower.h> //para el modo sleep
#include <DHT.h> //para senson temp y hum
#include <GFButton.h>  //biblioteca manejo botones

//definimos las constantes
#define DHTPIN 4  //pin conectado del dht
#define DHTTYPE DHT22 //modelo del dht
#define ANCHO_PANTALLA 128 // ancho pantalla OLED
#define ALTO_PANTALLA 64 // alto pantalla OLED
const int wakeUpPin = 2; //para despertar arduino hay que conectar el boton al pin 2 o 3

//declaramos los vectores para t, h y p
int dim=12;
float temp[12]= {0,0,0,0,0,0,0,0,0,0,0,0};
float hum[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
float pre[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
float t;
float p;
float h;
float hic;
volatile bool despierto = false; // variable para la interrupcion

//declaramos  los perifericos 
Adafruit_BMP280 bmp; //el bmp280-->bmp
Adafruit_SSD1306 oled(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1); //la pantalla oled-->oled
DHT dht(DHTPIN, DHTTYPE); //el dht22-->dht
bool flag = false;
unsigned long presento;

void muestroSerial () {
  //mostramos datos en serial
  Serial.println("------------------------------------------------");
  Serial.print(F("Temperatura = "));
  Serial.print(t);
  Serial.println(" *C");
  Serial.print(F("humedad = "));
  Serial.print(h);
  Serial.println(" %");
  Serial.print(F("presion = "));
  Serial.print(p);
  Serial.println(" hpa");
  Serial.print(F("sensacion termica = "));
  Serial.print(hic);
  Serial.println(" *C");
}

void muestroOled() {
  
  //mostramos los datos en pantalla
  oled.clearDisplay(); // Limpiar buffer
  oled.setTextSize(2); //tamaño de texto
  oled.setTextColor(WHITE);  // Color del texto
  oled.setCursor(8, 0);
  oled.print("T: ");
  oled.println(t);
  oled.setCursor(8, 16);
  oled.print("H: ");
  oled.println(h);
  oled.setCursor(8, 32);
  oled.print("P: ");
  oled.println(p);
  oled.setCursor(1, 48);
  oled.print("Sen: ");
  oled.println(hic,1);
  oled.display(); //enviamos datos al oled
}

void setup() {
   Serial.begin(9600);
   pinMode(wakeUpPin, INPUT);   // Configure wake up pin as input.
   oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Iniciar pantalla OLED en la dirección 0x3C
   oled.cp437(true);  //Activar página de código 437 para los simbolos
   dht.begin();  // Iniciar el sensor DHT
   bmp.begin();  // Iniciar el sensor bmp
   bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */

   oled.clearDisplay();
   oled.setTextSize(3);
   // Color del texto
   oled.setTextColor(WHITE);
   oled.setCursor(8, 32);
   oled.println("hhola ");
   oled.display(); 
   delay(2000);
}

void loop() {
  //leemos los datos 
  
  if (millis() - presento > 2000UL) {
      t   = dht.readTemperature(); 
      h   = dht.readHumidity();
      hic = dht.computeHeatIndex(t, h);
      p   = bmp.readPressure()/100;   // almacena en variable el valor de presion divido  por 100 para covertirlo a hectopascales
      presento = millis();
      flag = true;
  }
  if (flag) {  // solo muestro cuando hay datos nuevos
    muestroSerial();
    muestroOled();
    flag = false;   
  }  
}

buenas surbyte
muchisimas gracias por tu tiempo, lo conseguí resolver de otra forma

Sería bueno que lo comentes para cerrar tu hilo.

pues la verdad es que no hice nada especial, como mi programa no leia bien las presiones, pero el example del bmp280 si me leia bien, parti de este ejemplo y construi sobre el mi programa. dejo el codigo entero por si a alguno le interesa
resumen de programa: lee la temperatura humedad (dht22) y presion (bmp280) y en una pantalla oled (oled 0,96") cada hora o despertando mediante un pulsador muestra los valores y las graficas de estos de los ultimos 12 valores (me interesaba ver las variaciones, no el valor actual). La programacion es muy mejorable, pero desbordaba memoria sram y me hacia cosas raras, asi que he tenido que hacer "apaños" para disminuir la memoria usada



#include <Wire.h>

#include <Adafruit_BMP280.h>
#include <Adafruit_SSD1306.h> //para pantalla oled
#include <Adafruit_GFX.h> //para pantalla oled
#include <LowPower.h> //para el modo sleep
#include <DHT.h> //para senson temp y hum
#include <GFButton.h>  //biblioteca manejo botones

#define ANCHO_PANTALLA 128 // ancho pantalla OLED
#define ALTO_PANTALLA 64 // alto pantalla OLED
#define DHTPIN 4  //pin conectado del dht
#define DHTTYPE DHT22 //modelo del dht
const int wakeUpPin = 2; //para despertar arduino hay que conectar el boton al pin 2 o 3

//declaramos los vectores para t, h y p
int dim=12;
float temp[12]={0,0,0,0,0,0,0,0,0,0,0,0};
float hum[12]={0,0,0,0,0,0,0,0,0,0,0,0};
float pre[12]={0,0,0,0,0,0,0,0,0,0,0,0};



float t;
float p;
float h;
float hic;
volatile bool despierto = false; // variable para la interrupcion
long ahora;
int i;


//declaramos  los perifericos 
Adafruit_BMP280 bmp; // I2C
Adafruit_SSD1306 oled(ANCHO_PANTALLA, ALTO_PANTALLA, &Wire, -1); //la pantalla oled-->oled
DHT dht(DHTPIN, DHTTYPE); //el dht22-->dht

//------------------------FUNCIONES--------------------------------------

//funcion para el sleep
void wakeUp(){
     despierto = true;
}

//desplaza una posicion los valores del vector 
void colocar(int dim,float vect[],float dato){
  //Desplazo los valores del array
  for ( i=0;i<dim-1;i++){
    vect[i]=vect[i+1];
  }
   vect[dim-1]=dato;
}

//funcion normalizar y graficar vectoresn Ncaracter es el numero del simbolo segun estandar 437 para dibujar los puntos
void normalizar (int dim,float vec[]){
    float a;
    float aa;
    float b;
    float bb;
    float maxA=-1000;
    float minA=1000;
    //calculmos maximo y minimo
    for ( i=0;i<dim;i++){
       if (vec[i]>maxA){
          maxA=vec[i];
       }
        if (vec[i]<minA){
          minA=vec[i];
       }
    }
    //damos un margen de 2 por arriba y abajo
    maxA=maxA+2;
    minA=minA-2;
    //graficamos eje y con valores
    oled.setTextSize(1);
    oled.setTextColor(SSD1306_WHITE);
        
    oled.setCursor(0,16);
    oled.print(maxA-2,0);
    oled.setCursor(0,56);
    oled.print(minA+2,0);
    oled.drawLine (16,16,16,64,SSD1306_WHITE);
    
    //normalizamos y graficamos los puntos, calculamos 2 puntos en cada iteraccion
    for ( i=0;i<dim-1;i++){
      a=(vec[i]-minA)/(maxA-minA)*40; //multiplicamos por 42 para ocupar la parte azul
      aa=64-a;
      oled.setCursor(22+8*i,aa-4); //el -4 para cuadrar los puntos
      oled.print(F("+"));
      b=(vec[i+1]-minA)/(maxA-minA)*40;
      bb=64-b;
      oled.drawLine (24+8*i,aa,24+8*(i+1),bb,SSD1306_WHITE); 
    }
    oled.setCursor(22+8*i,bb-4); //el -4 para cuadrar los puntos
    oled.print(F("+"));
  
   oled.display();  
   ahora=millis();
   while (millis()-ahora<3000){ } //es como un delay
   
}


void setup() {
  Serial.begin(9600);
  bmp.begin();
   /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */

   oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Iniciar pantalla OLED en la dirección 0x3C
   dht.begin();  // Iniciar el sensor DHT
   
   oled.clearDisplay();
   oled.setTextSize(2);
   // Color del texto
   oled.setTextColor(SSD1306_WHITE);
   oled.setCursor(8, 17);
   oled.println(F("Estacion"));
   oled.setCursor(25, 37);
   oled.println(F("meteo"));
   oled.display(); 
   ahora=millis();
 while (millis()-ahora<3000){ }
}

void loop() {
  //apagamos oled
  oled.ssd1306_command(SSD1306_DISPLAYOFF);

    ///Allow wake up pin to trigger interrupt on low.
   attachInterrupt(digitalPinToInterrupt(wakeUpPin), wakeUp, CHANGE);  //0 por el pin 2, CHANGE Se dispara cuando pase de HIGH a LOW o viceversa.

   //vamos a meter el apagado en un for para conseguir mas tirmpo de 8 seg, quiero medidas cada hora asi que necesito 3600seg, 8*450
   for ( i=0;i<450;i++){
        // Enter power down state with ADC and BOD module disabled.
        LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); 
         //funcionamiento: si pulso boton hay cambio de valor en el pin, se activa attachinterrupt--> entra funcion wakeup, cambiamos valor de despierto a true-->
         //-->entra al if, volvemos despierto a false y con el break rompemos el for
         if(despierto){
            despierto = false;
            break;
         }
    }
    // Disable external pin interrupt on wake up pin.
     detachInterrupt(digitalPinToInterrupt(wakeUpPin)); 
  

  //encendemos oled
   oled.ssd1306_command(SSD1306_DISPLAYON);
   oled.cp437(true);
   
   //leemos los datos 
   t=dht.readTemperature(); 
   h = dht.readHumidity();
   hic = dht.computeHeatIndex(t, h);
   p = bmp.readPressure()/100;   // almacena en variable el valor de presion divido  por 100 para covertirlo a hectopascales
    
  //mostramos los datos en pantalla
  oled.clearDisplay(); // Limpiar buffer
  oled.setTextSize(2); //tamaño de texto
  oled.setTextColor(SSD1306_WHITE);  // Color del texto
  oled.clearDisplay(); // Limpiar buffer
  oled.setTextSize(2); //tamaño de texto
  oled.setTextColor(SSD1306_WHITE);  // Color del texto
  oled.setCursor(0, 0);
  oled.print(F("T:"));
  oled.print(t);
  oled.println (F(" C"));
  oled.setCursor(0, 16);
  oled.print(F("H:"));
  oled.print(h);
  oled.println (F(" %"));
  oled.setCursor(0, 32);
  oled.print(F("P:"));
  oled.print(p,1);
  oled.println (F("hp"));
  oled.setCursor(0, 48);
  oled.print(F("Sen:"));
  oled.print(hic,1);
  oled.println (F(" C"));
  oled.display(); //enviamos datos al oled
 ahora=millis();
 while (millis()-ahora<3000){ } //es como un dalay
   
   //recoloco vector temp y coloco el valor actual de t en el ultimo valor del array
  colocar(dim,temp,t);
  oled.clearDisplay();
  //vamos a normalizar los valores a 40 dando un margen de 2 y graficamos
  oled.setTextSize(2);
  oled.setTextColor(SSD1306_WHITE);
  oled.setCursor(0, 0);
  oled.println(F("Temperatur"));
  normalizar (dim,temp);
   
  colocar(dim,hum,h);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(SSD1306_WHITE);
  oled.setCursor(20, 0);
  oled.print(F("humedad "));
  normalizar (dim,hum);
  
 
  colocar(dim,pre,p);
  oled.clearDisplay();
  oled.setTextSize(2);
  oled.setTextColor(SSD1306_WHITE);
  oled.setCursor(20, 0);
  oled.print(F("presion "));
  normalizar (dim,pre);
 
}