
The BMP280 is a great addition to the weather station. This relatively cheap module gives us the capability to measure atmospheric pressure. The BMP280 also has a temperature and humidity sensor built in. The AM2302 used in our original project can be used as an inside temperature sensor.

The most common used library for the BMP280 is the Adafruit library. If you are using the D1 Mini Pro, the Adafruit library will not work. I found an example on a website that does not use a library. The example sketch worked well. The commands for communicating with the BMP280 were used in the weather station.

To connect the BMP280, simply connect it to your I2C bus. 3.3v is used to power the module.
Weather Station Using BMP280 Sketch
//Basic Weather Station Using D1 Mini pro 10/13/19 //Real Time Clock added 10/26/19 //https://KM4NMP.com/ //For the I2C LCD library used and installation instructions use link below //https://randomnerdtutorials.com/esp32-esp8266-i2c-lcd-arduino-ide/ //Real Time Clock Library used is RTClib by Adafruit. to install search in //the Library Manager and click install //BMP280 portion of Sketch was sourced from http://www.esp8266learning.com/esp8266-and-bme280-temperature-sensor-example.php #include<Wire.h> #include "RTClib.h" #include <LiquidCrystal_I2C.h> #define Addr 0x76 RTC_DS3231 rtc; int lcdColumns = 16; int lcdRows = 2; bool state=0; unsigned long previousMillis = 0; const long interval = 2000; LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows); void setup() { #ifndef ESP8266 while (!Serial); // for Leonardo/Micro/Zero #endif Wire.begin(); Serial.begin(9600); lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print(" KM4NMP.com"); delay(3000); if (! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1); } //SET DATE AND TIME TO COMPILE TIME //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // January 21, 2014 at 3am you would call: //rtc.adjust(DateTime(2019, 10, 26, 3, 0, 0)); DateTime now = rtc.now(); lcd.setCursor(11, 0); if (now.hour() >= 10 ) { //check hours if 10 or above and print hours lcd.print(now.hour(), DEC); lcd.print(':'); } if (now.hour() <= 9) { //check hours if 9 or below lcd.print("0"); //if needed 0 is printed before hours lcd.print(now.hour(), DEC); lcd.print(':'); } if (now.minute() >=10) { //checks if minutes are 10 or above lcd.print(now.minute(), DEC); } if (now.minute() <=9) { //checks if minutes are 9 or below lcd.print("0"); //if needed prints 0 before minutes lcd.print(now.minute(), DEC); } } void loop() { unsigned long currentMillis = millis(); DateTime now = rtc.now(); unsigned int b1[24]; unsigned int data[8]; unsigned int dig_H1 = 0; lcd.setCursor(11, 0); if (now.hour() >= 10 ) { lcd.print(now.hour(), DEC); lcd.print(':'); } if (now.hour() <= 9) { lcd.print("0"); lcd.print(now.hour(), DEC); lcd.print(':'); }
if (now.minute() >=10) { lcd.print(now.minute(), DEC); } if (now.minute() <=9) { lcd.print("0"); lcd.print(now.minute(), DEC); } if (currentMillis - previousMillis >= interval){ //checks time elapsed since last read for(int i = 0; i < 24; i++) { // Start I2C Transmission Wire.beginTransmission(Addr); // Select data register Wire.write((136+i)); // Stop I2C Transmission Wire.endTransmission(); // Request 1 byte of data Wire.requestFrom(Addr, 1); // Read 24 bytes of data if(Wire.available() == 1) { b1[i] = Wire.read(); } } // Convert the data // temp coefficients unsigned int dig_T1 = (b1[0] & 0xff) + ((b1[1] & 0xff) * 256); int dig_T2 = b1[2] + (b1[3] * 256); int dig_T3 = b1[4] + (b1[5] * 256); // pressure coefficients unsigned int dig_P1 = (b1[6] & 0xff) + ((b1[7] & 0xff ) * 256); int dig_P2 = b1[8] + (b1[9] * 256); int dig_P3 = b1[10] + (b1[11] * 256); int dig_P4 = b1[12] + (b1[13] * 256); int dig_P5 = b1[14] + (b1[15] * 256); int dig_P6 = b1[16] + (b1[17] * 256); int dig_P7 = b1[18] + (b1[19] * 256); int dig_P8 = b1[20] + (b1[21] * 256); int dig_P9 = b1[22] + (b1[23] * 256); // Start I2C Transmission Wire.beginTransmission(Addr); // Select data register Wire.write(161); // Stop I2C Transmission Wire.endTransmission(); // Request 1 byte of data Wire.requestFrom(Addr, 1); // Read 1 byte of data if(Wire.available() == 1) { dig_H1 = Wire.read(); } for(int i = 0; i < 7; i++) { // Start I2C Transmission Wire.beginTransmission(Addr); // Select data register Wire.write((225+i)); // Stop I2C Transmission Wire.endTransmission(); // Request 1 byte of data Wire.requestFrom(Addr, 1); // Read 7 bytes of data if(Wire.available() == 1) { b1[i] = Wire.read(); } } // Convert the data // humidity coefficients int dig_H2 = b1[0] + (b1[1] * 256); unsigned int dig_H3 = b1[2] & 0xFF ; int dig_H4 = (b1[3] * 16) + (b1[4] & 0xF); int dig_H5 = (b1[4] / 16) + (b1[5] * 16); int dig_H6 = b1[6]; // Start I2C Transmission Wire.beginTransmission(Addr); // Select control humidity register Wire.write(0xF2); // Humidity over sampling rate = 1 Wire.write(0x01); // Stop I2C Transmission Wire.endTransmission();
// Start I2C Transmission Wire.beginTransmission(Addr); // Select control measurement register Wire.write(0xF4); // Normal mode, temp and pressure over sampling rate = 1 Wire.write(0x27); // Stop I2C Transmission Wire.endTransmission(); // Start I2C Transmission Wire.beginTransmission(Addr); // Select config register Wire.write(0xF5); // Stand_by time = 1000ms Wire.write(0xA0); // Stop I2C Transmission Wire.endTransmission(); for(int i = 0; i < 8; i++) { // Start I2C Transmission Wire.beginTransmission(Addr); // Select data register Wire.write((247+i)); // Stop I2C Transmission Wire.endTransmission(); // Request 1 byte of data Wire.requestFrom(Addr, 1); // Read 8 bytes of data if(Wire.available() == 1) { data[i] = Wire.read(); } } // Convert pressure and temperature data to 19-bits long adc_p = (((long)(data[0] & 0xFF) * 65536) + ((long)(data[1] & 0xFF) * 256) + (long)(data[2] & 0xF0)) / 16; long adc_t = (((long)(data[3] & 0xFF) * 65536) + ((long)(data[4] & 0xFF) * 256) + (long)(data[5] & 0xF0)) / 16; // Convert the humidity data long adc_h = ((long)(data[6] & 0xFF) * 256 + (long)(data[7] & 0xFF)); // Temperature offset calculations double var1 = (((double)adc_t) / 16384.0 - ((double)dig_T1) / 1024.0) * ((double)dig_T2); double var2 = ((((double)adc_t) / 131072.0 - ((double)dig_T1) / 8192.0) * (((double)adc_t)/131072.0 - ((double)dig_T1)/8192.0)) * ((double)dig_T3); double t_fine = (long)(var1 + var2); double cTemp = (var1 + var2) / 5120.0; double fTemp = cTemp * 1.8 + 32; // Pressure offset calculations var1 = ((double)t_fine / 2.0) - 64000.0; var2 = var1 * var1 * ((double)dig_P6) / 32768.0; var2 = var2 + var1 * ((double)dig_P5) * 2.0; var2 = (var2 / 4.0) + (((double)dig_P4) * 65536.0); var1 = (((double) dig_P3) * var1 * var1 / 524288.0 + ((double) dig_P2) * var1) / 524288.0; var1 = (1.0 + var1 / 32768.0) * ((double)dig_P1); double p = 1048576.0 - (double)adc_p; p = (p - (var2 / 4096.0)) * 6250.0 / var1; var1 = ((double) dig_P9) * p * p / 2147483648.0; var2 = p * ((double) dig_P8) / 32768.0; double pressure = (p + (var1 + var2 + ((double)dig_P7)) / 16.0) / 100; // Humidity offset calculations double var_H = (((double)t_fine) - 76800.0); var_H = (adc_h - (dig_H4 * 64.0 + dig_H5 / 16384.0 * var_H)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * var_H * (1.0 + dig_H3 / 67108864.0 * var_H))); double humidity = var_H * (1.0 - dig_H1 * var_H / 524288.0); if(humidity > 100.0) { humidity = 100.0; } else if(humidity < 0.0) { humidity = 0.0; } double inchMerc = pressure * 0.02953; // Output data to serial monitor Serial.print("Temperature in Celsius : "); Serial.print(cTemp); Serial.println(" C"); Serial.print("Temperature in Fahrenheit : "); Serial.print(fTemp); Serial.println(" F"); Serial.print("Pressure : "); Serial.print(pressure); Serial.println(" hPa"); Serial.print(inchMerc); Serial.println("inhg"); Serial.print("Relative Humidity : "); Serial.print(humidity); Serial.println(" RH"); lcd.setCursor(0, 0); lcd.print(inchMerc); lcd.print("inHg "); lcd.setCursor(0, 1); lcd.print(fTemp); //prints temp lcd.print((char)223); //charecter for derees lcd.print("F "); lcd.print(humidity); //prints humidity lcd.print((char)37); //speacial charecter for% previousMillis = currentMillis; // resets time of last read } }

Links
http://www.esp8266learning.com/esp8266-and-bme280-temperature-sensor-example.php
https://km4nmp.com/2019/10/26/adding-a-real-time-clock-to-the-basic-weather-station/
https://km4nmp.com/2019/10/13/basic-weather-station-using-a-d1-mini-pro/
https://km4nmp.com/2019/05/11/lm7805-regulated-5-volts/
Latest Posts