This article is about the construction of a 'Do It Youself' (DIY) f-stop darkroom timer.


Some time ago I decided to find a replacement for my old mechanical darkroom timer. I was immidiately suprized by the cost of buying a new one, so I decided to build my own instead. Of course, one seldoms earn any great money on such decision, but it is a creative process and one ends up with a device tailored for ones needs.

Some criterions that were important for me while sketching on the design were:

  • a nice price for value
  • feature rich
  • easily upgradeable
  • easy to operate
  • compact in size

At the time of writing this article, my timer has the following features:

  • f-stop timer mode
  • test strip mode
  • burn mode
  • manual exposure mode
  • foot-pedal switch
  • metronome

The main unit can be seen in Figure 1 below:

f-stop timer

Figure 1: The f-stop timer main unit



I wanted a small and handy f-stop timer. Therfore, the power-switch (a solid state relay that switches the 240 VAC on and off) was built  in a separate unit, connected to the main unit via a thin and flexible cable (see Figure 2 and Figure 3). There is an USB-connection on the side of the main unit (see Figure 4),  to enable easy upgrade of the timers firmware, more on this later.

f-stop timer, connected

Figure 2: The f-stop timer main unit with all perifials connected. The black box on top of the image is the power-switch unit. To the left of the main unit is a foot pedal.



Figure 3: Backside of the main unit. A RCA-connection to the power switch unit, a phono-plug to the foot pedal, and the main units on/off switch.



Figure 4: USB-connection for easy upgrade with new firmware.


Internal Hardware

The interior of the f-stop timer is shown in Figure 5-6. The design is built upon an Arduino-board.  For those with interest in electronics: Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It is based on a 8-bit Atmel AVR microcontroller. The Arduino-board is equipped with voltage regulators, USB-interface, I/O-ports etc.



Figure 5: The f-stop timer from within. In the lid (left), a 2x16 character LCD-display is fitted. In between all buttons, one can also spot a speaker to enable audiable output (=metronome). In the bottom part of the case (right), one can see the Arduino micro-computer platform (blue circuit board). Below and to the left of the Arduino board is a 'priority bit encoder'  that handles the key-pad. Immidiately below the Arduino is a small circuit  that enable contrast and backlight level adjustment of the LCD.



Figure 6: A Close-up on the circuitry described in figure 5.



The micro controller on the Arduino platform can be programmed using the Arduino Programming Language, which is based on Wiring. Essentially, both the Arduino Programming Language and Wiring are C/C++.

The AVR chip on the microcontroller has been pre-programmed with a bootloader, making it possible to download new firmware to the Arduino via a standard USB-cable connected to your PC/MAC/Linux computer. No extra hardware is needed to program the chip.

The power of the C++ language and the ease of uploading new code to the chip makes it extraordinary simple to extend the functionality of the f-stop timer whenever you feel you it should have another feature. Great! For example: I did not bother to include an exposure meter in my design. If anyone feel such a need, it is just to hook up a light-sensitive sensor to any of the analog inputs available on the Arduino and write a few lines of code to read the sensor values.

The firmware currently include four different modes of operation:

Normal mode:

You set the exposure time in f-stops. The LCD displays the corresponding time in seconds. Increments and decrements of the exposure time are made in steps of either {1/1, 1/2, 1/3, 1/6, 1/10} full stops. When you press go, the exposure starts and the current exposure time is shown on LCD. During exposure, a metronome beep every full second.

Figure 7: Normal mode LCD

Strip mode:

In strip mode you can either choose to exposure each strip with a full individual exposure, or you can start by first making an exposure to the whole sheet of paper, and then cover-up strips sequentially and make small additive exposures. In both cases you set the base exposure and the number of strips you want to make. You also set the difference in exposure that you want between each strip. On each press on go, the timer expose the next strip by the correct time and also show on LCD how many strips that remains to make.

Figure 8: Strip mode LCD

Figure 9: Strip mode LCD

The example given by Figure 9 will result in the following exposure sequence:

4.00 - 2/3 4.00 - 1/3 4.00 4.00 + 1/3 4.00 + 2/3

Burn mode:

In burn mode, you can simplify the burn-in of details in a print. You set the additional amount of burn-in you wish to make, in stops relative to the base exposure. The timer automatically calculate, and shows on LCD, the corresponding burn-in time. A press on go starts the burn in exposure.

Figure 10: Burn mode LCD

Manual Mode:

In manual mode, the exposure is controlled manually by the user. Ther are two different ways to expose: (1) the light is toggled on and off on every tap on the go-button (or equivalently on the foot pedal). (2) The light is on as long as you press down to go-button / foot-pedal. In both cases, the timer show the acumulated exposure time on LCD and make a beep every second.

Figure 11: Normal mode LCD


How to make your own

Within short, I intend to extend this article and publish source code to the firmware and include sketches on the circuitry.

Update (January 2015):

Readers interested in building their own f-stop timer are encouraged to do so. It is free to use my design as it is, or to make further improvements to it, as long as it is for non-profit and non-commercial purposes. I take no liability for any damage or injuries that might come with following my design and/or using my firmware. I can not guarante that the source code is free from errors or that the circuity is properly designed and dimensioned. However, I have used the timer for many hours in the darkroom without noticing any bad or odd behaviours.

An outline of the circuitry is illustrated in figure 11 below. The design basically consists of:

  • An Arduino base board
  • A standard 16x2 LCD display. A trimpot is used to set the contrast of the display. The intensity of the LCD's back-light is controlled by the firmware (PWM) and via a transistor drive.
  • A speaker: to enable audiable metronome output.
  • A priority bit encoder: to handle the push-button's and to spare some pins on the Arduino base board.
  • A solid-state relay: To safely interface with the mains of the enlarger. I strongly advice to implement this interface in a careful and safe manner!



Figure 11: Basic outline of the circuitry. Note that this schematic is not 100% complete.

The firmware's source code and an outline of the schematics are available for download (License GPLv2), see below. Note that the firmware has been slightly updated over the years that I have been using the timer. The current firmware do not correspond to 100% with the 'screen shots' shown above. A bit of warning, the source code is not very well documented. There is currently no 'operators manual' on how to use the timer.

  • Guest - jean

    I love this project and am interested tpo build a timer based on your instructions.
    I sometimes need very long exposure time (10mn), what is the longuest exposure time possible with this timer ?

    0 Like Short URL:
  • Hi Jean, and thank you for showing interest in this project.
    The maximum exposure time is limited by the firmware. In the current firmware I believe my code allow for 9.9 f-stops (to save me from using an extra digit on the display). This would correspond to 1*2^(9.9) = 955 sec = 16 min. If you need longer exposures it should be fairly easy to adapt the firmware code. Alternatively, you can always run a sequence of "shorter" exposures for say 5min each.
    Best regards

    0 Like Short URL:
  • Guest - Phil Zimmermann

    I try to build this timer, but I have poblem with the part 74LS148N, this coder won't work.
    Do you have an updated version ? or new schematic ?

    0 Like Short URL:
  • Hi Phil,

    I am sorry to hear that you are having problems. I cannot recall that I had any problems with the priority-bit-encoder (74LS148N). I have no updated version or schematic, but the schematic and code published here should correspond to the timer I am currently using. Can you perhaps describe the problem, how does it show up?



    0 Like Short URL:
  • Guest - Phil Zimmermann

    Hello Henrik
    I go deep in my old electronic knowledge....
    The pin D8 (Arduino) has to be connected to RS (LCD)
    The pin EI on 74LS158N has to be connected to GND
    Ans now it's working nice.

    from Switzerland
    0 Like Short URL:
  • I am glad you sorted out the problem and I am truly honoured that someone has bothered to take inspiration from my project. I hope you will find the timer useful! Good luck in the darkroom!

    0 Like Short URL:
  • Guest - Drew

    I really like the case you used for this project. Any chance you might be able to source where you got it from/what kind it is for people that might want to make one like yours?

    from Ohio, USA
    0 Like Short URL:
  • The enclusure was bought is Sweden and in my local "radio-shack"-store. I made a search this morning and found out the manufacturer is and that the model is HPS-9VB, see link below
    Best regards

    0 Like Short URL:
  • Guest - Doug King

    This is a cool project. I just recently started using fstop timing for printing and plan to build this project. Do you have a parts list?

    from Seattle, WA, USA
    0 Like Short URL:

Leave your comments

Post comment as a guest

Your comments are subjected to administrator's moderation.