machine.py 3.82 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
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)

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

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

g.setup(btn_pin, g.IN, pull_up_down=g.PUD_DOWN)
Hugo Hörnquist's avatar
Hugo Hörnquist committed
52
g.setup(3, g.IN, pull_up_down=g.PUD_DOWN)
Hugo Hornquist's avatar
Hugo Hornquist committed
53 54 55 56 57
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
58 59 60 61
    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
62 63 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

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
93
    return wait_rise() if test else wait_fall()
Hugo Hornquist's avatar
Hugo Hornquist committed
94 95

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

Hugo Hörnquist's avatar
Hugo Hörnquist committed
98
def lcd_info(msg, last_time):
Hugo Hörnquist's avatar
Hugo Hörnquist committed
99 100 101 102 103 104 105 106 107 108 109
    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)

110 111
def main():
    global state, pins
Hugo Hörnquist's avatar
Hugo Hörnquist committed
112
    last_time = 0
Hugo Hörnquist's avatar
Hugo Hörnquist committed
113 114 115 116
    while True:
        if state == States.no_hafv:
            print
            print "Inget Hafv"
Hugo Hörnquist's avatar
Hugo Hörnquist committed
117
            lcd_info("Vilar", last_time)
Hugo Hörnquist's avatar
Hugo Hörnquist committed
118 119 120 121 122
            wait_for_bottle_place()
            state = States.hafv_ready

        elif state == States.hafv_ready:
            print "Hafv redo"
Hugo Hörnquist's avatar
Hugo Hörnquist committed
123
            lcd_info("Starta med knapp", last_time)
Hugo Hörnquist's avatar
Hugo Hörnquist committed
124 125 126 127 128 129
            wait_btn()
            state = States.hafv_active
            start_time = time_ms()

        elif state == States.hafv_active:
            print "currently Hafving"
Hugo Hörnquist's avatar
Hugo Hörnquist committed
130
            lcd_info("Klockar", last_time)
Hugo Hörnquist's avatar
Hugo Hörnquist committed
131 132
            if not bottle_check(pins):
                print "Early start"
Hugo Hörnquist's avatar
Hugo Hörnquist committed
133
                lcd_info("Tjuvstart!", last_time)
Hugo Hörnquist's avatar
Hugo Hörnquist committed
134 135 136 137 138 139 140 141 142 143
                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"

Hugo Hörnquist's avatar
Hugo Hörnquist committed
144 145 146 147 148 149 150 151 152 153 154 155
            # Wait for bottle placed is in a loop because if the time
            # is under 1 secound then we want to wait again. This is
            # to prevent a finger or similar from stopping the time.
            while True:
                wait_for_bottle_place()
                print "BOTTLE PLACED"

                end_time = time_ms()
                t = (end_time - start_time) / 1000.0
                if t > 1:
                    # Allow timing to halt
                    break
Hugo Hörnquist's avatar
Hugo Hörnquist committed
156 157 158

            print "Hafvtid: {0} s".format(t)
            last_time = t
Hugo Hörnquist's avatar
Hugo Hörnquist committed
159
            lcd_info("Avvakta", last_time)
Hugo Hornquist's avatar
Hugo Hornquist committed
160
            state = States.no_hafv
Hugo Hörnquist's avatar
Hugo Hörnquist committed
161
            time.sleep(1)
162 163 164

if __name__ == "__main__":
    main()