Code Source Python Ticket4Bath

De Learning Lab Environnements Connectés
Sauter à la navigation Sauter à la recherche

Version plus complète du code : Code Source Ticket4Bath.

import time
import grovepi
import sys
import RPi.GPIO as GPIO
import smbus


# Connect the Grove PIR Motion Sensor to digital port D8
# SIG,NC,VCC,GND
led_sensor = 3
touch_sensor = 4
buz_sensor = 2

compt = 1

#Tableau des notes de musique
notes = ['E7', 'E7', 'E7', 'C7', 'E7', 'G7', 'G6', 'C7', 'G6', 'E6', 'A6', 'B6', 'AS6', 'A6',
	'G6', 'E7', 'G7', 'A7', 'F7', 'G7', 'E7', 'C7', 'D7', 'B6', 'C7', 'G6', 'E6', 'A6', 'B6', 'AS6', 'A6',
	'G6', 'E7', 'G7', 'A7', 'F7', 'G7', 'E7', 'C7', 'D7', 'B6', ' ' ]
	
#Longueur des notes
beats = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .75, .75, .75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .75, .75, .75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]
tempo = 100

grovepi.pinMode(buz_sensor,"OUTPUT")
grovepi.pinMode(led_sensor,"OUTPUT")

# Adresses I2C du LCD
DISPLAY_RGB_ADDR = 0x62
DISPLAY_TEXT_ADDR = 0x3e

# Bus de liaison de la Raspberry pi si pi1 = 0 et pi2 = 1
rev = GPIO.RPI_REVISION
bus = smbus.SMBus(1)

#Fonction permettant de parametrer la couleur de fond du LCD
def setRGB(r,g,b):
    bus.write_byte_data(DISPLAY_RGB_ADDR,0,0)
    bus.write_byte_data(DISPLAY_RGB_ADDR,1,0)
    bus.write_byte_data(DISPLAY_RGB_ADDR,0x08,0xaa)
    bus.write_byte_data(DISPLAY_RGB_ADDR,4,r)
    bus.write_byte_data(DISPLAY_RGB_ADDR,3,g)
    bus.write_byte_data(DISPLAY_RGB_ADDR,2,b)

#Commande pour afficher    
def textCommand(cmd):
    bus.write_byte_data(DISPLAY_TEXT_ADDR,0x80,cmd)

#Fonction pour afficher le texte avec retour a la ligne    
def setText(text):
    textCommand(0x01) # clear display
    time.sleep(.05)
    textCommand(0x08 | 0x04) # display on, no cursor
    textCommand(0x28) # 2 lines
    time.sleep(.05)
    count = 0
    row = 0
    for c in text:
        if c == '\n' or count == 16:
            count = 0
            row += 1
            if row == 2:
                break
            textCommand(0xc0)
            if c == '\n':
                continue
        count += 1
        bus.write_byte_data(DISPLAY_TEXT_ADDR,0x40,ord(c))
		
#Blink deux fois rouge/blanc
def blink2():
	setRGB(255,0,0)
	time.sleep(.05)
	setRGB(255,255,255)
	time.sleep(.05)
	setRGB(255,0,0)
	time.sleep(.05)
	setRGB(255,255,255)
	time.sleep(.05)
	setRGB(255,0,0)
	time.sleep(.05)

#Blink une fois rouge/blanc
def blink1():
	setRGB(255,0,0)
	time.sleep(.05)
	setRGB(255,255,255)
	time.sleep(.05)
	setRGB(255,0,0)
	
#Fonction qui joue la note (tone) durant une certaine duree
def playTone(tone, duration):
	for i in range(0,duration * 1000L, tone * 2 ):
		grovepi.digitalWrite(buz_sensor, 1)
		time.sleep(tone * .000001)
		grovepi.digitalWrite(buz_sensor, 0)
		time.sleep(tone * .000001)
 
#Fonction qui verifie que la note demandee existe, s'apppuie sur playTone
def playNote(note, duration):
	names = [ 'a', 'E6', 'E7', 'C7', 'G7', 'G6', 'A6', 'B6', 'AS6', 'A7', 'F7', 'D7' ]
	tones = [ 10, 1319, 2637, 2093, 3136, 1568, 1760, 1976, 1865, 3520, 2794, 2349 ]
	
	for i in range(0,8):
		if (names[i] == note):
			playTone(tones[i], duration)
			
#Fonction pour lancer la musique, s'appuie sur playNote et playTone
def music_moussaillon():
	for i in range(0,78):
		if(notes[i] == ' '):
			time.sleep(beats[i] * tempo)
		else:
			playNote(notes[i], beats[i] * tempo)
		time.sleep(0.15)
  


#Routine de fonctionnement
grovepi.digitalWrite(led_sensor,0)	
grovepi.digitalWrite(buz_sensor,0)

setText('Etat de la SdB : Libre')	
setRGB(0,255,0)

while True:	
	if (grovepi.digitalRead(touch_sensor) == 1):
		if(compt%2 == 1):
			compt += 1
			grovepi.digitalWrite(led_sensor,1)
			setText('Etat de la SdB : Occupe (15 min)')
			setRGB(255,0,0)  #rouge
			time.sleep(5)
			blink1()
			setText('Etat de la SdB : Occupe (30 sec)')
			time.sleep(10)
			blink1()
			setText('Etat de la SdB : Occupe (10 sec)')
			time.sleep(5)
			blink1()
			setText('Etat de la SdB : Occupe (5 sec)')
			time.sleep(1)
			blink2()
			setText('Etat de la SdB : Occupe (4 sec)')
			time.sleep(1)
			blink2()
			setText('Etat de la SdB : Occupe (3 sec)')
			time.sleep(1)
			blink2()
			setText('Etat de la SdB : Occupe (2 sec)')
			time.sleep(1)
			blink2()
			setText('Etat de la SdB : Occupe (1 sec)')
			time.sleep(1)
			blink2()
			
			setText('Utilisation \n      finie')
			blink2()
			blink2()
		
		else:
			compt += 1
			grovepi.digitalWrite(led_sensor,0)
			setText('Etat de la SdB : Libre')	
			setRGB(0,255,0)