Det är python…

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.

DSC_0167

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)
Share