Idag blev det en tur till Clas för att köpa lite fästliga saker som lim, buntband och tejp. Det kom även ett kuvert från Electro:kit med bland annat de motstånd som behövs i serie med lysdioderna. De drar ungefär 700mA över 3V så sex stycken dioder i serie med ett motstånd på ett ohm blir ganska lagom till mitt nätagg på 19V.
Det blev även en del programmerat i helgen så nu har jag en liten slinga som sköter ljuset. Den börjar med att tända månljuset vid sex på morgonen och går vid tio över till en soluppgång då ljuset stegas upp under en timma. Under dagen går det slumpmässiga ”molnskuggor” över karet då ett antal dioder släcks i en vandrande sekvens. Vid nio på kvällen börjar solnedgången som håller på en timma innan månljuset åter tar över fram till ett på natten. Det ska byggas ut med olika tider olika veckodagar och lite annat pill men är en bra början. Jag hittade dessutom en bra beskrivning på hur man kör python-skript som tjänster så att det startar automatiskt. Slutligen la jag in en rad i /etc/rsyslog.d/aquacontrol.conf (ja, jo, jag har döpt snurran till aquacontrol. Stäm mig) för att få loggningen till en egen fil:
if $programname == 'aquacontrol.py' then /var/log/aquacontrol.log
Och själva skriptet, skrivet i python, kommer här:
#!/usr/bin/python import RPi.GPIO as GPIO import time import datetime import syslog from random import randint syslog.syslog('Aquacontrol started') # Definiera tider moon_on = datetime.datetime(2015, 1, 1, 6, 0) moon_off = datetime.datetime(2015, 1, 1, 1, 0) sunrise_on = datetime.datetime(2015, 1, 1, 10, 0) sunset_on = datetime.datetime(2015, 1, 1, 21, 0) # definiera variabler sun = [2,3,4,5,6,7,8,9,10] moon = 11 # Initiera GPIO GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) for x in range (0, 9): GPIO.setup(sun[x], GPIO.OUT) GPIO.setup(moon, GPIO.OUT) syslog.syslog('GPIO initialized') # Subrutiner def sunrise(interval): syslog.syslog('Sunrise started') for x in range (0, 9): GPIO.output(sun[x], 1) if x == 1: GPIO.output(moon, 0) time.sleep(interval) syslog.syslog('Sunrise ended') def sunset(interval): syslog.syslog('Sunset started') for x in range (8, -1, -1): GPIO.output(sun[x], 0) if x == 1: GPIO.output(moon, 1) time.sleep(interval) syslog.syslog('Sunset ended') def shadow(runtime): syslog.syslog('Shadow started') for x in range (0, 11): if x < 9: GPIO.output(sun[x], 0) if x > 1: GPIO.output(sun[x - 2], 1) time.sleep(runtime / 11) syslog.syslog('Shadow ended') # Initiera state (night, moon, day, moon) now = datetime.datetime.now() sunset(0) GPIO.output(moon, 0) state = 0 if now.time() > moon_on.time(): state = 1 if now.time() > sunrise_on.time(): state = 2 if now.time() > sunset_on.time(): state = 3 if now.time() > moon_off.time() and now.time() < moon_on.time(): state = 0 if state == 1 or state == 3: GPIO.output(moon, 1) elif state == 2: sunrise(0) syslog.syslog('Initial state is %d' % state) # Huvudloop while True: now = datetime.datetime.now() if state == 0: # Night mode, wait for morning moon if now.time() > moon_on.time(): state = 1 syslog.syslog('Entering state 1') GPIO.output(moon, 1) elif state == 1: # Morning moon, wait for sunrise if now.time() > sunrise_on.time(): state = 2 syslog.syslog('Entering state 2') sunrise(450) elif state == 2: # Daytime, random shadows, wait for sunset if randint(1, 60) == 1: shadow(60) if now.time() > sunset_on.time(): state = 3 syslog.syslog('Entering state 3') sunset(450) elif state == 3: # evening moon, wait for night if now.time() > moon_off.time() and now.time() < moon_on.time(): state = 0 syslog.syslog('Entering state 0') GPIO.output(moon, 0) time.sleep(60)