HomeTutorials › Controlling A Solenoid Valve With Arduino

Controlling A Solenoid Valve With Arduino

In this tutorial we will be controlling a solenoid with an Arduino and a transistor. The solenoid we have picked for this tutorial is our Plastic Water Solenoid Valve (perfect for controlling flow to a drip irrigation system) but this tutorial can be applied to most inductive loads including relays, solenoids, and basic DC motors.

A Few Considerations:
Before choosing this solenoid valve for a project there are a few things that should be considered:

• Water can only flow in one direction through this valve.
• There is a 3 PSI minimum pressure requirement on the inlet otherwise the valve will not shut off.
• This solenoid valve is not rated for food safety or use with anything but water.

How It Works:
This valve is very similar to those found in a lawn irrigation system – the only real difference being the size. The inlet water pressure actually holds the valve closed so if you do not have any inlet water pressure (3psi minimum) the valve will never close!

The Parts Needed:


This tutorial will be requiring a few common parts:

We have also used one of our full sized Arduino Mounting Plates in this tutorial. The mounting plate keeps your Arduino and breadboard neatly fixed next to one another, allowing for much more organized prototyping!

The Schematic

This handy little diagram shows how we will be connecting everything. Don’t worry if it looks a little overwhelming, we will be going through this step by step!


Step 1 – Powering The Breadboard


Let’s go ahead and set up the Arduino Uno and the breadboard right next to one another. The solenoid works with anywhere between 6-12V which is too high to use with the standard Arduino 5V. To get around this problem we will be using a 9V power supply – the solenoid will operate at 9V while the Arduino’s built in voltage regulator will turn that 9V into the 5V that it needs to operate. To gain access to the raw voltage going into the DC barrel jack on the Arduino Uno we will use the “Vin” pin located next to the ground pin on the Arduino.

Please Note:Do Not use this method of wiring with input voltages greater than 12VDC. An external regulator or separate power supply is required.

Start by connecting one of the jumper wires to the “Vin” pin on the Arduino and running it over to the positive rail on the side of the solderless breadboard. Next, run a wire from the Ground pin on the Arduino over to the negative rail on the solderless breadboard.

We now have 9VDC power on the breadboard! With the exception of the “Vin” pin, 9V is more than enough to damage your Arduino so do not plug ANY other pins from the Arduino into the positive rail on the breadboard.

Step 2 – The Solenoid’s Wire Harness


This solenoid does not have a wire harness and instead relies on 0.250″ Quick Connects. These are the best way to connect the solenoid. If you do not have Quick Connects laying around, Alligator Clips or even soldering wires to the tabs will work!

The connections on the solenoid do not matter, the coil does not care which side is positive or negative.

Step 3 – Solenoid To Breadboard


Connect the solenoid to the breadboard – we will need to add a diode between the two contacts so we will leave some space for that.

Step 4 – Snubber Diode


Since a solenoid is an inductive load we need to include a snubber diode across the contacts. Snubber diodes help eliminate transient voltages caused when a magnetic coil (such as those found in a motor, relay, or solenoid) suddenly loses power. Without this diode in place the transient voltage spikes can damage other elements of the circuit.

The snubber is placed from the negative side of the coil to the positive side. Since diodes only allow current to flow in one direction we need to make sure we get this right, otherwise it will be a dead short between power and ground. Ensure the side with the White stripe is connected to power/positive side of the solenoid! In our circuit the Red wire is the positive 9V so we will connect it to this side.

Step 5 – Power To The Solenoid


Now that we are sure the diode is facing the correct direction the solenoid can be attached to the 9V Power on the breadboard. The solenoid gets constant power because we will using low side switching to turn on and off this solenoid. Low side switching means we will be interrupting the circuit between the negative side of the solenoid and the ground rather than between the power and the solenoid. This seems a little counter intuitive, but we do this because switching the high side is a lot more difficult with a transistor when the voltage being switched is higher than the Arduino’s 5V logic. Don’t worry, in later tutorials we will go into high side switching!

Step 6 – The Transistor


The current draw of this solenoid is higher than a standard transistor can handle so we will be using a TIP120 Darlington Transistor. A Darlington transistor is actually a pair of transistors that act as a single transistor with a high current gain. The pin output is still the same as a standard transistor so (for now) just think of this as a transistor with a higher current rating.

We will start by placing this transistor in the breadboard.

Step 7 – Base Resistor


A base resistor is exactly what it sounds like – it is a resistor placed on the base pin of the transistor. This resistor limits the current going to the base (control line) of the transistor; no resistor would result in no current limit, and could result in a transistor blowing up! We will be using a 1K ohm resistor in this case; it can be placed from the base of the transistor as shown.

Step 8 – Connecting To The Arduino


Now that the current limiting resistor is in place we can go ahead and connect this up to one of the Arduino digital pins. Take a wire and run it from Arduino pin 4 to the current limiting resistor we just placed in the last step.

Step 9 – Connect The Solenoid


Next we are going to connect the solenoid’s negative terminal to the collector on the transistor. The collector is one side of the “switch” in a transistor, this is connected to the emitter (other side of the “switch”) when the base pin is has a voltage applied. An easy way to remember what goes where on a transistor is:

“The Collector collects whatever the Emitter will emit when the Base commands it to”

So in this case we are going to “collect” the negative from the solenoid and “emit” it to the ground of the circuit. So let’s run a wire from the solenoid negative to the middle pin (collector) of the transistor.

Step 10 – Connecting To Ground


Now we will connect the transistor’s emitter to the ground rail on the breadboard. The circuit is complete!

Step 11 – Double Check And Plug It In!


Before we give the Arduino power it is always a good idea to go over all of the connections to make sure there are no wires in the wrong spot – sometimes that can make for a very expensive mistake!

One way to avoid this problem is good wire color discipline. In other words, decide on a purpose for each color of wire and stick to them! In this example all 9V power are red wires, all grounds are black wires, orange is the negative output of the solenoid, and yellow is the signal wire. This way, if you ever see a red wire going to a black wire you will know right away that something isn’t quite right!

Step 12 – Starting The Code

void setup() {
// put your setup code here, to run once:
void loop() {
// put your main code here, to run repeatedly:

Now that we have finished with the hookup we need to start writing some code. We will be using the Arduino IDE, this is available from https://www.arduino.cc/en/Main/Software

We will start with the “BareMinimum” sketch found by clicking “File” and selecting Examples / Basic / BareMinimum. This sketch is a great starting point as it includes the Setup and Loop functions – we will write the rest!

Step 13 – Understanding How To Control The Solenoid

Since the transistor is doing all of the heavy lifting in this circuit we do not need to do much in terms of coding. When Arduino pin 4 is set to HIGH this will connect the transistors collector to the transistor’s emitter, which will activate the solenoid.

Let’s go write the code!

Step 14 – Writing The Code

We are starting with the BareMinimum Sketch found in the IDE, it should look something like this:

void setup() {
  // put your setup code here, to run once:

void loop() {
  // put your main code here, to run repeatedly:  

So first we will need a variable for the Arduino pin:

int solenoidPin = 4;    //This is the output pin on the Arduino we are using

void setup() {
  // put your setup code here, to run once:

void loop() {
  // put your main code here, to run repeatedly:  

Next we need to set the Arduino pin to act as an output:

int solenoidPin = 4;    //This is the output pin on the Arduino we are using

void setup() {
  // put your setup code here, to run once:
  pinMode(solenoidPin, OUTPUT);           //Sets the pin as an output

void loop() {
  // put your main code here, to run repeatedly:  

Now that it is set as an output we can tell it what to do:

int solenoidPin = 4;    //This is the output pin on the Arduino we are using

void setup() {
  // put your setup code here, to run once:
  pinMode(solenoidPin, OUTPUT);           //Sets the pin as an output

void loop() {
  // put your main code here, to run repeatedly:  
  digitalWrite(solenoidPin, HIGH);    //Switch Solenoid ON
  delay(1000);                      //Wait 1 Second
  digitalWrite(solenoidPin, LOW);     //Switch Solenoid OFF
  delay(1000);                      //Wait 1 Second

So if we want the solenoid to allow water to flow, set the pin high. When you want the water to stop flowing, set the pin low. In this case it will turn the water on for 1 second and then off for 1 second, looping forever (or at least until it is unplugged!) This solenoid valve could easily be used with the flow meter featured in our last tutorial to create a system that only allows a certain volume of water to flow before shutting off.

Step 15 – Upload The Code And Test


Now that all of the code has been written it can be uploaded to your Arduino! Click “Upload” button in the top left corner of the Arduino IDE and it should upload without any issues. After a few seconds the solenoid will start opening and closing.

Have A Question?
If you have any questions, or need further clarification please post in the comments section below; this way future users of this tutorial can see the questions and answers!

Parts Used In This Tutorial:


  1. mark
  2. mark
  3. Matt
      • Matt
  4. Bart Grefte
  5. Marlo Kyn Bunda
  6. Lionel Eisenberg
  7. Josh
      • Josh
      • Mrunal Lalwani
  8. Josh
  9. Josh
  10. nagesh
  11. Ajay
  12. Sergio
  13. Sabri
  14. David
  15. Adi
  16. mahesh
  17. Arnav Raj
    • mike87
      • Rcname
        • sapwood
  18. Cameron James
  19. Diego Garcia
  20. Luke Harrison
  21. Ash
  22. Robert Kipngeno
  23. Yossi
  24. Victoria
  25. Chavi
  26. Hafiz
      • sidrah
  27. babak
    • mike87
  28. Abhirup Das
  29. Joshua
  30. Hernan
  31. Edward Diller
  32. Chattip
  33. kheito
  34. Nicolo Tanti
  35. Humera
  36. Evie
  37. prateek sharma
  38. Yijia Sun
  39. Ravi
  40. Julia
  41. matt
    • mike87
  42. Sash
    • mike87
  43. Peter
  44. Jo
  45. Gage
    • Gage
  46. sumeet
  47. John Cosso
    • mike87
    • BeardofZeus
  48. Nelson
      • John
  49. Matheus
  50. Nirmalarajah
  51. Nirmalarajah
  52. Eduardo Garcete
  53. rohan
  54. Dan
  55. Rajagopalan
  56. Ashwan Visram
  57. Rajagopalan
  58. Joseph
  59. Vishal
    • William @ BC Robotics
  60. Dane
  61. Ravi
    • William @ BC Robotics
  62. pengo
  63. trex
  64. pengo
      • pengo
  65. Brandon thompson
  66. Isaiah Sirkin
    • BeardofZeus
  67. saurabh kesari
  68. Chou Tzuyu
  69. Soumen Naayak
  70. Dahlia Binti Mohd Faisol
  71. Andy
  72. Bri
  73. DEEPAN
  74. rlurkins
  75. Leosenko
  76. Chri Lu
  77. Giovanni Nieddu
  78. Niké
  79. Andrea
  80. Saif Alsulimmani
  81. hardomor
    • hardomor
    • BeardofZeus
  82. Jeenu
  83. Edy
  84. Jason
  85. Josh
  86. Eric Soberano
  87. Victor Oluyole
  88. Adam lupinaccio
  89. Cresent
  90. Tom
  91. cmg
  92. aniruddha
  93. Ellis
  94. wana
  95. Deepak
  96. inderpreet singh
  97. Tahir
    • William @ BC Robotics
  98. Stathis
  99. Robert Potts

Leave a Reply