Magic Switchboard
This module is part of the original MMBasic library. It is reproduced here with kind permission of Hugh Buckle and Geoff Graham. Be aware it may reference functionality which has changed or is deprecated in the latest versions of MMBasic.
Magic Switchboard
This is rewrite of the magic switchboard program to suit MMbasic. The original was written by Picaxe technical for the picaxe 18x.
This program uses four input switches connected to pins 11, 12, 13 and 14 and the output (either white LEDs with colour tops or 6V coloured lamps) connected to Pins 15,16,17 and 18. The lamps require driver transistors. The schematic of the Magic Switchboard is in the attached file and you can see a demonstration of it at www.youtube.com/watch?v=0lGP8nQLANU. It is truly amazing.
Regards Bill Brown
' Magic Switchboard - original source by "Technical" from PicAxe Forum ' Modified for PicAxe 18x by Wayne Thomason of Addison, TX USA ' 7/15/2009 ' Modified for Maximite MMBasic by Bill Brown bill.b ' 19/01/2012 ' ' mods: 1. Now is easily configurable via switch? and bulb? variables ' 2. "timeout" functions even without learning all 4 switches ' 3. starting point and sequence direction dependent on last switch turned off ' 4. Now has Audience_lockdown feature. If power is turned on while switch-4 ' is set, each light will respond only to corresponding switch position ' until circuit is reset. ' ' Assumptions ' 1. Times out after 10 seconds of all switches in the off position ' regardless of whether all switches are learned yet ' 2. All switches must be off at start ' (If switch 4 on when started, it starts up in audience-mode.) ' 3. All 4 switches must be switched on before that sequence is learned ' 4. Set bulb/LED outputs using bulb1, bulb2, bulb3 & bulb4 ' 5. Set switch inputs using switch1, switch2, switch3 and switch4 ' 6. first pattern is left to right, bulbs 1, 2, 3, 4 ' 7. subsequent patterns are determined by last SWITCH turned off: ' Switch 1 = 1234 order (bulb 1 first, then right in sequence) ' Switch 2 = 2143 order (bulb 2 first, then left in sequence, wrapping after first) ' Switch 3 = 3412 order (bulb 3 first, then right in sequence, wrapping after last) ' Switch 4 = 4321 order (bulb 4 first, then left in sequence) timeout = 750 'loop reset time approx 10 seconds timeout_counter = 0 SetPin 11,2 SetPin 12,2 SetPin 13,2 SetPin 14,2 SetPin 15,8 SetPin 16,8 SetPin 17,8 SetPin 18,8 Pin(15) = 0:Pin(16)=0:Pin(17)=0:Pin(18)=0 If Pin(14) = 1 Then GoTo Audience_Lockdown starting_lite = 1 ' Start of program do_reset: ' reset position counter If starting_lite = 1 Then position = 0 ' if starting with bulb 1, position reset to 0. EndIf If starting_lite = 2 Then position = 1 ' if starting with bulb 2, position reset to 1. EndIf If starting_lite = 3 Then position = 2 ' if starting with bulb 3, position reset to 2. EndIf If starting_lite = 4 Then position = 3 ' if starting with bulb 4, position reset to 3. EndIf flag0 = 0 : flag1 = 0 :flag2 = 0:flag3 = 0 ' Learning loop waiting_to_learn_loop: If (Pin(11) = 1) And (flag0 = 0) Then GoTo learn0 If (Pin(12) = 1) And (flag1 = 0) Then GoTo learn1 If (Pin(13) = 1) And (flag2 = 0) Then GoTo learn2 If (Pin(14) = 1) And (flag3 = 0) Then GoTo learn3 ' we have learnt that switch so light output accordingly If flag0 = 1 Then If Pin(11) = 1 Then Pin(light0) = 1 Else Pin(light0) = 0 EndIf EndIf If flag1 = 1 Then If Pin(12) = 1 Then Pin(light1) = 1 Else Pin(light1) = 0 EndIf EndIf If flag2 = 1 Then If Pin(13) = 1 Then Pin(light2) = 1 Else Pin(light2) = 0 EndIf EndIf If flag3 = 1 Then If Pin(14) = 1 Then Pin(light3) = 1 Else Pin(light3) = 0 EndIf EndIf If (Pin(11) = 0) And (Pin(12) = 0) And (Pin(13) = 0) And (Pin(14) = 0) Then Pause 10 timeout_counter = timeout_counter + 1 If timeout_counter > timeout Then timeout_counter = 0 GoTo do_reset EndIf Else timeout_counter = 0 EndIf GoTo waiting_to_learn_loop ' Learn a light position and set flag so we know that switch is done learn0: GoSub bulbset flag0 = 1 light0 = bulb GoTo learn_end learn1: GoSub bulbset flag1 = 1 light1 = bulb GoTo learn_end learn2: GoSub bulbset flag2 = 1 light2 = bulb GoTo learn_end learn3: GoSub bulbset flag3 = 1 light3 = bulb GoTo learn_end learn_end: If starting_lite = 1 Then 'if starting with 1st lamp, sequence = 1-2-3-4 position = position + 1 If position > 3 Then GoTo have_learnt_all GoTo waiting_to_learn_loop EndIf If starting_lite = 2 Then 'if starting with 2nd lamp, sequence = 2-1-4-3 If position > 0 Then 'don't dec if position=0, will cause error position = position - 1 Else position = 3 EndIf If position = 1 Then GoTo have_learnt_all GoTo waiting_to_learn_loop EndIf If starting_lite = 3 Then 'if starting with 3rd lamp, sequence = 3-4-1-2 position = position + 1 If position > 3 Then position = 0 EndIf If position = 2 Then GoTo have_learnt_all GoTo waiting_to_learn_loop EndIf If starting_lite = 4 Then 'if starting with 4th lamp, sequence = 4-3-2-1 If position > 0 Then position = position - 1 Else GoTo have_learnt_all EndIf GoTo waiting_to_learn_loop EndIf ' now simply loop reacting to the switches ' timeout_counter value will increment every 10ms ' however if any light is on the timeout_counter is reset ' so this means the timeout will only ' occur after 10 secoonds of all switches off have_learnt_all: If Pin(11) = 1 Then Pin(light0) = 1 timeout_counter = 0 Else Pin(light0) = 0 EndIf If Pin(12) = 1 Then Pin(light1) = 1 timeout_counter = 0 Else Pin(light1) = 0 EndIf If Pin(13) = 1 Then Pin(light2) = 1 timeout_counter = 0 Else Pin(light2) = 0 EndIf If Pin(14) = 1 Then Pin(light3) = 1 timeout_counter = 0 Else Pin(light3) = 0 EndIf If (flag0=1) And (flag1=1) And (flag2=1) And (flag3=1) Then all_flags = 1 EndIf If (all_flags=1) And (Pin(11)=1) And (Pin(12)=0) And (Pin(13)=0) And Pin(14)=0) Then starting_lite = 1 EndIf If (all_flags=1) And (Pin(11)=0) And (Pin(12)=1) And (Pin(13)=0) And Pin(14)=0) Then starting_lite = 2 EndIf If (all_flags=1) And (Pin(11)=0) And (Pin(12)=0) And (Pin(13)=1) And Pin(14)=0) Then starting_lite = 3 EndIf If (all_flags=1) And (Pin(11)=0) And (Pin(12)=0) And (Pin(13)=0) And Pin(14)=1) Then starting_lite = 4 EndIf Rem Print starting_lite;all_flags Pause 10 timeout_counter = timeout_counter + 1 If timeout_counter > timeout Then GoTo do_reset GoTo have_learnt_all bulbset: If position = 0 Then bulb = 15 EndIf If position = 1 Then bulb = 16 EndIf If position = 2 Then bulb = 17 EndIf If position = 3 Then bulb = 18 EndIf Rem Print position;bulb Return audience_lockdown: If Pin(11) = 1 Then Pin(15) = 1 Else Pin(15) = 0 EndIf If Pin(12) = 1 Then Pin(16) = 1 Else Pin(16) = 0 EndIf If Pin(13) = 1 Then Pin(17) = 1 Else Pin(17) = 0 EndIf If Pin(14) = 1 Then Pin(18) = 1 Else Pin(18) = 0 EndIf GoTo audience_lockdown