With this code:
Code: Select all
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define SAMPLES_NUM 100
#define SAMPLES_OFF 256
#define GRAPH_X (SCREEN_WIDTH - (SAMPLES_NUM + 1))
#define GRAPH_Y 16
#define GRAPH_W (SAMPLES_NUM + 1)
#define GRAPH_H 47
#define DATA_X 10
#define DATA_Y 0
#define SEALEVELPRESSURE_HPA 1000
#define PRESSURE_HPA_MIN 980
#define PRESSURE_HPA_MAX 1045
TwoWire Wire1(PB9, PB8);
TwoWire Wire2(PB11, PB10);
Adafruit_SSD1306 *display;
Adafruit_BME280 *bme;
void setup() {
pinMode(PC13, OUTPUT);
digitalWrite(PC13, LOW);
delay(500);
Wire1.begin();
Wire1.setClock(400000);
Wire2.begin();
Wire2.setClock(400000);
delay(100);
display = new Adafruit_SSD1306(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire2);
bme = new Adafruit_BME280();
while (!display->begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
delay(500);
}
delay(500);
display->clearDisplay();
display->dim(0);
display->setTextSize(1);
display->setTextColor(WHITE);
display->setCursor(0, 0);
display->println("Display initialized");
display->display();
int b = 0;
display->println("init bme...");
while (b == 0) {
b = bme->begin(BME280_ADDRESS_ALTERNATE, &Wire1);
display->print("b=");
display->print(b);
display->print("; ");
display->display();
}
display->println();
display->display();
if (b == 1) {
bme->setSampling(Adafruit_BME280::MODE_FORCED,
Adafruit_BME280::SAMPLING_X1, // temperature
Adafruit_BME280::SAMPLING_X1, // pressure
Adafruit_BME280::SAMPLING_X1, // humidity
Adafruit_BME280::FILTER_OFF);
}
delay(5000);
}
void loop() {
// bme->takeForcedMeasurement();
float _t1 = bme->readTemperature();
float _h1 = bme->readHumidity();
float _p1 = (bme->readPressure() / ((float)100.0F));
display->clearDisplay();
display->setCursor(0, 0);
display->print("T : ");
display->print(_t1, 1);
display->print((char)247);
display->println("C");
display->print("RH : ");
display->print(_h1, 1);
display->println("%");
display->print("P : ");
display->print(_p1, 1);
display->println("hPa");
display->display();
delay(5000);
}
I get an obviously erroneous read:
Code: Select all
T : 66.1°C
RH : 100.0%
P : -1599.7hPa
Code: Select all
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
TwoWire Wire1(PB9, PB8);
TwoWire Wire2(PB11, PB10);
Adafruit_SSD1306 *display;
Adafruit_BME280 *bme;
void setup() {
pinMode(PC13, OUTPUT);
digitalWrite(PC13, LOW);
delay(500);
Wire1.begin();
Wire1.setClock(400000);
Wire2.begin();
Wire2.setClock(400000);
delay(100);
display = new Adafruit_SSD1306(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire2);
bme = new Adafruit_BME280();
while (!display->begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
delay(500);
}
delay(500);
display->clearDisplay();
display->dim(0);
display->setTextSize(1);
display->setTextColor(WHITE);
display->setCursor(0, 0);
display->println("Display initialized");
display->display();
int b = 0;
display->println("init bme...");
while (b == 0) {
b = bme->begin(BME280_ADDRESS_ALTERNATE, &Wire1);
display->print("b=");
display->print(b);
display->print("; ");
display->display();
}
display->println();
display->display();
if (b == 1) {
bme->setSampling(Adafruit_BME280::MODE_FORCED,
Adafruit_BME280::SAMPLING_X1, // temperature
Adafruit_BME280::SAMPLING_X1, // pressure
Adafruit_BME280::SAMPLING_X1, // humidity
Adafruit_BME280::FILTER_OFF);
}
delay(5000);
}
void loop() {
bme->takeForcedMeasurement();
float _t1 = bme->readTemperature();
float _h1 = bme->readHumidity();
float _p1 = (bme->readPressure() / ((float)100.0F));
display->clearDisplay();
display->setCursor(0, 0);
display->println(_t1, 1);
display->println(_h1, 1);
display->println(_p1, 1);
display->display();
delay(5000);
}
Code: Select all
24.5
45.7
1009.8
Wiring it's ok and I can detect on both I2C bus devices address with i2cscanner.