16 thoughts on “Arduino Drop Controller

  1. Hello,

    first , sorry for my bad english.
    I did build this arduino dropler and al seems working ok, but i only get dark pictures, camera settings 1/125 sec shutter, fstop 8, flash power set to 1/64, somtimes when i press fire, it looks like the trigger for the camera is the first, and then followed bij the valve and flash. all is connected ok, if i set 3 drops, then the led on the mosfet module flashes 3times .
    Please can anyone help me out with this

    1. Hello Leo,

      It sounds like the unit is doing the right things – when you press fire the camera should trigger first, then the valve and finally the flash. You should be working with the camera set to the “bulb” setting, as the shutter stays open for the whole drop cycle and it’s just the flash burst that freezes the drop. The shutter only closes after the flash has fired: to make this work you need to be working in a darkened room. If you use a shutter speed of 1/125 second the shutter will likely have opened and closed before the drop reaches the water and the flash fires, which should explain the dark pictures. Try with a single drop first, as it’s a lot eaier to work out the timing than with multiple drops. Good luck.

  2. Thank for the reply, when i look at the leds on the modules i use then the unit is working as you described, and later i figured out about the bulb mode. i will give it another shot soon, im still working on it,
    In future i will try to add a second valve and one or more flashes. adding the flashes must be no problem, they have to fire at the same time i gues?, but adding a second valve will be another story on the programming.

    greeting Leo

  3. Hello John,
    I want to thank you so much for publishing your Arduino water drop controller design ! It is exactly what I was looking for !
    I searched the internet for months and months until I found your photobuilds website. Thanks!
    It works like a charm and I have published my project on instructables.com. see here:


    Because I did not have exactly the same hardware components I made a few additions/changes in your nice design and software:

    * a start message “splash controller V1” showing the software version for a few seconds.

    * I used an LCM 1602 I2C LCD display instead of your LCD 1602 keypad shield. (this display needs only 4 wires to the Arduino, SDA,SCL, VCC and GND).

    * Separate analog keyselection (values 0-1023) with a resistor chain on my PCB connected to input A1 and a different Mosfet design integrated on this PCB. I found a lot of discussions on the internet about the Mosfet IRF520 not working with Arduino because the gate voltage should be more than 5 VDC. So I added an optoisolator between the Arduino and the gate and now it switches with appr. 10 VDC.

    * I used EEPROM instructions with GET/PUT instead of read/write to store the integer numbers from ParamValues. Some are >255 and these integer numbers each need 2 bytes per number… The EEPROM read/write instructions can only store and retrieve single byte numbers (0-255).

    * I added a “clear valve” routine (press btnDOWN during startup, when ready press btnSELECT to stop). This opens the valve continuously to empty the siphon. This is a routine to clear the valve or change the content of the siphon.

    Thanks again for your design !


    1. Hi Alex,

      Thanks for your comment, and I’m glad my post was helpful. I just took a look at your instructable and it looks like a nice job you’ve done there, and your code modifications are definiely improvements. Interesting point about GET/PUT vs read/write: I just looked up my notes from the last sessions I did with the controller and none of the delays were > 255ms, so I hadn’t seen a problem. Lucky so far perhaps, but I’ll definitely be making a change to the code. Thanks for that.

      The MOSFET module I used says it’s good for 3.3v to 5V: I don’t have a schematic for the module so don’t know what other components are in there but I haven’t had any problems with it triggering .


      1. Hello John,
        About the Mosfet IRF520:
        You are right, the complete Mosfet driver module you use is compatible with Arduino. I think the load of the water valve is not that critical for the Mosfet so it works fine.
        I am now going to make more droplet photos with colored water and changing the thickness of the water for different results. I will publish them on instructables..
        I am thinking about an addition with a laser sensor mounted under the valve, this might be neccessary if the valve releases droplets with irregular mechanical timing. Your Arduino software can handle this addition too I think.

        Your website is very interesting, it reads like a book.

        Thanks again,

  4. I have the Camera AXE-4 and it does also water droplets, sound and other triggers.
    You have very nice pictures and I love that you made it yourself! Keep adding functions and have fun with it.
    You can also drop 2 colors – the base has one color and the liquid has a different color. Also the way you light up your background and use more lights it will create interesting backgrounds and some of that color will affect your droplets and the dish colors.
    Nice job!

  5. Hello John,

    I experimented with your code and setup and had good results. Nice work. Thank you. I added an external wired button, so I don’t have be near the Arduino to fire. I use a PC817 4-Channel Optocoupler (camera, flash and external trigger button) and a 5V 1 Channel Relay Board Module for the valve.

    I found a minor problem in the sketch with the storage and retrieval of the values in EEPROM. The integer values greater than 256 (such as gaps and flash delays) are not stored properly in EEPROM address. Each EEPROM address can hold only one byte (0-256). This situation can be solved by breaking the number in 2 bytes. I found the solution at https://roboticsbackend.com/arduino-store-int-into-eeprom/. I tried it and it works well. I hope this enhancement will be useful.

    Here is the code to do it:

    int j = 0;
    for (int i=0; i<=6; i++) {
    // read last settings used from EEPROM
    byte byte1 = EEPROM.read(i + j);
    byte byte2 = EEPROM.read(i + j + 1);
    ParamValues[i] = (byte1 << 8) + byte2;
    j = j + 1;

    int j = 0;
    for (int i=0; i> 8);
    EEPROM.write(i + j + 1, ParamValues[i] & 0xFF);
    j = j + 1;

    Best regards,


    1. Hi JM,

      Thanks for your feedback, and yes you’re right there is an error in the way I write/read delay values into eeprom which I will correct – with my setup I haven’t encountered the problem as I’ve never yet run with a delay over 255mS.

      It looks like there’s a slightly easier way to deal with this in Arduino by using EEPROM.put() and EEPROM.get() methods, which appear to automatically support the type of the variable being stored or retreived. There’s also EEPROM.update() which will only write data if it’s different to what’s already stored. I think I’ll try these out when I do the mod.


Leave a Reply

Your email address will not be published. Required fields are marked *