About
This project is a digital light meter used for metering photos. There were two goals in mind when building this:
- Let the user track the camera settings for each shot they've taken on a film camera
- Correctly meter for a scene based on a desired shutter speed or aperture
Parts
- Adafruit Feather m0
- built in microSD reader
- built in battery support
- built in serial over microUSB
- BH1750 Light Sensor
- SSD1306 OLED Display
- ArduCAM OV2640 2MP Plus

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

On startup, the following values are read from storage and displayed
- ISO value
- Lens focal length
- Shot number
- Battery percentage
- Battery charge bar
Main Screen

shutter speed priority mode

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

Adjusting the ISO from settings

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

Build
Here are images of the light meter device.
The front and back panels were 3d printed and the remaining sides were laser cut from the following 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
reference photo from light meter

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
reference photo from light meter

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
Emulator Work
Preservation emulator planning and progress are documented in:
docs/emulator-work-checklist.mddocs/hardware-firmware-compatibility.mddocs/emulator-runbook.md
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:
docs/renode-framebuffer-source-todos.md
Retrospective
Iterative process
Phases
There were three major phases of this project.
The breadboard phase
In this phase, every electrical connection was extremely fragile. The device stayed like this for a long time as the software was built out.The cardboard case
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 conditionsThe final case
This is the current state of the project and the images can be seen under build.
Things that didn't work
- 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.
- 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.
- 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
- How to 3D print
- How to laser cut
- The math behind photography exposure
- Designing software on a constrained device
- Making necessary compromises to get to the final product
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