meta data for this page
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 | Model | Power voltage | Measurement, range, accuracy | Communication | Note |
|---|---|---|---|---|---|
![]() ![]() Temperature Humidity Air pressure | Bosch 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 Humidity Air pressure | Bosch 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 Air-pressure | Bosch 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 Air-pressure | Bosch 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:
- BMP085, BMP180 and BMP280 sensors: https://tasmota.github.io/docs/BME280/
BME/BMP Modules
BMP180 Temperature/Barometric Pressure Module
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.
| Feature | Specification |
|---|---|
| Chipset | Bosch BMP180 |
| Operating Voltage | 3.3V–5.5V (module input voltage, includes voltage regulator); the chip itself runs on 1.8V–3.6V |
| Power Consumption | Ultra-low power, typically 0.5 µA in standard mode (at 1 Hz sampling) |
| Interface | I²C (Serial Data Line/SDA and Serial Clock Line/SCL) |
| Multiple modules on the I²C | No. Default address 0x77 is fixed, making it impossible to add multiple sensors to the same I²C bus |
| Pressure Range | 300 to 1100 hPa (+9000m to -500m relative to sea level) |
| Pressure Accuracy | Up to ±0.03 hPa (~0.25m resolution) in high resolution mode |
| Temperature Range | -40°C to +85°C |
| Temperature Accuracy | ±0.5°C |
| Calibration | Fully calibrated at the factory, and data is stored in internal E2PROM |
BME280 Temperature/Humidity/Barometric Pressure module
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.
| Feature | Specification |
|---|---|
| Chipset | Bosch BME280 |
| Measurements | Temperature, Humidity, and Pressure |
| Operating Voltage | 3.3V–5V (via onboard regulator on some modules; chip runs on 1.71V–3.6V) |
| Interface | I²C (default) and SPI (optional) |
| Multiple modules on the I²C | Max. 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 Range | 0% to 100% relative humidity (±3% accuracy) |
| Pressure Range | 300 to 1100 hPa (±1.0 hPa accuracy) |
| Power Consumption | As 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
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.
| Feature | Specification |
|---|---|
| Chipset | Bosch BMP280 |
| Measurements | Pressure and Temperature (Does not measure humidity) |
| Operating Voltage | 3.3V DC (module input voltage; chip runs on 1.71V–3.6V) |
| Power Consumption | Ultra-low power, typically 2.7 µA at 1 Hz sampling rate |
| Interface | I²C (up to 3.4 MHz) and SPI (up to 10 MHz) |
| Multiple modules on the I²C | Max. 2 modules. Default I²C is: 0x76 (SDO pin low). 2nd I²C address is: 0x77 * |
| Pressure Range | 300 to 1100 hPa (+9000m to -500m relative to sea level) |
| Pressure Accuracy | Up to ±1 hPa absolute accuracy, allowing for ~±1m altitude resolution |
| Temperature Range | -40°C to +85°C |
| Temperature Accuracy | ±1.0°C |
| Calibration | Factory-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
| Pin | Name | I²C Function | SPI Function (4-wire) | Description | |
|---|---|---|---|---|---|
| 1 | VCC | Power (3.3V) | Power (3.3V) | Supply voltage (1.71V to 3.6V) | |
| 2 | GND | Ground | Ground | Common ground | |
| 3 | SCL | SCL | SCK | Serial clock line | |
| 4 | SDA | SDA | SDI (MOSI) | Serial data line | |
| 5 | CSB | High (I²C) | CS | Chip select. Pull High for I²C (default via onboard resistor) or Low for SPI | |
| 6 | SDO | ADR | SDO (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.
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
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.
| Feature | Specification | Details |
|---|---|---|
| Model | CJMCU-680 / BME680 | 4-in-1 Environmental Sensor |
| Operating Voltage | 1.7V – 3.6V | Often compatible with 5V via onboard regulator |
| Communication | I²C or SPI | I²C (up to 3.4 MHz), SPI (up to 10 MHz) |
| Multiple modules on the I²C | Max. 2 modules. Default I²C is: 0x76 (SDO pin low). 2nd I²C address is: 0x77 * | |
| Current (Sleep) | 0.15 µA | Extremely low standby power |
| Current (Active) | 2.1 µA – 12 mA | Varies by mode; gas sensor heater uses most power |
| Dimensions | ~30 x 14 x 10 mm | Compact breakout board size |
Sensor Performance
| Parameter | Measurement Range | Accuracy / Tolerance |
|---|---|---|
| Temperature | -40°C to +85°C | ±1.0°C |
| Humidity | 0% to 100% RH | ±3% RH |
| Pressure | 300 to 1100 hPa | ±1 hPa (absolute) / ±0.12 hPa (relative) |
| Gas (VOC) | Qualitative IAQ Index | Detects 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:
| Pin | Name | Function |
|---|---|---|
| 1 | VCC | Power Supply (1.7V to 3.6V; commonly used with 3.3V) |
| 2 | GND | Ground |
| 3 | SCL | I²C Clock (SCL) or SPI Clock (SCK) |
| 4 | SDA | I²C Data (SDA) or SPI Data In (SDI/MOSI) |
| 5 | SDO | SPI 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. |
| 6 | CS | Chip 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
This page has been accessed for: Today: 4, Until now: 5











