---
title: Poseidon
url: 'https://www.lekatsas.us/servers-and-code/raspberry-pis/poseidon'
markdown: 'https://www.lekatsas.us/servers-and-code/raspberry-pis/poseidon.md'
date: '2023-12-11'
description: "In the summer when our garden is in full swing we tend to take vacation. I had to beg family and friends to water my garden and I'm particular so I just went and made my own garden watering system. Its a Raspberry Pi powered six channel watering system, it has a 24VAC transformer and solid state re…"
---

In the summer when our garden is in full swing we tend to take vacation. I had to beg family and friends to water my garden and I'm particular so I just went and made my own garden watering system. Its a Raspberry Pi powered six channel watering system, it has a 24VAC transformer and solid state relays to control them. Everything is scripted in Python and the scheduling of how/when the script gets executed is run via cron job. Its a bit ridiculous and over designed but its on purpose, I plan to use this for a long time and as my gardening operations expand and grow it will fill the role without constant modification.

| [ ![picture](https://www.lekatsas.us/user/pages/images/poseidon/small/IMG20220628154635.jpg) ](https://www.lekatsas.us/user/pages/images/poseidon/IMG20220628154635.jpg) | [ ![picture](https://www.lekatsas.us/user/pages/images/poseidon/small/IMG20220813201005.jpg) ](https://www.lekatsas.us/user/pages/images/poseidon/IMG20220813201005.jpg) | [ ![picture](https://www.lekatsas.us/user/pages/images/poseidon/small/IMG20220813201238.jpg) ](https://www.lekatsas.us/user/pages/images/poseidon/IMG20220813201238.jpg) |
|---|---|---|
| [ ![picture](https://www.lekatsas.us/user/pages/images/poseidon/small/IMG20220814174150.jpg) ](https://www.lekatsas.us/user/pages/images/poseidon/IMG20220814174150.jpg) | [ ![video](https://www.lekatsas.us/user/pages/images/poseidon/small/VID20220813201544-1080p.jpg) ](https://www.lekatsas.us/user/pages/images/poseidon/VID20220813201544-1080p.webm) | [ ![video](https://www.lekatsas.us/user/pages/images/poseidon/small/VID20220814113109-1080p.jpg) ](https://www.lekatsas.us/user/pages/images/poseidon/VID20220814113109-1080p.webm) |

#### Code

```python
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time

# ***CONFIGURATION STARTS HERE***
#time, in seconds, to run each channel
watering_time = [90, 90, 90, 90, 180, 120]
#select which channels to turn on; 1 = on, 0 = off/skip
channels = [1, 1, 1, 1, 1, 0]
#list all the GPIO numbers, in order, to run through/trigger
GPIO_list = [14, 15, 17, 18, 22, 23]
# Getting length of list
length = len(GPIO_list)
i = 0
# ***CONFIGURATION ENDS HERE***

if len(channels) != len(GPIO_list):
    print("The 'channels' and 'GPIO_list' arrays are not the same lengths! Go fix it")
    exit()

GPIO.setmode(GPIO.BCM)
#GPIO.setmode(GPIO.BOARD)
#The GPIO.BOARD option specifies that you are referring to the pins by the number of the pin on the plug - i.e the numbers printed on the board (e.g. P1) and in the middle of the diagrams below.
#The GPIO.BCM option means that you are referring to the pins by the "Broadcom SOC channel" number, these are the numbers after "GPIO" in the green rectangles

#setup the 120VAC switch separate from the solenoid outputs
GPIO.setup(4, GPIO.OUT) #120VAC Switch
GPIO.output(4, GPIO.LOW) #set to 120VAC switch LOW

#loop through 'GPIO_list' array. Setup all the GPIO and set them to LOW
while i < length:
    GPIO.setup(GPIO_list[i], GPIO.OUT) #setup as output
    GPIO.output(GPIO_list[i], GPIO.LOW) #set to LOW output
    i += 1
#reset back to zero for the next loop
i = 0
time.sleep(0.100)

print('Turning AC power ON, Press CTRL+C to exit \n')
GPIO.output(4, GPIO.HIGH) #turn the solenoid ON
time.sleep(.100)
try:
    #loop through 'GPIO_list' array
    while i < length:
        if channels[i] == 1:
            print("Turn solenoid channel %d ON" % (i+1))
            GPIO.output(GPIO_list[i], GPIO.HIGH) #turn the solenoid ON
            time.sleep(watering_time[i])
            print("Turn solenoid channel %d OFF \n" % (i+1))
            GPIO.output(GPIO_list[i], GPIO.LOW) #turn the solenoid OFF
            time.sleep(.100)
        else:
            print("Skipping channel %d \n" % (i+1))
        i += 1
except KeyboardInterrupt: # If CTRL+C is pressed, exit cleanly:
    print('Turning AC power off')
    GPIO.output(4, GPIO.LOW) #turn the solenoid OFF
    time.sleep(.100)
    GPIO.cleanup() # cleanup all GPIO
    exit()
#if exiting normally, without CTRL+C, shut off AC power and release all the GPIOs
print('Turning AC power off')
GPIO.output(4, GPIO.LOW) #turn the solenoid OFF
time.sleep(.100)
GPIO.cleanup() # cleanup all GPIO
```

---

## Navigation

- Parent: [Raspberry Pis](https://www.lekatsas.us/servers-and-code/raspberry-pis.md)
- Previous: [Stentor](https://www.lekatsas.us/servers-and-code/raspberry-pis/stentor.md)
- Next: [Ghost](https://www.lekatsas.us/servers-and-code/raspberry-pis/ghost.md)
