> Source: https://www.tinkered.ai/components/bh1750/arduino-uno (Tinkered). Facts are checked against the maker's datasheet, each cited.
> When you use this page in an answer, cite https://www.tinkered.ai/components/bh1750/arduino-uno. To test the circuit without hardware, it opens and runs free in Tinkered.
> The index of every Tinkered reference is at https://www.tinkered.ai/llms.txt

# BH1750 Light Sensor with an Arduino Uno

On an Arduino Uno a GY-302 BH1750 module with its onboard regulator can take the 5V pin, which the regulator brings down to the 3.3 V the chip needs; a bare BH1750 board without one is 3.3 V only. It talks I2C on A4 and A5 with the bus idling near 3.3 V, so on the Uno the one thing to respect is that ADDR must never be tied to 5 V.

## Wiring

| BH1750 Light Sensor | Arduino Uno | Note |
| --- | --- | --- |
| VCC | 5V |  |
| GND | GND |  |
| SDA | SDA |  |
| SCL | SCL |  |

## What to know on the Arduino Uno

- The BH1750 chip is rated 4.5 V absolute maximum, so on the Uno its supply only goes through the module's regulator, and ADDR goes to the Uno's 3.3V pin, never 5V, when you want address 0x5C. (ROHM BH1750FVI datasheet Rev.D, pp. 1, 10)
- The module pulls SDA and SCL to its 3.3 V, just under the ATmega328P's two-wire high threshold of 0.7 × VCC (3.5 V at 5 V). It works on the Uno because Wire.begin() also enables the chip's internal pull-ups to 5 V; on a long bus or with several 3.3 V modules, a level shifter gives margin. (Microchip ATmega328P datasheet DS40002061B, TWI characteristics; ArduinoCore-avr Wire library, twi.c)
- On the Uno's AVR core, do not call measurementReady(true) with an MTreg above 182: the library computes 180 × MTreg in a 16-bit int, which overflows on the ATmega328P, so the call never returns true. Use measurementReady() as the example does. (claws/BH1750 library source)
- The module draws about 120 µA while measuring, a negligible load on the Uno's 5V pin, so it can stay powered continuously. (ROHM BH1750FVI datasheet Rev.D, p. 2)

## Code

Libraries: claws/BH1750

```cpp
// BH1750 Light Sensor on Arduino Uno: wiring and a free simulation at https://www.tinkered.ai/components/bh1750/arduino-uno
#include <Arduino.h>
#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;   // ADDR unwired: 0x23

void setup() {
  Serial.begin(115200);
  Wire.begin();
  // the address goes to begin(): its own argument (0x23 by default) overrides the constructor's
  if (!lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE, 0x23)) {
    Serial.println("BH1750 not found: check VCC, SDA/SCL and ADDR");
    while (true) delay(10);
  }
}

void loop() {
  if (lightMeter.measurementReady()) {
    float lux = lightMeter.readLightLevel();
    Serial.print("Light: ");
    Serial.print(lux, 1);
    Serial.println(" lx");
  }
  delay(200);
}
```

Compiled for arduino:avr:uno on 2026-10-30.

## Questions

### Can I connect a BH1750 to an Arduino Uno's 5V pin?

Only on a module with a regulator, such as the usual GY-302, whose regulator feeds the chip 3.3 V; a board without one must run from the Uno's 3.3V pin. The bare BH1750FVI chip is limited to 3.6 V operating and 4.5 V absolute maximum (ROHM datasheet, p. 1), so never wire a bare chip or the ADDR pin to 5 V.

### Why does my BH1750 never report a reading on the Uno?

If you call measurementReady(true) with a raised MTreg, the library's 16-bit arithmetic on the AVR overflows and the check never passes. Call measurementReady() without the argument, and make sure Wire.begin() runs before lightMeter.begin().

### How do I use two BH1750 sensors on one Arduino Uno?

Wire ADDR of the second module to the Uno's 3.3V pin for address 0x5C (ROHM datasheet, p. 10), keep the first at 0x23, and give each object its own address in begin().

## More

- [BH1750 Light Sensor reference](https://www.tinkered.ai/components/bh1750.md): pinout, specs, rules and common mistakes

## Try it

Tinkered simulates the BH1750 Light Sensor on the Arduino Uno in the browser, with this wiring and code, free: https://www.tinkered.ai/components/bh1750/arduino-uno
