On 2015-09-09 20:03, John McKenzie wrote:
Hello. As per the suggestion of two of you I went to the Raspberry Pi newsgroup. Dennis is also there and has been posting in response to my problems. Between there and the Raspberry Foundation website I discovered that my wiring did not match my code and changed all PUD_DOWN to PUD_UP and all GPIO.RISING to GPIO.FALLING because I was wired to the ground pin. Someone suggested code very close to what hakugin suggested. Right now I have response buttons that work, but the colour of the LED strip is not correct. It adds colours instead of changing to a new one. I hit red, it pulses red, I hit blue, it pulses red and blue, making purple. It appears now my problem is more about Python usage than anything else, so I am asking for help here as well as having already asked elsewhere. Tried using a go to black command (led.set_color(name="black")) and a turn off command (led.turn_off()) before the pulse command to reset the colour and these did not work. To see what would happen I removed the "while colour == 1:" (or == 2: or ==3:) line and it acted as expected. The LED pulsed once. However, it would pulse the correct colour, it would not add colours together. So the while loop seems to be the cause of my problem, but it is needed to keep the pulse repeating as far I can know. Maybe Python has another way to repeat the function. Here is the code I was working from: import atexit import time from blinkstick import blinkstick import RPi.GPIO as GPIO led = blinkstick.find_first() colour = 0 time_red = 0 time_yellow = 0 time_blue = 0 timestamp = time.strftime("%H:%M:%S") GPIO.setmode(GPIO.BCM) GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP) def red_button(channel): led.set_color(name="black") colour = 1 while colour == 1: led.pulse(red=255, green=0, blue=0, repeats=1, duration=3000, steps=50) def yellow_button(channel): led.set_color(name="black") colour = 2 while colour == 2: led.pulse(red=255, green=255, blue=0, repeats=1, duration=3000, steps=50) def blue_button(channel): led.set_color(name="black") colour = 3 while colour == 3: led.pulse(red=0, green=0, blue=255, repeats=1, duration=2000, steps=50) GPIO.add_event_detect(22, GPIO.FALLING, callback=red_button, bouncetime=200) GPIO.add_event_detect(23, GPIO.FALLING, callback=yellow_button, bouncetime=200) GPIO.add_event_detect(24, GPIO.FALLING, callback=blue_button, bouncetime=200) while True: if colour == 1: time_red += 1 elif colour == 2: time_yellow += 1 elif colour == 3: time_blue += 1 time.sleep(0.1) def exit_handler(): print "\033[0;41;37mRed Team:\033[0m ", time_red print "\033[0;43;30mYellow Time:\033[0m ", time_yellow print "\033[0;44;37mBlue Time:\033[0m ", time_blue flog = open("flag1.log", "a") flog.write(timestamp + "\n" + "Red Team: " + str(time_red) + "\n" + "Yellow Team: " + str(time_yellow) + "\n" + "Blue Team: " + str (time_blue) + "\n") flog.close() GPIO.cleanup() atexit.register(exit_handler) Any advice about the while loop for the colour pulsing is appreciated.
It's the same problem as before, and it has the same answer. In red_button, yellow_button and blue_button, 'colour' is a local variable. It's set to a value and that value is never changed in the loop, so it loops forever. You should declare 'colour' to be global in all 3 functions, e.g.: def red_button(channel): global colour -- https://mail.python.org/mailman/listinfo/python-list