#Variation des couleurs d'un led RGB avec le duty cycle
import RPi.GPIO as GPIO       #Importation du module GPIO
import time                   #Importation du module time

#Création de la liste colors
colors = [0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF]
pins = {'pin_R':11, 'pin_G':12, 'pin_B':13}  # pins est un dictionnaires

GPIO.setmode(GPIO.BOARD)       #Définit les pines par position physique
for i in pins:
	GPIO.setup(pins[i], GPIO.OUT)   #Place les pines en sortie
	GPIO.output(pins[i], GPIO.HIGH) #Place les pines à 1 (3.3V) pour éteindre le led

p_R = GPIO.PWM(pins['pin_R'], 2000)  # Place la Fréquence à 2KHz pour le rouge
p_G = GPIO.PWM(pins['pin_G'], 2000)  # Place la Fréquence à 2KHz pour le vert
p_B = GPIO.PWM(pins['pin_B'], 5000)  # Place la Fréquence à 5KHz pour le bleu

p_R.start(0)      # place duty Cycle = 0(led éteint) pour le rouge
p_G.start(0)      # place duty Cycle = 0(led éteint) pour le vert
p_B.start(0)      # place duty Cycle = 0(led éteint) pour le bleu

def map(x, in_min, in_max, out_min, out_max):
	return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

def setColor(col):   # Par example : col = 0x112233
        R_val = (col & 0x110000) >> 16  #& logique entre col et la valeur hex 110000
        #ensuite tasse les bits à droite 16 fois
        G_val = (col & 0x001100) >> 8   #& logique entre col et la valeur hex 001100
        #ensuite tasse les bits à droite 8 fois
        B_val = (col & 0x000011) >> 0   #& logique entre col et la valeur hex 000011
        #ensuite tasse les bits à droite 0 fois	
        R_val = map(R_val, 0, 255, 0, 100)
        G_val = map(G_val, 0, 255, 0, 100)
        B_val = map(B_val, 0, 255, 0, 100)
	
        p_R.ChangeDutyCycle(R_val)     # variation du duty cycle pour le rouge
        p_G.ChangeDutyCycle(G_val)     # variation du duty cycle pour le vert
        p_B.ChangeDutyCycle(B_val)     # variation du duty cycle pour le bleu

try:                                   #essaie
	while True:                    #recommencer toujours
		for col in colors:
			setColor(col)
			time.sleep(0.5)
except KeyboardInterrupt:        #sauf si les clés <Ctrl> et <c> sont enfoncées
	p_R.stop()
	p_G.stop()
	p_B.stop()
	for i in pins:
		GPIO.output(pins[i], GPIO.HIGH)    # éteindre le led RGB
	GPIO.cleanup()                             # Relâche le modue GPIO

