machine.py 3.35 KB
Newer Older
Hugo Hornquist's avatar
Hugo Hornquist committed
1 2 3 4 5 6
#!/usr/bin/env python2

import RPi.GPIO as g
import time
import threading

Hugo Hörnquist's avatar
Hugo Hörnquist committed
7 8
import Adafruit_CharLCD as LCD

Hugo Hornquist's avatar
Hugo Hornquist committed
9 10 11 12 13 14 15 16 17 18
# For lazer array
# if no bottle present then all are high
# if bottle at least one low

# For regular button
# Down means bottle
# up means no bottle

g.setmode(g.BCM)

Hugo Hörnquist's avatar
Hugo Hörnquist committed
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
pins = [ 17, 27, 22, 10, 9, 11, 5, 6, 13, 19 ]
btn_pin = 4

test = False

lcd_rs = 12
lcd_en = 7
lcd_d4 = 8
lcd_d5 = 25
lcd_d6 = 24
lcd_d7 = 23

lcd_backlight = 2

# Define LCD column and row size for 16x2 LCD.
lcd_columns = 16
lcd_rows = 2

lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows, lcd_backlight)

last_time = 0

risewait = threading.Event()
fallwait = threading.Event()
Hugo Hornquist's avatar
Hugo Hornquist committed
43 44 45 46

def callback(pin):
    state = g.input(pin)
    if state == g.LOW:
Hugo Hörnquist's avatar
Hugo Hörnquist committed
47
        print "falling edge"
Hugo Hornquist's avatar
Hugo Hornquist committed
48 49
        fallwait.set()
    else:
Hugo Hörnquist's avatar
Hugo Hörnquist committed
50
        print "rising edge"
Hugo Hornquist's avatar
Hugo Hornquist committed
51 52 53
        risewait.set()

g.setup(btn_pin, g.IN, pull_up_down=g.PUD_DOWN)
Hugo Hörnquist's avatar
Hugo Hörnquist committed
54
g.setup(3, g.IN, pull_up_down=g.PUD_DOWN)
Hugo Hornquist's avatar
Hugo Hornquist committed
55 56 57 58 59
for pin in pins:
    g.setup(pin, g.IN, pull_up_down=g.PUD_DOWN)
    g.add_event_detect(pin, g.BOTH, callback=callback)

def bottle_check(pins):
Hugo Hörnquist's avatar
Hugo Hörnquist committed
60 61 62 63
    if test:
        return any([g.input(pin) for pin in pins])
    else:
        return not all([g.input(pin) for pin in pins])
Hugo Hornquist's avatar
Hugo Hornquist committed
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94

class States:
    no_hafv = 0
    hafv_ready = 1
    hafv_active = 2

has_bottle = bottle_check(pins)

state = States.no_hafv
start_time = 0
end_time = 0

def time_ms():
    t = int(time.time() * 1000)
    # print "Time: ", t
    return t

if has_bottle:
    state = States.hafv_ready

def wait_rise():
    risewait.clear()
    risewait.wait()

def wait_fall():
    fallwait.clear()
    fallwait.wait()

# should these be the other way around?

def wait_for_bottle_place():
Hugo Hörnquist's avatar
Hugo Hörnquist committed
95
    return wait_rise() if test else wait_fall()
Hugo Hornquist's avatar
Hugo Hornquist committed
96 97

def wait_for_bottle_remove():
Hugo Hörnquist's avatar
Hugo Hörnquist committed
98 99 100 101 102 103 104 105 106 107 108 109 110 111
    return wait_fall() if test else wait_rise()

def lcd_info(msg):
    lcd.clear()
    lcd.home()
    lcd.set_cursor(0, 0)
    lcd.message("Tid: {0} s".format(last_time))
    lcd.set_cursor(0, 1)
    lcd.message(msg)

def wait_btn():
    return g.wait_for_edge(btn_pin, g.RISING, bouncetime=500)
    #g.wait_for_edge(btn_pin, g.RISING)

112 113
def main():
    global state, pins
Hugo Hörnquist's avatar
Hugo Hörnquist committed
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
    while True:
        if state == States.no_hafv:
            print
            print "Inget Hafv"
            lcd_info("Vilar")
            wait_for_bottle_place()
            state = States.hafv_ready

        elif state == States.hafv_ready:
            print "Hafv redo"
            lcd_info("Starta med knapp")
            wait_btn()
            state = States.hafv_active
            start_time = time_ms()

        elif state == States.hafv_active:
            print "currently Hafving"
            lcd_info("Klockar")
            if not bottle_check(pins):
                print "Early start"
                lcd_info("Tjuvstart!")
                wait_btn()
                state = States.no_hafv
                continue
            print "Raise the bottle"
            wait_for_bottle_remove()
            print "BOTTLE RAISED"
            print "Place back bottle after hafv"
            wait_for_bottle_place()
            print "BOTTLE PLACED"

            end_time = time_ms()

            t = (end_time - start_time) / 1000.0
            print "Hafvtid: {0} s".format(t)
            last_time = t
            lcd_info("Avvakta")
Hugo Hornquist's avatar
Hugo Hornquist committed
151
            state = States.no_hafv
Hugo Hörnquist's avatar
Hugo Hörnquist committed
152
            time.sleep(1)
153 154 155

if __name__ == "__main__":
    main()