describe:
/**
* BME280-OLED
*
* By: Mike Klepper
* Date: 31 March 2017
*
* This program reads data from the BMP280 and shows it on a
* SSD1306 OLED display. It will alternte between British and
* metric units.
*
* See blog post on patriot-geek.blogspot.com
* for connections.
*/

#include "Wire.h"
#include "Adafruit_Sensor.h"
#include "Adafruit_BME280.h"
#include "SSD1306.h"

const float SEA_LEVEL_PRESSURE_HPA = 1013.25;
const int DELAY = 3000;
const int STARTUP_DELAY = 500;


Adafruit_BME280 bme;

SSD1306 display(0x3c, 5.4);

void setup()
{
Serial.begin(115200);

if(!bme.begin())
{
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1)
{
yield();
delay(DELAY);
}
}
delay(STARTUP_DELAY);

display.init();
display.flipScreenVertically();

}

void loop()
{
float tempC = bme.readTemperature();
float humidity = bme.readHumidity();
float pressurePascals = bme.readPressure();

// Print to serial monitor
printToSerial(tempC, humidity, pressurePascals);

// Display data on screen in British units
drawWithBritishUnits(tempC, humidity, pressurePascals);
yield();
delay(DELAY);

// Display data on screen in metric units
drawWithMetricUnits(tempC, humidity, pressurePascals);
yield();
delay(DELAY);
}


void drawWithBritishUnits(float tempC, float humidity, float pressurePascals)
{
float tempF = 9.0/5.0 * tempC + 32.0;
float pressureInchesOfMercury = 0.000295299830714 * pressurePascals;

display.clear();

display.drawRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT);

display.setFont(ArialMT_Plain_16);
display.drawString(35, 3, "BME280");

display.setFont(ArialMT_Plain_10);
display.drawString(5, 22, "Temperature = " + String(tempF) + " *F");
display.drawString(5, 35, "Humidity = " + String(humidity) + "%");
display.drawString(5, 48, "Pressure = " + String(pressureInchesOfMercury) + " inHg");

display.display();
}

void drawWithMetricUnits(float tempC, float humidity, float pressurePascals)
{
float pressureHectoPascals = pressurePascals / 100.0;

display.clear();

display.drawRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT);

display.setFont(ArialMT_Plain_16);
display.drawString(35, 3, "BME280");

display.setFont(ArialMT_Plain_10);
display.drawString(5, 22, "Temperature = " + String(tempC) + " *C");
display.drawString(5, 35, "Humidity = " + String(humidity) + "%");
display.drawString(5, 48, "Pressure = " + String(pressureHectoPascals) + " h,Pa");

display.display();
}

void printToSerial(float tempC, float humidity, float pressurePascals)
{
// Temperature
float tempF = 9.0/5.0 * tempC + 32.0;

Serial.println("Temperature:");
printValueAndUnits(tempC, "*C");
printValueAndUnits(tempF, "*F");
//printValueAndUnits(tempC, "°C");
//printValueAndUnits(tempF, "°F");
Serial.println("");

// Barometric pressure
float pressureHectoPascals = pressurePascals / 100.0;
float pressureInchesOfMercury = 0.000295299830714 * pressurePascals;

Serial.println("Pressure:");
printValueAndUnits(pressurePascals, "Pa");
printValueAndUnits(pressureHectoPascals, "hPa");
printValueAndUnits(pressureInchesOfMercury, "inHg");
Serial.println("");

// Humidity
Serial.println("Humidity:");
printValueAndUnits(humidity, "%");
Serial.println("");

// Approximate altitude
float altitudeMeters = bme.readAltitude(SEA_LEVEL_PRESSURE_HPA);
float altitudeFeet = 3.28 * altitudeMeters;

Serial.println("Approx. Altitude:");
printValueAndUnits(altitudeMeters, "m");
printValueAndUnits(altitudeFeet, "ft");
Serial.println();
}

void printValueAndUnits(float value, String units)
{
Serial.print(" ");
Serial.print(value);
Serial.print(" ");
Serial.println(units);
}