Skip to content

guide

The Fleet: Three climate sensors that end the thermostat argument — Build Guide

Wire three ESP32s with BME280 sensors and graph temperature, humidity and pressure per room. Finally settle why the office runs three degrees hotter.

· 13 min read

Devs At Home is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program. We earn from qualifying purchases. This never affects what we recommend or what we say about it.

Three ESP32 dev boards, three BME280 atmospheric sensors and one dashboard settle the thermostat argument with logged temperature, humidity and pressure data from every room. You'll spend a weekend soldering headers, flashing firmware and copying YAML, then never wonder again why the office feels five degrees warmer than the hallway claims.

Key points

  • Each sensor node costs the price of an ESP32 dev board and a BME280 atmospheric sensor module — the ELEGOO 3PCS ESP-32 Dev Boards and HiLetgo BME280 modules cover three rooms.
  • ESPHome compiles to Arduino-compatible firmware without writing C++, and Home Assistant graphs the data in real time once the sensors report over WiFi.
  • The BME280 reads temperature accurate to half a degree Celsius, humidity to within three per cent, and barometric pressure — enough to see the door open from another room.
  • You'll need three USB power sources you already own, somewhere to run Home Assistant, and four dupont jumper wires per sensor to connect I²C lines without permanent soldering.
  • The build stalls at WiFi credentials in the YAML and at finding each sensor's I²C address — both fixed in under ten minutes with a serial monitor open.
  • Once running, the fleet logs microclimates you didn't know existed: the corner that's always humid, the room that swings six degrees when sun hits the window, the draft under the door you've been ignoring.

What you are building and why it is worth one weekend

Three ESP32 microcontroller boards, each wired to a BME280 environmental sensor, report temperature, humidity and atmospheric pressure to a central dashboard over your home WiFi. The dashboard graphs all three rooms on one screen. You'll see which room actually runs hot, how opening a window changes humidity in thirty seconds, and whether the convector heater in the corner does anything beyond the two-metre mark.

This is not home automation. Nothing turns on or off. You're building a measurement rig that logs environmental data every few seconds and makes it visible. The value is ending speculation. Your partner says the office is fine. The thermometer on your desk says twenty-four. The hallway thermostat says twenty. This fleet tells you the office hits twenty-six by three in the afternoon when sun angles through the south window, and the BME280 barometric sensor picks up the pressure drop when someone opens the front door two rooms away.

The weekend breaks into three evenings. First evening: solder pin headers onto the ESP32 boards and BME280 modules if they shipped without them, flash ESPHome firmware to all three boards, connect one sensor and confirm it reports data. Second evening: wire the remaining two sensors, mount them in rooms, get all three reporting to Home Assistant. Third evening: tune the dashboard, set up history graphs, and leave it running. If you've soldered before and run a Raspberry Pi, the first sensor reports within two hours.

The parts list: what each item in the kit does

Component Quantity Role Specification that matters
ELEGOO 3PCS ESP-32 Dev Boards 3 WiFi-enabled microcontroller runs firmware, connects to network, reports sensor data Dual-core 240MHz, built-in WiFi, USB programming interface, 3.3V output for sensor power
HiLetgo BME280 3.3V Atmospheric Pressure Sensor module 3 Measures temperature, humidity and barometric pressure, communicates over I²C bus Temperature ±0.5°C accuracy, humidity ±3% accuracy, pressure ±1hPa accuracy, I²C address 0x76 or 0x77
Dupont jumper wires from REXQualis Electronics Component Fun Kit 12 wires total Connect BME280 I²C and power lines to ESP32 GPIO pins without soldering Female-to-female for modules with headers soldered, male-to-female if one side lacks headers
USB power adapters (supplied by you) 3 Power each ESP32 board continuously 5V, any current rating above 500mA works — phone chargers are fine
Micro-USB cables (supplied by you) 3 Connect ESP32 to power and to your computer for flashing firmware Data-capable cables, not charge-only

The REXQualis Electronics Component Fun Kit supplies dupont wires, a breadboard you won't need for this build, and a power supply module you also won't need because the ESP32 outputs 3.3V directly. You're buying it for the wire assortment. If you already own jumper wires, skip the kit.

What you supply yourself, honestly

Three USB power sources live in the drawer of old phone chargers. Any 5V adapter works. The ESP32 draws under 200 milliamps when idle and reporting, so even a weak charger powers it. You'll also need three micro-USB cables that carry data, not just power. Test by plugging one into your computer and confirming the ESP32 shows up as a serial device before you flash firmware to all three boards.

Somewhere to run Home Assistant: an old laptop that stays on, a Raspberry Pi 3 or newer, or the NAS that's already running Portainer. Home Assistant runs in Docker or as a dedicated install. It's the dashboard that receives MQTT or API reports from each ESP32 and graphs them. The Pi needs at least 2GB of RAM. A laptop with 4GB works fine if it's not doing much else.

A soldering iron if the boards and sensors ship without headers. The ELEGOO ESP-32 boards and HiLetgo BME280 modules often arrive bare, with loose pin headers in the bag. You'll solder two rows of pins onto each ESP32 and a single row onto each BME280. If you've never soldered, this is where the build becomes a two-weekend project — the first weekend is learning to solder pin headers without bridges.

The build, in numbered phases sized to an evening each

Phase one: flash the first ESP32 and connect one sensor

Install ESPHome on the machine that will host Home Assistant. If you're running Home Assistant already, ESPHome installs as an add-on from the Supervisor panel. If you're setting up Home Assistant for the first time, follow its getting-started guide first — that's its own hour.

Plug the first ESP32 into your computer with a micro-USB cable. Open ESPHome and create a new device. Name it something that identifies the room: office-climate, bedroom-sensor, kitchen-env. ESPHome generates a YAML configuration file. You'll see a template with WiFi credentials blank and an API key generated. Fill in your WiFi SSID and password. Leave the API key as it is.

Add the BME280 sensor block to the YAML. Copy this exactly:

i2c:
  sda: 21
  scl: 22

sensor:
  - platform: bme280
    temperature:
      name: "Office Temperature"
    pressure:
      name: "Office Pressure"
    humidity:
      name: "Office Humidity"
    address: 0x76
    update_interval: 10s

The I²C lines SDA and SCL default to GPIO pins 21 and 22 on the ESP32. The address 0x76 is the BME280's usual I²C address. If your module uses 0x77 instead, you'll find out in a moment when the sensor doesn't appear. The update interval of ten seconds is fast enough to see changes in real time without flooding the network.

Click Install, select the USB port where the ESP32 appeared, and let ESPHome compile and flash the firmware. First compile takes three minutes. The board reboots when done. If the ESP32 connects to WiFi, ESPHome shows it online in the devices list.

Wire the BME280 to the ESP32 using four dupont jumper wires. Connect BME280 VCC to ESP32 3.3V. Connect GND to GND. Connect SDA to GPIO 21. Connect SCL to GPIO 22. The pins are labelled on both boards. If the BME280 doesn't report data, open the ESPHome logs for that device. Look for "I²C device not found at address 0x76". Change the YAML address line to 0x77, re-flash, and check again.

Once the sensor reports, Home Assistant shows three entities: office temperature, office pressure, office humidity. Add them to a dashboard card. You've got one node running.

Phase two: replicate to two more nodes

Flash the second ESP32 with a new ESPHome device config. Name it for the second room. Copy the YAML from the first node and change the sensor names: "Bedroom Temperature", "Bedroom Pressure", "Bedroom Humidity". Flash, wire the second BME280 the same way, power it from a USB adapter in the bedroom. Repeat for the third node in the third room.

You now have three sensors reporting. Place them at desk height or higher — warm air stratifies, and a sensor on the floor reads two degrees cooler than the air you're sitting in. USB cables are short, so position each node near a power outlet. The ESP32 and sensor together fit in a small plastic enclosure if you want them out of sight, but they're small enough to leave bare on a shelf.

Phase three: dashboard and history

Create a Home Assistant dashboard with a history graph card. Add all nine entities: three temperatures, three humidities, three pressures. Set the time range to 24 hours. You'll see all three rooms on one graph, colour-coded per room. Overlay the lines or split them into separate rows depending on how much you care about comparing pressure across rooms.

Enable Home Assistant's recorder integration if it's not already on. This logs sensor values to a database so you can scroll back and see what the office temperature was doing last Tuesday at four. The default retention is ten days. Increase it to a month or more if you want long-term trends.

Add automation if you want alerts. Home Assistant can send a notification when any room crosses a threshold: "Office over 25°C" or "Bedroom humidity above 60%". That's optional. The point of the build is the graph, not the alerts.

Where this build actually stalls, and how to get unstuck

WiFi credentials in the YAML are where half the failures happen. If you copied the SSID wrong by one character, the ESP32 boots but never appears online. Connect the board to your computer, open the serial monitor in ESPHome, and watch the boot log. You'll see "Connecting to WiFi" then either success or repeated failures. If it fails, the SSID or password is wrong. Fix the YAML and re-flash.

The BME280 not appearing at either I²C address 0x76 or 0x77 is the other common stall. Check the wiring first: SDA to GPIO 21, SCL to GPIO 22, VCC to 3.3V, GND to GND. If the wires are right and the sensor still doesn't show, try a different BME280 module. Some modules ship with 0x77 hardwired, some with 0x76, and some with a solder jumper you have to bridge to change the address. The HiLetgo modules default to 0x76.

Home Assistant not showing the entities means the API key didn't match. When you add an ESPHome device to Home Assistant, it prompts for the API encryption key from the YAML. If you skip that step or paste the wrong key, the ESP32 connects but the entities don't appear. Delete the device from Home Assistant, re-add it, and paste the correct key from the YAML.

Sensors reporting wildly wrong values — temperature ten degrees high, humidity at 100 per cent — usually means the BME280 is overheating or too close to the ESP32's voltage regulator. Move the sensor a few centimetres away with longer jumper wires. The ESP32 itself runs warm under load. If the BME280 sits directly on top of it, you're measuring the board temperature, not the room.

Safety, etiquette and the cleanup that keeps you allowed to do this again

The ESP32 and BME280 both run at 3.3V. There's no mains voltage and nothing that gets hot enough to ignite. The USB power adapters are the only part with mains voltage inside, and they're sealed. Don't open them. The worst case is a short circuit between 3.3V and GND on the breadboard if you misplace a wire, which resets the ESP32 but doesn't damage it.

If you're running this in a home you share, warn people that three small boards will stay plugged in permanently and that they're not broken or abandoned. Label them with tape and a marker if that helps. A housemate unplugging one to charge a phone ends your data continuity.

Clean up the soldering bench before you finish. Put the iron away cool. Throw out the flux-soaked paper towel. Coil the leftover wire. Return borrowed tools. This is how you stay allowed to start the next project without negotiation.

Ways to take it further once the base build works

Add more nodes to cover the garage, the attic, the shed — anywhere you've wondered whether it's too cold to work in winter or too hot in summer. ESPHome supports dozens of sensors beyond the BME280. Swap in a DHT22 for temperature and humidity only if you don't care about pressure, or add a BH1750 light sensor to log how much daylight each room gets.

Log CO₂ with an SCD30 or SCD40 sensor. Carbon dioxide concentration tells you when to open a window better than any humidity or temperature reading. The SCD40 costs more than the BME280 but wires the same way and ESPHome supports it with one YAML block.

Export the data to Prometheus or InfluxDB if you want long-term storage outside Home Assistant's database. Both integrate with ESPHome. You can then query trends over months, compare seasonal patterns, or just keep the data after you rebuild the Home Assistant install.

Add a small OLED display to each node so the temperature shows on the device itself without opening the dashboard. The SSD1306 OLED is common, cheap, and supported in ESPHome. You'll see the current reading when you walk past the sensor, which turns out to be more useful than you'd think.

Final recommendation and who this is not for

Build this fleet if you've been arguing about temperature settings for six months and want data instead of opinions. The BME280 logs accurately enough to prove which room runs hot, which is drafty, and whether closing the door actually helps. You'll spend a weekend and end the speculation.

Skip it if you've never soldered and aren't interested in learning, or if you don't have somewhere to run Home Assistant continuously. A Raspberry Pi that you turn off at night defeats the point. Skip it also if you only care about one room — buy a single Bluetooth thermometer and check it on your phone. The value here is multiple rooms logged together, not one data point.

Common questions

Can I use an Arduino instead of an ESP32?

You can, but you'll lose the WiFi and need a wired connection to log data. The Arduino Uno or Nano reads the BME280 over I²C the same way, but getting that data to a central dashboard means either an Ethernet shield, an SD card logger, or a USB cable back to a computer. The ESP32 costs less than an Arduino plus an Ethernet shield and has WiFi built in.

Do I need to know C++ to flash the firmware?

No. ESPHome compiles YAML configuration into Arduino-compatible firmware without you writing C++ or opening the Arduino IDE. You copy a sensor block into a YAML file, click Install, and ESPHome handles the rest. If you want to modify the firmware beyond what the YAML supports, then you're back in C++, but the base build doesn't need it.

How accurate is the BME280 compared to a proper weather station?

The BME280 measures temperature within half a degree Celsius and humidity within three per cent, which matches consumer weather stations that cost five times as much. Barometric pressure is accurate to one hectopascal. For indoor climate monitoring, it's more than good enough. If you need laboratory-grade accuracy, you're buying a calibrated instrument with a certificate, not a sensor module.

Will this work if my WiFi router is two rooms away?

It depends on the walls and the router. The ESP32 WiFi radio is adequate but not strong. If your phone holds a connection in that room, the ESP32 probably will too. If the connection is marginal, the ESP32 drops offline and reconnects every few minutes, leaving gaps in the data. Move the router closer or add a WiFi extender before you start the build.

Can I power all three boards from one USB adapter with a splitter cable?

You can, but don't. Three ESP32s running WiFi can pull 600 milliamps combined, and cheap splitter cables have thin wire that drops voltage. Each board also reboots independently when the firmware updates, and a shared power source means one board restarting can glitch the others. Use three separate adapters.

What happens if I flash the wrong firmware to a board?

Nothing permanent. Re-flash the correct firmware and the board recovers. The ESP32 bootloader sits in read-only memory and can't be overwritten by normal flashing. Worst case, you flash firmware that doesn't boot, the board shows up as a USB serial device, and you flash again. You'd have to deliberately brick it with low-level tools to cause real damage.

How much does the ESP32 add to the electricity bill?

Each ESP32 with a BME280 draws about 0.15 watts idle. Three nodes running continuously use 1.1 kilowatt-hours per month. At typical domestic electricity rates, that's negligible — the cost of leaving a phone charger plugged in with nothing attached.

Do I need to calibrate the sensors after I assemble them?

Not for relative comparisons. The BME280 ships calibrated from the factory and stores calibration data in its internal EEPROM. If all three sensors read 23°C in the same room, they're consistent. If you need absolute accuracy, compare one sensor against a certified reference thermometer and note the offset, but for settling the thermostat argument, relative readings are what matter.

One email a week

New reviews, teardowns and the occasional deal worth knowing about. No spam, unsubscribe any time.