SimonSays
Simon says
The `repeat after me` electronic game of the 80s.
This is a demo of the use of wiring pi for both input and output, and pwm for sound creation, and eg servo control. It shows that with a little work Euphoria can do pretty much anything that Python can do, and with much easier to read syntax.
The downside with Euphoria is that there fewer Raspberry Pi specific libraries compared to Python.
Here is a link to a youtube video demoing the program and showing the easy (afternoon project) build.
https://www.youtube.com/watch?v=t5Yv_gdKbVE
The code is below - you may need to modify the location of the wiring pi librarries in the include section. It also uses figlet to create the large fonts - you don't have to have them, but it looks nice.
Cheers
--a Simon Says in Eu for Raspberry Pi --uses RKDavis' wiring pi (see EU wiki) /* Setup four colour leds with 330 series resistors attached to pins 0 to 3 four push to make switches with pull down resistors attached to pins 5 to 7 passive buzzer via transistor switch attached to pin 8 - 1K resistor in series with pin 8 - base connection */ include std/os.e include std/filesys.e include user/wiringPi2/wiringPi/wiringPi.e include user/wiringPi2/wiringPi/softTone.e sequence pitches = {262,294,330,349,392,440,494,523, 587, 659,698,784,880,988,1047} integer HAVE_FIGLET = 0 --note you could also use Toilet here - another ascii text generator wiringPiSetup() --setup the pins pinMode(0, OUTPUT) pinMode(1, OUTPUT) pinMode(2, OUTPUT) pinMode(3, OUTPUT) pinMode(4, INPUT) pinMode(5, INPUT) pinMode(6, INPUT) pinMode(7, INPUT) pinMode(8, OUTPUT) --set the LEDs to the off state digitalWrite(0, 0) digitalWrite(1, 0) digitalWrite(2, 0) digitalWrite(3, 0) --set GPIO 3 to pull down pullUpDnControl(7, PUD_DOWN) --set pin 8 to tone creator softToneCreate(8) ---------------------------------------------------- procedure test_leds() ---------------------------------------------------- sequence led_state = {0,0,0,0} atom delay = 0.02 for i = 1 to 10 do digitalWrite(0, 1) sleep(delay) digitalWrite(1, 1) sleep(delay) digitalWrite(2, 1) sleep(delay) digitalWrite(3, 1) sleep(delay) digitalWrite(0, 0) sleep(delay) digitalWrite(1, 0) sleep(delay) digitalWrite(2, 0) sleep(delay) digitalWrite(3, 0) sleep(delay) end for digitalWrite(3, 0) end procedure ---------------------------------------------------- function read_buttons() ---------------------------------------------------- integer b, which_button = 0 for i = 4 to 7 do b = digitalRead(i) if b > 0 then which_button = i exit end if end for --if which_button = 8 then -- which_button =7 --end if return which_button end function ---------------------------------------------------- procedure test_buttons() ---------------------------------------------------- sequence buttons_pressed = {0,0,0,0} integer b, all_pressed = 0 atom delay = 0.2 while 1 do b = read_buttons() if b > 0 then digitalWrite(b-4, 1) buttons_pressed[b-3] = 1 end if for i = 1 to 4 do if buttons_pressed[i] = 1 then all_pressed += 1 end if end for if all_pressed = 4 then digitalWrite(0, 0) sleep(delay) digitalWrite(1, 0) sleep(delay) digitalWrite(2, 0) sleep(delay) digitalWrite(3, 0) sleep(delay) exit end if all_pressed = 0 end while end procedure ---------------------------------------------------- procedure test_buzzer() ---------------------------------------------------- softToneWrite(8,880) sleep(0.25) softToneWrite(8,440) sleep(0.25) softToneWrite(8,220) sleep(0.25) softToneWrite(8,0) end procedure ---------------------------------------------------- function get_switch_sequence(sequence lights_sequence) ---------------------------------------------------- sequence switches = repeat(-1,200) integer b, button_pressed, current_s = 0 while 1 do current_s += 1 if lights_sequence[current_s] = -1 then exit end if while 1 do button_pressed = 0 for i = 4 to 7 do b = digitalRead(i) if b > 0 then button_pressed = i exit end if end for if button_pressed > 0 then switches[current_s] = button_pressed -3 digitalWrite(button_pressed - 4, 1) softToneWrite(8, pitches[switches[current_s] * 2]) sleep(0.25) digitalWrite(button_pressed - 4, 0) softToneWrite(8, 0) exit end if end while end while return switches end function ---------------------------------------------------- procedure show_lights_sequence(sequence lights) ---------------------------------------------------- atom dlay dlay = 0.5 for i = 1 to length(lights) do if lights[i] = -1 then exit end if dlay -= 0.02 if dlay < 0.1 then dlay = 0.1 end if end for for i = 1 to length(lights) do if lights[i] = -1 then exit end if digitalWrite(lights[i] - 1, 1) softToneWrite(8, pitches[lights[i] * 2]) sleep(dlay) softToneWrite(8, 0) digitalWrite(lights[i] - 1, 0) sleep(0.2) end for end procedure ---------------------------------------------------- procedure next_round_bing() ---------------------------------------------------- digitalWrite(0, 1) digitalWrite(1, 1) digitalWrite(2, 1) digitalWrite(3, 1) softToneWrite(8,880) sleep(0.3) softToneWrite(8,0) digitalWrite(0, 0) digitalWrite(1, 0) digitalWrite(2, 0) digitalWrite(3, 0) sleep(0.025) end procedure ---------------------------------------------------- procedure failure() ---------------------------------------------------- for i = 1 to 5 do digitalWrite(0, 1) digitalWrite(1, 1) digitalWrite(2, 1) digitalWrite(3, 1) softToneWrite(8,100) sleep(0.5) digitalWrite(0, 1) digitalWrite(1, 1) digitalWrite(2, 1) digitalWrite(3, 1) softToneWrite(8,0) sleep(0.2) end for end procedure ---------------------------------------------------- procedure next_round_announce() --you can do what you like here! ---------------------------------------------------- --turn of all the leds digitalWrite(0, 0) digitalWrite(1, 0) digitalWrite(2, 0) digitalWrite(3, 0) for i = 1 to 5 do digitalWrite(0, 1) softToneWrite(8,pitches[6]) sleep(0.1) digitalWrite(1, 1) softToneWrite(8,pitches[7]) sleep(0.1) digitalWrite(2, 1) softToneWrite(8,pitches[8]) sleep(0.1) digitalWrite(3, 1) softToneWrite(8,pitches[9]) sleep(0.1) digitalWrite(0, 0) digitalWrite(1, 0) digitalWrite(2, 0) digitalWrite(3, 0) end for softToneWrite(8,0) end procedure ---------------------------------------------------- procedure game_start() ---------------------------------------------------- sequence lights = repeat(-1, 200), switches --lights and switches must match on test integer correct, score, b, button_pressed clear_screen() if HAVE_FIGLET then system(sprintf("figlet -c Ready - copy the sequence!",{})) else printf(1, "Ready - copy the sequence...\n", {}) end if next_round_announce() sleep(0.7) while 1 do --game loop for i = 1 to 200 do if lights[i] = -1 then lights[i] = floor(rand(4)) score = i exit end if end for show_lights_sequence(lights) switches = get_switch_sequence(lights) --compare switches to lights correct = 1 for i = 1 to length(lights) do if lights[i] = -1 then exit end if if lights[i] != switches[i] then correct = 0 exit end if end for sleep(0.2) /* for i = 1 to length(lights) do if lights[i] = -1 then exit end if printf(1, "%d, %d\n", {lights[i], switches[i]}) end for */ if correct = 1 then next_round_bing() sleep(0.75) else failure() clear_screen() if HAVE_FIGLET then system(sprintf("figlet -c Correct sequence!",{})) else printf(1, "Correct sequence...\n", {}) end if digitalWrite(0, 0) digitalWrite(1, 0) digitalWrite(2, 0) digitalWrite(3, 0) show_lights_sequence(lights) --show correct sequence clear_screen() if HAVE_FIGLET = 0 then printf(1, "You scored %d\nPress a button to try again.\n", {score}) else system(sprintf("figlet -c Score : %d", {score}), 0) system(sprintf("figlet -c Press a button to retry", {}), 0) end if lights = repeat(-1, 200) while 1 do button_pressed = 0 for i = 4 to 7 do b = digitalRead(i) if b > 0 then button_pressed = i --start next round clear_screen() if HAVE_FIGLET then system(sprintf("figlet -c Ready - copy the sequence!",{})) else printf(1, "Ready - copy the sequence...\n", {}) end if next_round_announce() exit end if end for if button_pressed > 0 then sleep(0.7) exit end if end while end if end while end procedure ---------------------------------------------------- procedure check_figlet() --you can skip this test if you know you have figlet ---------------------------------------------------- integer fp object fig --if you have figlet uncomment this --HAVE_FIGLET = 1 return puts(1, "\n\n**Checking for figlet, have patience!\n\n") system("whereis figlet > figloc.txt", 0) fig = dir("figloc.txt") if fig[1][D_SIZE] > 15 then HAVE_FIGLET = 1 end if delete_file("figloc.txt") end procedure ---------------------------------------------------- procedure main() ---------------------------------------------------- check_figlet() --these are the initial test --test_leds() clear_screen() --if HAVE_FIGLET then -- system(sprintf("figlet -c Press all the buttons!",{}), 0) --else -- puts(1, "Press all the buttons....\n") --end if --test_buttons() --test_buzzer() if HAVE_FIGLET then system(sprintf("figlet -c Ready to start!", {}), 0) else puts(1, "Ready to start!!....\n") end if game_start() end procedure main()