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() 
 

Search



Quick Links

User menu

Not signed in.

Misc Menu