LamaPLC: BMP/BME Bosch Temperature/Humidity/Pressure sensors with I²C communication

Bosch BMP sensors primarily measure barometric pressure and temperature, while Bosch BME sensors are more comprehensive, adding humidity and, in newer models, gas/air quality sensing.

Type of
measurement
ModelPower
voltage
Measurement, range, accuracyCommunicationNote
Temperature measuringHumidity measuringAir-press measuring
Temperature
Humidity
Air pressure
Bosch
BME280 BME280
3.3 V
(1.71 .. 3.6V)
Temperature measurement range: -40 .. +80 °C
Temperature measurement accuracy: ±0.5°C (-40..85)
Humidity measurement range: 0..100% RH
Humidity measurement accuracy: ±3%
Air pressure Range: 300 .. 1100 hPa
Air pressure accuracy: ±0.25%
I²C
default addr.: 0x76/77
SPI
-
Temperature measuringHumidity measuringAir-pressure measuring
Temperature
Humidity
Air pressure
Bosch
BME680 BME680
3.3 V
(1.71 .. 3.6V)
Temperature measurement range: -40 .. +80 °C
Temperature measurement accuracy: ±1.5°C
Humidity measurement range: 0..100% RH
Humidity measurement accuracy: ±3%
Air pressure Range: 300 .. 1100 hPa
Air pressure accuracy: ±0.25%
I²C
default addr.: 0x76/77
SPI
Direct output of IAQ: Index for Air Quality
Temperature measuringAir-pressure measuring
Temperature
Air-pressure
Bosch
BMP180 BMP180
3.3 V
(1.62 .. 3.6V)
Temperature measurement range: -40 .. +85 °C
Temperature measurement accuracy: ±1.5°C
Air pressure Range: 4.35PSI .. 15.95PSI (30kPa .. 110kPa)
Air pressure accuracy: ±2%
I²C
default addr.: 0x77 (fix)
Maximum Pressure: 145.04PSI (1000kPa)
Temperature resolution: 0.1 °C
Pressure resolution: 1 Pa
Temperature measuringAir-press measuring
Temperature
Air-pressure
Bosch
BMP280 BMP280
3.3 V
(1.71 .. 3.6V)
Temperature measurement range: -40 .. +85 °C
Temperature measurement accuracy: ±1.5°C
Air pressure Range: 4.35PSI .. 15.95PSI (30kPa .. 110kPa)
Air pressure accuracy: ±2%
I²C
default addr.: 0x76
SPI
Maximum Pressure: 290.08PSI (2000kPa)
Temperature resolution: 0.01 °C
Pressure resolution: 0.16 Pa

The BME/BMP sensors can be integrated with the Tasmota system. For more details, see here:

BME/BMP Modules

BMP180 Temperature/Barometric Pressure Module

GY-68 Temperature measuringAir-press measuring

Another name for the GY-68 module is a breakout board that integrates the Bosch BMP180 sensor to measure atmospheric pressure, temperature, and altitude. The two terms refer to different components of the same product for hobbyist use: the BMP180 is the sensing chip on the GY-68 printed-circuit board.

The GY-68 BMP180 sensor module is known for its high precision, low power consumption, and ease of use via the I2C interface, making it popular for a wide range of DIY and IoT projects.

FeatureSpecification
ChipsetBosch BMP180
Operating Voltage3.3V–5.5V (module input voltage, includes voltage regulator); the chip itself runs on 1.8V–3.6V
Power ConsumptionUltra-low power, typically 0.5 µA in standard mode (at 1 Hz sampling)
InterfaceI²C (Serial Data Line/SDA and Serial Clock Line/SCL)
Multiple modules on the I²CNo. Default address 0x77 is fixed, making it impossible to add multiple sensors to the same I²C bus
Pressure Range300 to 1100 hPa (+9000m to -500m relative to sea level)
Pressure AccuracyUp to ±0.03 hPa (~0.25m resolution) in high resolution mode
Temperature Range-40°C to +85°C
Temperature Accuracy±0.5°C
CalibrationFully calibrated at the factory, and data is stored in internal E2PROM

BME280 Temperature/Humidity/Barometric Pressure module

GY-BME280 Temperature measuringHumidity measuringAir-press measuring

Another name, GY-BME280, is a sensor module that integrates the Bosch BME280 environmental sensor chip and measures temperature, humidity, and atmospheric pressure. It is an upgrade to the BMP280 and is widely used in hobbyist electronics and IoT projects for comprehensive environmental monitoring.

The Bosch BME280 sensor features high precision and low power consumption, making it suitable for battery-powered systems. The GY-BME280 module often includes a voltage regulator and a logic-level converter, allowing it to operate with both 3.3V and 5V microcontrollers such as Arduino and Raspberry Pi.

FeatureSpecification
ChipsetBosch BME280
MeasurementsTemperature, Humidity, and Pressure
Operating Voltage3.3V–5V (via onboard regulator on some modules; chip runs on 1.71V–3.6V)
InterfaceI²C (default) and SPI (optional)
Multiple modules on the I²CMax. 2 modules. The module's default I²C address is 0x76, which can be easily changed to 0x77 using the provided solder jumper *
Temperature Range-40°C to +85°C
Humidity Range0% to 100% relative humidity (±3% accuracy)
Pressure Range300 to 1100 hPa (±1.0 hPa accuracy)
Power ConsumptionAs low as 0.1 µA in sleep mode, or 3.6 µA at 1 Hz for all three measurements

*: To change the I²C address to 0x77, cut the trace between the middle and left copper pads with a sharp knife. Then add a solder blob between the middle and right copper pads to short them.

BMP280 (HW-611) Temperature/Barometric Pressure module

GY-BMP280 Temperature measuringAir-press measuring

The GY-BMP280-3.3 is a sensor module featuring the Bosch BMP280 environmental sensor chip, which precisely measures atmospheric pressure and temperature. This module operates from a 3.3V DC power supply, making it a low-power solution for applications such as weather monitoring, altimetry, and navigation systems.

The Bosch BMP280 improves on its predecessors (BMP085/BMP180) by delivering better performance and lower power consumption in a smaller form factor. The GY-BMP280-3.3 module features versatile interfacing and precise measurements.

FeatureSpecification
ChipsetBosch BMP280
MeasurementsPressure and Temperature (Does not measure humidity)
Operating Voltage3.3V DC (module input voltage; chip runs on 1.71V–3.6V)
Power ConsumptionUltra-low power, typically 2.7 µA at 1 Hz sampling rate
InterfaceI²C (up to 3.4 MHz) and SPI (up to 10 MHz)
Multiple modules on the I²CMax. 2 modules. Default I²C is: 0x76 (SDO pin low). 2nd I²C address is: 0x77 *
Pressure Range300 to 1100 hPa (+9000m to -500m relative to sea level)
Pressure AccuracyUp to ±1 hPa absolute accuracy, allowing for ~±1m altitude resolution
Temperature Range-40°C to +85°C
Temperature Accuracy±1.0°C
CalibrationFactory-calibrated, with data stored in internal E2PROM

*: To set the I²C address to 0x77, connect pin 6 of the module (SDO) to Vcc, typically the 3.3V supply, and connect pin 5 of the module (CSB) to Vcc to select the I²C interface.

GY-BMP280-3.3 Pinout

PinNameI²C FunctionSPI Function
(4-wire)
Description
1VCCPower (3.3V)Power (3.3V)Supply voltage (1.71V to 3.6V)
2GNDGroundGroundCommon ground
3SCLSCLSCKSerial clock line
4SDASDASDI (MOSI)Serial data line
5CSBHigh (I²C)CSChip select. Pull High for I²C (default via onboard resistor) or Low for SPI
6SDOADRSDO (MISO)Sets I²C address: High for 0x77, Low for 0x76 (default).
Never leave the SDO pin floating. If it is not tied to GND or VCC, the I²C address may fluctuate randomly between the two values, causing communication errors.

If you'd like to support the development of the site with the price of a coffee — or a few — please do so here.

Here's a handy tip: you can quickly save this page as a PDF by clicking “export to PDF” in the menu on the right side of the screen.

2026/02/14 23:38

GY-BMP280/HW-611 Arduino code

// include
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h> // BMP280/HW-611
 
// variable
float bmp_280_temp;
float bmp_280_press;
bool bmp_280_ready;
String unitID = "abcd";
 
// init
Adafruit_BMP280 bmp_280; // BMP280/HW-611
 
// call block
void bmp_280_function () {
  bmp_280_temp = bmp_280.readTemperature();
  bmp_280_press = bmp_280.readPressure() / 100.0F;
  Serial.print("unitID: "); Serial.print(unitID); Serial.print("; bmp_280_temp: "); Serial.print(bmp_280_temp); Serial.println(" ; unit: C");
  Serial.print("unitID: "); Serial.print(unitID); Serial.print("; bmp_280_press: "); Serial.print(bmp_280_press); Serial.println(" ; unit: hPa");
}
 
 
void setup() {
  Serial.begin(115200);
    // unit works?
    bmp_280_ready = bmp_280.begin(0x76); 
    if (!bmp_280_ready) {
    Serial.println("BMP280/HW-611 Sensor not found");
    } else {
	Serial.println("BMP280/HW-611 Sensor works");
	}
  }
 
void loop() {
  // call all units with 2 sec raster
  static unsigned long lastTime = 0;
  if (millis() - lastTime > 2000) {
    lastTime = millis();
    // units call, if works
    if (bmp_280_ready) {bmp_280_function ();}
  }
}

CJMCU-680 Temperature/Humidity/Barometric Pressure/Gas (VOC) Module

CJMCU-680 Temperature measuringHumidity measuringAir-press measuringGas Sensor

The CJMCU-680 is an environmental sensor breakout board based on the Bosch BME680 chip. It is a versatile “4-in-1” module designed for DIY electronics and IoT projects.

Core Capabilities

The module measures four distinct environmental parameters:

  • Temperature: Provides ambient temperature readings.
  • Humidity: Measures relative humidity.
  • Barometric Pressure: Can be used to calculate altitude or track weather changes.
  • Gas (VOC): Features a heated metal-oxide sensor that detects Volatile Organic Compounds (VOCs) to estimate indoor air quality.
FeatureSpecificationDetails
ModelCJMCU-680 / BME6804-in-1 Environmental Sensor
Operating Voltage1.7V – 3.6VOften compatible with 5V via onboard regulator
CommunicationI²C or SPII²C (up to 3.4 MHz), SPI (up to 10 MHz)
Multiple modules on the I²CMax. 2 modules. Default I²C is: 0x76 (SDO pin low). 2nd I²C address is: 0x77 *
Current (Sleep)0.15 µAExtremely low standby power
Current (Active)2.1 µA – 12 mAVaries by mode; gas sensor heater uses most power
Dimensions~30 x 14 x 10 mmCompact breakout board size

Sensor Performance

ParameterMeasurement RangeAccuracy / Tolerance
Temperature-40°C to +85°C±1.0°C
Humidity0% to 100% RH±3% RH
Pressure300 to 1100 hPa±1 hPa (absolute) / ±0.12 hPa (relative)
Gas (VOC)Qualitative IAQ IndexDetects ethanol, CO, and other VOCs

Gas Sensor Note: For accurate air quality readings, it is recommended to “burn-in” the sensor for 48 hours during the first use and allow 30 minutes of warm-up time for each subsequent session.

Response Times:

  • Gas Sensor: < 1 second (τ33-63%)
  • Humidity Sensor: ~8 seconds (τ0-63%)

CJMCU-680 Pinout

The standard CJMCU-680 module uses the following pin arrangement:

PinNameFunction
1VCCPower Supply (1.7V to 3.6V; commonly used with 3.3V)
2GNDGround
3SCLI²C Clock (SCL) or SPI Clock (SCK)
4SDAI²C Data (SDA) or SPI Data In (SDI/MOSI)
5SDOSPI Data Out (MISO). Also sets the I²C Address: connect to GND for 0x76 (default) or VCC for 0x77.
Never leave the SDO pin floating. If it is not tied to GND or VCC, the I²C address may fluctuate randomly between the two values, causing communication errors.
6CSChip Select for SPI. Pulling this high or leaving it disconnected defaults the module to I²C mode

Arduino wiring

  • SCL: A5
  • GND: GND
  • SDA: A4
  • Vdd: 3.3V (or 5V if your breakout board has a regulator).

Arduino code

Install the Adafruit BME680 Library (this will also prompt you to install the Adafruit Unified Sensor and Adafruit BME680 Library, which you need)

/*
 * BME680 Sensor - Arduino Uno/Nano
 * Connection: I2C
 * Data: Temperature, Humidity, Pressure, Gas (Air Quality)
 *
 * Required Libraries (Arduino Library Manager):
 *   - "Adafruit BME680 Library" by Adafruit
 *   - "Adafruit Unified Sensor" by Adafruit
 *
 * Wiring (I2C):
 *   BME680  -->  Arduino Uno/Nano
 *   VCC     -->  3.3V (or 5V depending on module)
 *   GND     -->  GND
 *   SDA     -->  A4
 *   SCL     -->  A5
 */
 
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME680.h>
 
// Sea level pressure for altitude calculation (adjust to your location in hPa!)
#define SEA_LEVEL_PRESSURE_HPA 1013.25
 
// Create BME680 object (I2C address: 0x76 or 0x77)
Adafruit_BME680 bme;
 
void setup() {
  Serial.begin(9600);
  while (!Serial);  // Wait until Serial is ready
 
  Serial.println(F("============================"));
  Serial.println(F("  BME680 Sensor - Arduino   "));
  Serial.println(F("============================"));
 
  // Initialize sensor
  if (!bme.begin(0x76)) {
    Serial.println(F("ERROR: BME680 not found!"));
    Serial.println(F("Please check your wiring."));
    Serial.println(F("Trying address 0x77 ..."));
 
    if (!bme.begin(0x77)) {
      Serial.println(F("ERROR: BME680 not found on 0x77 either!"));
      while (1); // Halt program
    }
  }
 
  Serial.println(F("BME680 found successfully!"));
 
  // Configure sensor settings
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  bme.setGasHeater(320, 150); // Heater temperature: 320°C, Heating time: 150ms
 
  Serial.println(F("Sensor configured. Starting measurements...\n"));
  delay(2000);
}
 
void loop() {
  // Start measurement and wait for result
  if (!bme.performReading()) {
    Serial.println(F("ERROR: Reading failed!"));
    delay(2000);
    return;
  }
 
  // Print sensor values
  Serial.println(F("----------------------------"));
 
  // Temperature
  Serial.print(F("Temperature:      "));
  Serial.print(bme.temperature, 1);
  Serial.println(F(" °C"));
 
  // Humidity
  Serial.print(F("Humidity:         "));
  Serial.print(bme.humidity, 1);
  Serial.println(F(" %"));
 
  // Pressure
  Serial.print(F("Pressure:         "));
  Serial.print(bme.pressure / 100.0, 2);
  Serial.println(F(" hPa"));
 
  // Altitude above sea level (calculated)
  Serial.print(F("Altitude (approx): "));
  Serial.print(bme.readAltitude(SEA_LEVEL_PRESSURE_HPA), 1);
  Serial.println(F(" m"));
 
  // Gas resistance (air quality)
  Serial.print(F("Gas Resistance:   "));
  Serial.print(bme.gas_resistance / 1000.0, 2);
  Serial.println(F(" kΩ"));
 
  // Air quality as simple rating
  Serial.print(F("Air Quality:      "));
  Serial.println(getAirQuality(bme.gas_resistance));
 
  Serial.println();
 
  // Wait 3 seconds until next measurement
  delay(3000);
}
 
// Simple air quality rating based on gas resistance
String getAirQuality(uint32_t gasResistance) {
  uint32_t kOhm = gasResistance / 1000;
 
  if (kOhm >= 300) {
    return F("Very Good");
  } else if (kOhm >= 150) {
    return F("Good");
  } else if (kOhm >= 50) {
    return F("Moderate");
  } else if (kOhm >= 10) {
    return F("Poor");
  } else {
    return F("Very Poor");
  }
}

I²C topics on lamaPLC

PageDateTags
2026/04/23 21:51, , , , , , ,
2025/09/23 21:25, , , , , ,
2026/03/22 03:14, , , , , , ,
2026/04/23 21:52, , , , , , , , ,
2026/04/23 21:52, , , , , , , , , , , , ,
2026/03/28 23:50, , , , , , ,
2026/04/12 00:34, , , ,
2026/04/23 21:52, , , , , , , , , , , , , ,
2026/04/23 21:52, , , , , , , , , , ,
2026/04/23 21:52, , , , , , , , , ,
2026/03/22 00:08, , , , , , , , , , ,
2026/04/23 21:52, , , , , , , , , , ,
2026/04/23 21:52, , , , , , , ,
2025/05/31 23:32, , , , , , , ,
2026/04/23 21:52, , , , , , , , , , , , , ,
2025/11/22 00:07, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
2023/07/01 17:29, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
2026/03/22 01:44, , , , , , , , ,
2026/04/23 21:52, , , , , , , , ,
2026/04/23 21:52, , , , , , , , , , , , , , , ,
2026/04/23 21:51, , , ,
2026/04/23 21:52, , , , , , , , , , , , , , , , , , , , , , , , ,
2026/04/11 19:54, , , , , , , , , , , , , , , , , , ,
2026/04/23 21:52, , , , , , , , , , ,
2026/02/14 18:27, , , , , , , , , ,
2026/04/23 21:52, , , , , , ,
2026/04/23 21:52, , , , , , , ,
2026/04/23 21:52, , , , , , , ,
2026/04/23 21:52, , , , , , , , , , , , ,
2026/04/15 19:41, , , , , , , , , , , , , , , ,
2026/04/23 21:52, , , , , , , , , , , , , ,
2026/02/14 23:47, , , ,
2026/02/14 23:51, , , , , ,
2026/02/14 18:26, , , ,
2026/04/23 21:52, , , , , , , , , , , , ,
2026/04/23 21:52, , , , , , , , , , ,
2026/04/23 21:52, , , , , , , ,
2026/03/05 21:19, , , , , , , , , , , , , , , , ,
2026/02/14 18:27, , , , , , ,



This page has been accessed for: Today: 4, Until now: 5