About

This project is a digital light meter used for metering photos. There were two goals in mind when building this:

  1. Let the user track the camera settings for each shot they've taken on a film camera
  2. Correctly meter for a scene based on a desired shutter speed or aperture

Parts

diagram

Some connections aren't shown for simplicity

Libraries Used

BH1750 Adafruit_SSD1306 ArduCAM/Arduino

Results

The final product allows the user to set information about their camera's conditions (like ISO or lens focal length) which persists on the SD card across boots.

When in use, the user can set a desired shutter speed or aperture and the corresponding value will be calculated and displayed.

They then can hit record and the shot metadata along with a reference photo captured by the OV2640 will be saved to the SD card under the corresponding shot number.

Screens

Startup

boot screen

On startup, the following values are read from storage and displayed

Main Screen

main screen ss prio

shutter speed priority mode

main screen apt prio

aperture priority mode

Settings

settings screen The settings screen allows the user to set the ISO value, lens focal length, illuminance constant, shot number, and list files on SD card. settings screen ISO

Adjusting the ISO from settings

settings screen ls all

Listing the contents of the microSD card from settings

History

The history screen allows the user to view the shots they've taken and see the contents of each shot history overview history detail

Build

Here are images of the light meter device.

front back side

The front and back panels were 3d printed and the remaining sides were laser cut from the following design case design

Film

To test this device, I shot a roll of Porta 400 film, pushed 1 stop to ISO 800, and metered with this device. Below are two examples from that roll.

Example Shot 1

photo under bridge reference

reference photo from light meter

photo under bridge

resultant photo

ISO 800
CVAL 250
F_LEN 28
PRIO SS
APT 3.50
SS 1/250.00
LUX 1050
EV_ACTUAL 11.71
EV_CALC 11.58
EV_DELTA 0.13

shot settings from light meter

Example Shot 2

bridge photo reference

reference photo from light meter

bridge photo

resultant photo

ISO 800
CVAL 250
F_LEN 28
PRIO SS
APT 8.00
SS 1/250.00
LUX 6585
EV_ACTUAL 14.36
EV_CALC 13.97
EV_DELTA 0.40

shot settings from light meter

Demo Video

Youtube Link

Emulator Work

Preservation emulator planning and progress are documented in:

Current one-command dev entrypoint:

./scripts/start-emulator-dev.sh

Contract guard for emulator assumptions:

./scripts/check-firmware-emulator-contract.sh

Local Renode launch attempt (after firmware build):

./scripts/run-renode-local.sh

Docker Renode launch (build + run in container):

./scripts/run-renode-docker.sh

Force x86_64 container execution:

./scripts/run-renode-docker-amd64.sh

Host-local fallback:

./scripts/start-emulator-dev.sh
./scripts/run-renode-local.sh

Framebuffer source:

./scripts/run-renode-framebuffer-source.sh

Real Renode-backed source implementation TODOs:

Retrospective

Iterative process

Phases

There were three major phases of this project.

  1. The breadboard phase breadboard image In this phase, every electrical connection was extremely fragile. The device stayed like this for a long time as the software was built out.

  2. The cardboard case cardboard case image This was a good way to estimate the dimensions for the final case and assess the overall feel of the device. In this phase, I was also able to calibrate the calculations as I was able to test a wider variety of conditions

  3. The final case

This is the current state of the project and the images can be seen under build.

Things that didn't work

  1. Using CircuitPython CircuitPython looked to be an easy to use alternative to developing with the Arduino tools but the display library for the SSD1306 immediatly used all the available memory on the feather m0.
  2. Displaying images on screen I really wanted to display the reference images on screen when capturing the image or viewing image history. However, that would require converting the stored JPG to a BMP image, converting each RGB pixel of the BMP image into a single grayscale value, and finally scaling the image down to fit on the 128x32 display. Due to time constraints and minimal ROI, this was scrapped.
  3. 3D printing the correct dimensions The resultant case for this device is partially hand carved because, no matter how many times I measured, the parts didn't fit well into the case. This mixed with the 4 hour printing prevented me from iterating as much as I wished.

Skills learned

References

There were a couple of projects online that used the BH1750 light meter to assess lighting conditions but I only found one that calculated camera settings based on the input value, linked here.

The following wikipedia articles gave me the formulas used for camera setting calculations Light meter Illuminance