├── MorseCodeCreator.py ├── MusicTest.py ├── NES2USB.py ├── PicoInvadersWithButtons.py ├── ProximityDetector.py ├── ReadTemp.py ├── WebHost with ssd1306 Example Pico.py ├── Webhost Example Pico.py └── picoinvaders.py /MorseCodeCreator.py: -------------------------------------------------------------------------------- 1 | from machine import Pin, PWM 2 | from time import sleep 3 | # Create a dictionary of Morse Code. s is for Short (or dots), l is for Long (or dashes) 4 | MorseCodes = { 5 | ' ': '', 6 | 'a': 'sl', 7 | 'b': 'lsss', 8 | 'c': 'lsls', 9 | 'd': 'lss', 10 | 'e': 's', 11 | 'f': 'ssls', 12 | 'g': 'lls', 13 | 'h': 'ssss', 14 | 'i': 'ss', 15 | 'j': 'slll', 16 | 'k': 'lsl', 17 | 'l': 'slss', 18 | 'm': 'll', 19 | 'n': 'ls', 20 | 'o': 'lll', 21 | 'p': 'slls', 22 | 'q': 'llsl', 23 | 'r': 'sls', 24 | 's': 'sss', 25 | 't': 'l', 26 | 'u': 'ssl', 27 | 'v': 'sssl', 28 | 'w': 'sll', 29 | 'x': 'lssl', 30 | 'y': 'lsll', 31 | 'z': 'llss', 32 | '1': 'sllll', 33 | '2': 'sslll', 34 | '3': 'sssll', 35 | '4': 'ssssl', 36 | '5': 'sssss', 37 | '6': 'lssss', 38 | '7': 'llsss', 39 | '8': 'lllss', 40 | '9': 'lllls', 41 | '0': 'lllll'} 42 | 43 | button = Pin(10, Pin.IN, Pin.PULL_UP) 44 | shortled = Pin(11, Pin.OUT) 45 | longled = Pin(12, Pin.OUT) 46 | speaker = PWM(Pin(13)) 47 | 48 | fast = 0.1 49 | slow = 0.2 50 | 51 | sound = True 52 | light = True 53 | pitch = 600 54 | volume = 1500 55 | speaker.freq(600) #pitch of sound. Higher number is higher pitch 56 | 57 | shortled.low() 58 | longled.low() 59 | 60 | def letterlookup(stringvalue): 61 | for k in MorseCodes: 62 | if MorseCodes[k] == stringvalue: 63 | return k 64 | return " " 65 | 66 | def blinkletter(letter): 67 | 68 | if letter != "": 69 | currentletter = MorseCodes[letter] 70 | if letter == " ": 71 | sleep(0.6) 72 | return 73 | 74 | print(letter + " : " + currentletter) 75 | for c in currentletter: 76 | if (c == 'l'): 77 | blinkspeed = slow 78 | if (c =='s'): 79 | blinkspeed = fast 80 | if light : shortled.high() 81 | if sound : 82 | speaker.freq(pitch) 83 | speaker.duty_u16(volume) 84 | sleep(blinkspeed) 85 | if light : shortled.low() 86 | if sound : speaker.duty_u16(0) 87 | sleep(blinkspeed) 88 | 89 | sleep(0.6) 90 | 91 | def playmessage(message): 92 | for c in message: 93 | blinkletter(str.lower(c)) 94 | 95 | def recordmessage(): 96 | print("start typing your Morse Code message! Wait 5 seconds to exit") 97 | TimeCount = 0 98 | DelayCount = 0 99 | CurrentLetter = "" 100 | CurrentWord = "" 101 | PreviousStatus = 1 102 | while True: 103 | if button.value() == 0: #Button being pressed 104 | DelayCount = 0 105 | TimeCount += 1 106 | if TimeCount <= 15: #Its a short press! 107 | shortled.high() 108 | longled.low() 109 | 110 | elif TimeCount > 15: #Its a Long Press! 111 | shortled.low() 112 | longled.high() 113 | 114 | if PreviousStatus != button.value(): 115 | speaker.duty_u16(1500) 116 | 117 | elif button.value() == 1: #Button not being pressed 118 | speaker.duty_u16(0) 119 | shortled.low() 120 | longled.low() 121 | if TimeCount > 0: 122 | if TimeCount <= 15: 123 | CurrentLetter = CurrentLetter + "s" 124 | elif TimeCount > 15: 125 | CurrentLetter = CurrentLetter + "l" 126 | TimeCount = 0 127 | DelayCount = DelayCount + 1 128 | if DelayCount > 60: 129 | if CurrentLetter != "": 130 | CurrentWord = CurrentWord + letterlookup(CurrentLetter) 131 | CurrentLetter = "" 132 | print(CurrentWord) 133 | if DelayCount == 300: #Add a space 134 | CurrentWord = CurrentWord + " " 135 | if DelayCount == 500: 136 | print("You recorded " + CurrentWord) 137 | print("Exiting recording mode") 138 | return 139 | sleep(0.01) 140 | 141 | -------------------------------------------------------------------------------- /MusicTest.py: -------------------------------------------------------------------------------- 1 | from machine import PWM, Pin 2 | from time import sleep 3 | 4 | MusicNotes = {"B0": 31, "C1": 33,"CS1": 35,"D1": 37,"DS1": 39,"E1": 41,"F1": 44,"FS1": 46,"G1": 49,"GS1": 52,"A1": 55,"AS1": 58,"B1": 62, 5 | "C2": 65,"CS2": 69,"D2": 73,"DS2": 78,"E2": 82,"F2": 87,"FS2": 93,"G2": 98,"GS2": 104,"A2": 110,"AS2": 117,"B2": 123,"C3": 131,"CS3": 139, 6 | "D3": 147,"DS3": 156,"E3": 165,"F3": 175,"FS3": 185,"G3": 196,"GS3": 208,"A3": 220,"AS3": 233,"B3": 247,"C4": 262,"CS4": 277,"D4": 294, 7 | "DS4": 311,"E4": 330,"F4": 349,"FS4": 370,"G4": 392,"GS4": 415,"A4": 440,"AS4": 466,"B4": 494,"C5": 523,"CS5": 554,"D5": 587,"DS5": 622, 8 | "E5": 659,"F5": 698,"FS5": 740,"G5": 784,"GS5": 831,"A5": 880,"AS5": 932,"B5": 988,"C6": 1047,"CS6": 1109,"D6": 1175,"DS6": 1245,"E6": 1324, 9 | "F6": 1397,"FS6": 1480,"G6": 1568,"GS6": 1661,"A6": 1760,"AS6": 1865,"B6": 1976,"C7": 2093,"CS7": 2217,"D7": 2349,"DS7": 2489,"E7": 2637, 10 | "F7": 2794,"FS7": 2960,"G7": 3136,"GS7": 3322,"A7": 3520,"AS7": 3729,"B7": 3951,"C8": 4186,"CS8": 4435,"D8": 4699,"DS8": 4978} 11 | 12 | 13 | mario = ["E7", "E7", "0", "E7", "0", "C7", "E7", "0", "G7", "0", "0", "0", "G6", "0", "0", "0", "C7", "0", "0", "G6", "0", "0", "E6", 14 | "0", "0", "A6", "0", "B6", "0", "AS6", "A6", "0", "G6", "E7", "0", "G7", "A7", "0", "F7", "G7", "0", "E7", "0","C7", "D7", 15 | "B6", "0", "0", "C7", "0", "0", "G6", "0", "0", "E6", "0", "0", "A6", "0", "B6", "0", "AS6", "A6", "0", "G6", "E7", "0", "G7", 16 | "A7", "0", "F7", "G7", "0", "E7", "0","C7", "D7", "B6", "0", "0"] 17 | 18 | hotcrossedbuns = ["E3", "0", "D3", "0", "C3", "0", "S", "E3", "0", "D3", "0", "C3", "0", "S", "C3", "C3", "C3", "C3", "D3", "D3", "D3", "D3", "S", "E3", "0", "D3", "0", "C3", "0"] 19 | 20 | speaker = PWM(Pin(13)) 21 | greenled = Pin(12, Pin.OUT) 22 | blueled = Pin(11, Pin.OUT) 23 | def playnote(Note, Duration): 24 | 25 | if Note == "0": 26 | sleep(Duration) 27 | if Note == "S": 28 | speaker.duty_u16(0) 29 | sleep(Duration) 30 | elif Note != "0": 31 | speaker.duty_u16(0) 32 | sleep(0.05) 33 | greenled.toggle() 34 | blueled.toggle() 35 | speaker.duty_u16(1500) 36 | 37 | speaker.freq(MusicNotes[Note]) 38 | sleep(Duration) 39 | 40 | greenled.high() 41 | blueled.low() 42 | for c in hotcrossedbuns: 43 | playnote(c, 0.4) 44 | 45 | speaker.duty_u16(0) 46 | 47 | -------------------------------------------------------------------------------- /NES2USB.py: -------------------------------------------------------------------------------- 1 | import digitalio 2 | import usb_hid 3 | from adafruit_hid.keyboard import Keyboard 4 | from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS 5 | from adafruit_hid.gamepad import Gamepad 6 | from adafruit_hid.keycode import Keycode 7 | from time import sleep 8 | import board 9 | 10 | gamepad = Gamepad(usb_hid.devices) 11 | 12 | button_status = {'up' : 0, 'down' : 0, 'left' : 0, 'right' : 0, 'select' : 0, 'start' : 0, 'a' : 0, 'b' : 0} 13 | buttons = {0 : 'a', 1 : 'b', 2 : 'select', 3 : 'start', 4 : 'up', 5 : 'down', 6 : 'left', 7 : 'right'} 14 | 15 | keyboard_buttons = {'up' : Keycode.UP_ARROW, 'down' : Keycode.DOWN_ARROW, 'left' : Keycode.LEFT_ARROW, 'right' : Keycode.RIGHT_ARROW, 16 | 'a' : Keycode.LEFT_CONTROL, 'b' : Keycode.SPACE, 'select' : Keycode.LEFT_ALT, 'start' : Keycode.ENTER} 17 | 18 | mode = 1 # 1 for Keyboard Emulation, 2 for Joystick 19 | latch = digitalio.DigitalInOut(board.GP5) 20 | clock = digitalio.DigitalInOut(board.GP4) 21 | data = digitalio.DigitalInOut(board.GP6) 22 | 23 | latch.direction = digitalio.Direction.OUTPUT 24 | clock.direction = digitalio.Direction.OUTPUT 25 | data.direction = digitalio.Direction.INPUT 26 | 27 | data.pull = digitalio.Pull.UP 28 | 29 | keyboard = Keyboard(usb_hid.devices) 30 | layout = KeyboardLayoutUS(keyboard) 31 | latch.value = False 32 | clock.value = False 33 | previousState = False 34 | 35 | delaytime = 0.0001 36 | 37 | while True: 38 | latch.value = True 39 | sleep(delaytime) 40 | latch.value = False 41 | sleep(delaytime) 42 | button_status[buttons[0]] = data.value 43 | for x in range(0, 7, 1): 44 | clock.value = True 45 | sleep(delaytime) 46 | clock.value = False 47 | sleep(delaytime) 48 | button_status[buttons[x + 1]] = data.value 49 | if button_status['select'] == False and button_status['start'] == False and button_status['up'] == False: 50 | if mode == 2: 51 | mode = 1 52 | else: 53 | mode = 2 54 | keyboard.release_all() 55 | print(mode) 56 | sleep(0.3) 57 | press_buttons = [] 58 | release_buttons = [] 59 | for x in buttons: 60 | if mode == 2: 61 | if button_status[buttons[x]] == True: 62 | gamepad.release_buttons(x + 1) 63 | else: 64 | gamepad.press_buttons(x + 1) 65 | else: 66 | if button_status[buttons[x]] == True: 67 | release_buttons.append(keyboard_buttons[buttons[x]]) 68 | else: 69 | press_buttons.append(keyboard_buttons[buttons[x]]) 70 | 71 | if mode == 1: 72 | keyboard.press(*press_buttons) 73 | keyboard.release(*release_buttons) 74 | 75 | 76 | -------------------------------------------------------------------------------- /PicoInvadersWithButtons.py: -------------------------------------------------------------------------------- 1 | #Pico Invaders! 2 | # 3 | # TODO : Implement alien shots, Shields, Sound 4 | from machine import Pin, I2C, ADC, PWM 5 | from ssd1306 import SSD1306_I2C 6 | from time import sleep 7 | import framebuf 8 | import random 9 | 10 | WIDTH = 128 # oled display width 11 | HEIGHT = 64 # oled display height 12 | 13 | #up = Pin(2, Pin.IN, Pin.PULL_DOWN) # for future games 14 | #down = Pin(3, Pin.IN, Pin.PULL_DOWN) # for future games 15 | left = Pin(4, Pin.IN, Pin.PULL_UP) 16 | right = Pin(5, Pin.IN, Pin.PULL_UP) 17 | button1 = Pin(14, Pin.IN, Pin.PULL_UP) 18 | 19 | #removed for conversion to buttons 20 | 21 | #Pot = ADC(26) 22 | #conversion_factor = 3.3 / (65535) # Conversion from Pin read to proper voltage 23 | 24 | speaker = PWM(Pin(18)) 25 | 26 | i2c = I2C(0) # Init I2C using I2C0 defaults, SCL=Pin(GP9), SDA=Pin(GP8), freq=400000 27 | 28 | oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Init oled display 29 | 30 | lowres = True 31 | 32 | if lowres == True: 33 | #smaller alien sprites. set spritex to 5 and spritey to 5 34 | inv1a = bytearray(b"\xd0xPx\xf0") 35 | inv1b = bytearray(b"\xf0xPx\xd0") 36 | inv2a = bytearray(b"\xe0P\xf8P\xe0") 37 | inv2b = bytearray(b"`\xd0x\xd0`") 38 | spritex = 5 #how big are your alien sprites? 39 | spritey = 5 40 | aliencountx = 4 #How many rows and columns of aliens 41 | aliencounty = 5 42 | alienspacingx = 5 43 | alienspacingy = 3 44 | else: 45 | #sprite definitions for Aliens. set spritex and spritey to 7 46 | inv1a = bytearray(b"~\xd8\x88\xf8\x88\xd8~") 47 | inv1b = bytearray(b"|\xda\xc8\xf8\xc8\xda|") 48 | inv2a = bytearray(b"\x88\\:\x1e:\\\x88") 49 | inv2b = bytearray(b"\x08\\\xba\x1e\xba\\\x08") 50 | spritex = 7 #how big are your alien sprites? 51 | spritey = 7 52 | aliencountx = 4 #How many rows and columns of aliens 53 | aliencounty = 4 54 | alienspacingx = 3 55 | alienspacingy = 3 56 | logo = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x01\xff\x80\x00\x07\xbd\xe0\x00\x00\x00\x00\x03\xe0\x00\x00\x00\x01\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x01\x08\x80\x00\x00\x01\xef\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x01\x08\x80\x00\x00\x01\xef\x00\x00\x00\x00\xff\xfc\x07\xff\xe0\x01\x08\x80\x00\x00\x01\xef\x00\x00\x00\x00\xff\xfc\x07\xff\xe0\x01\x08\x80\x00\x00\x01\xef\x00\x00\x00\x00\x00\x00\x07\xff\xe0\x01\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x008\xe0\x00\xf7\x00\x00\x07\xbd\xefx\x1e\x00\x02\xff\x00\x00\x18\xe0\x00\x00\x00\x00\x07\xbd\xefx\x1e\x00?\xff\x00\x00?\xe0\x00\x0c\x00\x00\x07\xbd\xefx\x1e\x00?\xd0\x00\x00\x1f\xc0\x08<\x00\x00\x07\xbd\xefx\x1e\x00<\x00\x00\x00\x0f\x80\x0c\xf0\x00\x00\x00\x00\x00\x00\x00\x00?\xff\x00\x00\x00\x00\x07\xc0\x00\x00\xf0=\xe0{\xc0\x00?\xff\x00\x00\x00\x00\x03\xc0\x00\x00\xf0=\xe0{\xc0\x00\x00\xbf\x00\x00\x00\x00\x00\xf0\x00\x00\xf0=\xe0{\xc0\x00\x00\x00\x00\x00\x00\x00\x00<\x00\x00\xf0=\xe0{\xc0\x00\x00`\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xc0\x07\xff\xe0\x00\x00\x00\x00\xf0=\xefx\x00\x00\x00\x7f\xfe\x07\xff\xe0\x00\x00\x00\x00\xf0=\xefx\x00\x00\x00\x1e\xfe\x07\xff\xe0\x00\x00\x00\x00\xf0=\xefx\x00\x00\x00\x18\x1e\x00\x00\x00\x00\x00\x00\x00\xf0=\xefx\x00\x00\x00?\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xfe\x00\x00\x00\x01\xff\x80\x00\x00=\xefx\x00\x00\x00\x7f\x80\x00\x00\x00\x01\xff\x80\x00\x00=\xefx\x00\x00\x00@\x00\x00\x00\x00\x00\x10\x80\x00\x00=\xefx\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x80\x00\x00=\xefx\x00\x00?\xff\x00\x01\xff\x80\x00\x10\x80\x00\x00\x00\x00\x00\x00\x00?\xff\x00\x03\xff\xc0\x00\x10\x80\x00\xf0=\xefx\x00\x00?\xff\x00\x07\xff\xe0\x00\x1f\x80\x00\xf0=\xefx\x00\x008\x07\x00\x07\x00\xe0\x00\x0f\x00\x00\xf0=\xefx\x00\x000'\x00\x06\x00\xe0\x00\x00\x00\x00\xf0=\xefx\x00\x00?\xff\x00\x07\xe7\xe0\x01\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xfe\x00\x03\xe3\xc0\x01\xfc\x00\x00\xf0=\xe0{\xc0\x00\x0f\xfc\x00\x01\xe3\x80\x00\x04\x00\x00\xf0=\xe0{\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\xf0=\xe0{\xc0\x00\x00\x7f\xfe\x00\x00\x00\x01\xfc\x00\x00\xf0=\xe0{\xc0\x00\x00\x7f\xfe\x00\x00\x00\x01\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xfe\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xefx\x1e\x00\x00q\xce\x01\xff\x80\x00\x00\x00\x00\x07\xbd\xefx\x1e\x00\x00`\xc6\x03\xff\xc0\x01\xff\x80\x00\x07\xbd\xefx\x1e\x00\x00p\x8e\x07\xff\xe0\x01\xff\x80\x00\x07\xbd\xefx\x1e\x00\x00\x00\x00\x07\x00\xe0\x00\x10\x80\x00\x00\x00\x00\x00\x00\x00\xff\xfc\x00\x06\x04\xe0\x00\x10\x80\x00\x00\x01\xef\x00\x00\x00\xff\xfc\x00\x07\xff\xe0\x00\x10\x80\x00\x00\x01\xef\x00\x00\x00\xff\xfc\x00\x03\xff\xc0\x00\x10\x80\x00\x00\x01\xef\x00\x00\x00\x03\x9c\x00\x01\xff\x80\x00\x1f\x80\x00\x00\x01\xef\x00\x00\x00\t\x9c\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\xfe\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\xfep\x00\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\x00\x1cx\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x00\x00\x00") 57 | 58 | ship = bytearray(b" p\xf8l>//>l\xf8p ") 59 | ufo = bytearray(b"\x0c\x00>\x80\x1d\x80\r\xe0\x1d\xc0\x15\x80>\x80\x0c\x00") 60 | 61 | num0 = bytearray(b"\x7f\x80\xff\xc0\x80@\x80@\xff\xc0\x7f\x80") 62 | num1 = bytearray(b"\x00\x00\x00\x80\x00\x80\xff\xc0\xff\xc0\x00\x00") 63 | num2 = bytearray(b"\xe1\x80\xf1\xc0\x98@\x8c@\x87\xc0\x83\x80") 64 | num3 = bytearray(b"@\x80\xc0\xc0\x84@\x84@\xff\xc0{\x80") 65 | num4 = bytearray(b"0\x00<\x00/\x00#\x80\xff\xc0\xff\xc0") 66 | num5 = bytearray(b"O\xc0\xcf\xc0\x84@\x84@\xfc@x@") 67 | num6 = bytearray(b"\x7f\x80\xff\xc0\x84@\x84@\xfc\xc0x\x80") 68 | num7 = bytearray(b"\x00@\xe0@\xfc@\x1f@\x03\xc0\x00\xc0") 69 | num8 = bytearray(b"{\x80\xff\xc0\x84@\x84@\xff\xc0{\x80") 70 | num9 = bytearray(b"G\x80\xcf\xc0\x88@\x88@\xff\xc0\x7f\x80") 71 | 72 | aliens = [] 73 | class Alien(object): 74 | 75 | def __init__(self, type, x, y): 76 | self.visible = True 77 | self.type = type 78 | self.x = x 79 | self.y = y 80 | self.origx = x 81 | self.origy = y 82 | 83 | def create_alien(type, x, y): 84 | alien = Alien(type, x, y) 85 | return alien 86 | 87 | def define_aliens(): 88 | type = "inv1a" #First row is type 1. 89 | for x in range (1, aliencountx + 1): 90 | for y in range (1, aliencounty + 1): 91 | aliens.append(create_alien(type, (120 - ((x * (spritex + alienspacingx)) - spritex)), (y * (spritey + alienspacingy)) - spritey)) 92 | if type == "inv1a": 93 | type = "inv2a" #Second row is type 2 94 | else: 95 | type = "inv1a" 96 | 97 | def reset_aliens(visibility): # Used to reset aliens to starting position and, optionally, visibility 98 | x = 1 99 | y = 1 100 | for c in aliens: 101 | if visibility: 102 | c.visible = True 103 | 104 | c.x = c.origx 105 | c.y = c.origy 106 | 107 | # Load images into framebuffer 108 | inv1aBuff = framebuf.FrameBuffer(inv1a, 7, 7, framebuf.MONO_HLSB) 109 | inv1bBuff = framebuf.FrameBuffer(inv1b, 7, 7, framebuf.MONO_HLSB) 110 | inv2aBuff = framebuf.FrameBuffer(inv2a, 7, 7, framebuf.MONO_HLSB) 111 | inv2bBuff = framebuf.FrameBuffer(inv2b, 7, 7, framebuf.MONO_HLSB) 112 | 113 | ufoBuff = framebuf.FrameBuffer(ufo, 12, 8, framebuf.MONO_HLSB) 114 | 115 | logoBuff = framebuf.FrameBuffer(logo, 128, 64, framebuf.MONO_HLSB) 116 | 117 | #Dictionary for lookup of digits for score, level, possibly lives 118 | numbers = { 119 | '0': framebuf.FrameBuffer(num0, 10, 6, framebuf.MONO_HLSB), 120 | '1': framebuf.FrameBuffer(num1, 10, 6, framebuf.MONO_HLSB), 121 | '2': framebuf.FrameBuffer(num2, 10, 6, framebuf.MONO_HLSB), 122 | '3': framebuf.FrameBuffer(num3, 10, 6, framebuf.MONO_HLSB), 123 | '4': framebuf.FrameBuffer(num4, 10, 6, framebuf.MONO_HLSB), 124 | '5': framebuf.FrameBuffer(num5, 10, 6, framebuf.MONO_HLSB), 125 | '6': framebuf.FrameBuffer(num6, 10, 6, framebuf.MONO_HLSB), 126 | '7': framebuf.FrameBuffer(num7, 10, 6, framebuf.MONO_HLSB), 127 | '8': framebuf.FrameBuffer(num8, 10, 6, framebuf.MONO_HLSB), 128 | '9': framebuf.FrameBuffer(num9, 10, 6, framebuf.MONO_HLSB)} 129 | 130 | shipBuff = framebuf.FrameBuffer(ship, 8, 12, framebuf.MONO_HLSB) 131 | # Clear the oled display in case it has junk on it. 132 | oled.fill(0) 133 | oled.blit(logoBuff, 0, 0) 134 | # Finally update the oled display so the image & text is displayed 135 | oled.show() 136 | 137 | sleep(2) 138 | 139 | addy = 3 #pixels of movement per turn on aliens 140 | 141 | shotx = 1 142 | shoty = 140 143 | loopCount = 0 144 | define_aliens() 145 | score = 0 146 | difficulty = 1 147 | showufo = False 148 | ufoy = 0 149 | ufoCount = 0 150 | soundfreq = 160 151 | shippos = 30 152 | while True: 153 | if showufo: 154 | if soundfreq == 1100: soundfreq = 2000 155 | else: soundfreq = 1100 156 | speaker.freq(soundfreq) 157 | speaker.duty_u16(2000) 158 | if shotx > 36 and showufo == False: speaker.duty_u16(0) 159 | ufoChance = random.randrange(1, 350, 1) # 1 in 1000 chance of running this loop that UFO will appear 160 | if ufoChance == 123 and showufo == False: 161 | showufo = True 162 | ufoy = 0 163 | if showufo: 164 | ufoy = ufoy + 1 165 | if ufoy > 64: 166 | showufo = False 167 | loopCount = loopCount + 1 168 | oled.fill(0) 169 | if loopCount > 16 - difficulty: 170 | if showufo == False: 171 | if soundfreq == 180: soundfreq = 160 172 | elif soundfreq == 160: soundfreq = 140 173 | elif soundfreq == 140: soundfreq = 120 174 | else: soundfreq = 180 175 | speaker.freq(soundfreq) 176 | speaker.duty_u16(2000) 177 | 178 | dropdown = False 179 | loopCount = 0 180 | for c in aliens: 181 | if c.visible == True: #switch between sprites to animate aliens 182 | if c.type == "inv1a": c.type = "inv1b" 183 | elif c.type == "inv1b": c.type = "inv1a" 184 | elif c.type == "inv2a": c.type = "inv2b" 185 | elif c.type =="inv2b": c.type = "inv2a" 186 | if c.y + addy > 56 or c.y + addy < 0: #are any of the visible invaders at the edge of the screen? 187 | if c.x - 3 < 20: #If they're at the bottom, reset their position 188 | reset_aliens(False) 189 | dropdown = False 190 | dropdown = True 191 | if dropdown == True: #move the aliens down if any of the visible ones hit the screen edge 192 | addy = addy * -1 193 | for c in aliens: 194 | c.x = c.x - 3 195 | else: 196 | for c in aliens: 197 | c.y = c.y + addy 198 | 199 | if left.value() == 0: 200 | if shippos > 1: 201 | shippos = shippos - 1 202 | 203 | if right.value() == 0: 204 | if shippos < 60: 205 | shippos = shippos + 1 206 | 207 | shotx = shotx + 2 208 | foundVisible = False #By default, assume all the aliens are dead 209 | if showufo: 210 | if shotx > 120 and shotx < 140: 211 | if shoty >= ufoy: 212 | if shoty < ufoy + 12: 213 | score = score + 50 214 | showufo = False 215 | ufoy = 0 216 | shotx = 140 217 | shoty = int(shippos) + 6 218 | 219 | for c in aliens: 220 | if shotx >= c.x and c.visible == True: #Collision detection for aliens with the shots 221 | if shotx - 4 <= c.x + 8: 222 | if shoty > c.y: 223 | if shoty <= c.y + 7: #You hit an alien! 224 | c.visible = False 225 | score = score + 10 226 | shotx = 140 227 | shoty = int(shippos) + 6 228 | if c.visible == True: 229 | foundVisible = True 230 | if c.type == "inv1a": #Display aliens 231 | oled.blit(inv1aBuff, c.x, c.y) #display animation frame 1, set to frame 2 for next time 232 | elif c.type == "inv1b": 233 | oled.blit(inv1bBuff, c.x, c.y) #display animation frame 2, set to frame 1 for next time 234 | elif c.type == "inv2a": 235 | oled.blit(inv2aBuff, c.x, c.y) #display animation frame 1, set to frame 2 for next time 236 | elif c.type == "inv2b": 237 | oled.blit(inv2bBuff, c.x, c.y) #display animation frame 2, set to frame 1 for next time 238 | if showufo: 239 | oled.blit(ufoBuff, 120, ufoy) 240 | if shotx > 130: 241 | if button1.value() == 0: 242 | shotx = 32 243 | shoty = int(shippos) + 6 244 | else: 245 | shotx = 140 246 | 247 | if foundVisible == False: # You finish the level! Increase the difficulty and reset the aliens 248 | if difficulty < 10: 249 | difficulty = difficulty + 1 250 | reset_aliens(True) 251 | 252 | oled.blit(shipBuff, 18, int(shippos)) # draw the ship 253 | oled.line(shotx, shoty, shotx - 4, shoty, 1) #draw the laser 254 | 255 | numcount = 0 #keeps track of the number of times through the loop! 256 | 257 | for c in str(score): 258 | oled.blit(numbers[c], 1, ((numcount * 7) + 2)) #Display the score, 1 digit at a time 259 | numcount = numcount + 1 260 | 261 | numcount = 0 262 | 263 | for c in str(difficulty): 264 | oled.blit(numbers[c], 1, 48 + ((numcount * 7) + 2)) #Display the level, 1 digit at a time 265 | numcount = numcount + 1 266 | 267 | oled.show() 268 | if shotx == 32 and showufo == False: 269 | speaker.duty_u16(0) 270 | speaker.freq(1000) 271 | speaker.duty_u16(2000) 272 | 273 | sleep(0.001) 274 | 275 | -------------------------------------------------------------------------------- /ProximityDetector.py: -------------------------------------------------------------------------------- 1 | from machine import Pin, PWM 2 | import utime 3 | 4 | pulse = Pin(18, Pin.OUT) 5 | receiver = Pin(26, Pin.IN, Pin.PULL_DOWN) 6 | 7 | speaker = PWM(Pin(19)) 8 | 9 | def CheckDistance(): 10 | SpeedOfSoundInMM = 0.343 11 | pulse.low() 12 | utime.sleep_us(20) 13 | pulse.high() 14 | utime.sleep_us(10) 15 | pulse.low() 16 | exitLoop = False 17 | loopcount = 0 #used as a failsafe if the signal doesn't return 18 | while receiver.value() == 0 and exitLoop == False: 19 | loopcount = loopcount + 1 20 | delaytime = utime.ticks_us() 21 | 22 | if loopcount > 3000 : exitLoop == True 23 | 24 | while receiver.value() == 1 and exitLoop == False: 25 | loopcount = loopcount + 1 26 | receivetime = utime.ticks_us() 27 | if loopcount > 3000 : exitLoop == True 28 | 29 | if exitLoop == True: #We failed somewhere 30 | return 0 31 | else: 32 | distance = ((receivetime - delaytime) * SpeedOfSoundInMM) / 2 33 | return distance 34 | 35 | while True: 36 | distance = CheckDistance() 37 | print(distance) 38 | if CheckDistance() < 2500: 39 | speaker.duty_u16(3000) 40 | speaker.freq(1700) 41 | utime.sleep(0.05) 42 | speaker.duty_u16(0) 43 | utime.sleep(CheckDistance() / 1000) 44 | 45 | 46 | -------------------------------------------------------------------------------- /ReadTemp.py: -------------------------------------------------------------------------------- 1 | from machine import ADC 2 | from time import sleep 3 | 4 | tempsensor = ADC(4) 5 | conversion_factor = 3.3 / (65535) # Conversion from Pin read to proper voltage 6 | 7 | while True: 8 | currentvoltage = tempsensor.read_u16() * conversion_factor 9 | temp = 27 - ((currentvoltage - 0.706)/0.001721) 10 | print(str(currentvoltage) + " : " + str(temp)) 11 | sleep(2) -------------------------------------------------------------------------------- /WebHost with ssd1306 Example Pico.py: -------------------------------------------------------------------------------- 1 | # Based on sample code provided here : 2 | # https://www.raspberrypi.com/news/how-to-run-a-webserver-on-raspberry-pi-pico-w/ 3 | 4 | import network 5 | import socket 6 | import time 7 | from machine import Pin, I2C 8 | from ssd1306 import SSD1306_I2C 9 | 10 | WIDTH = 128 # oled display width 11 | HEIGHT = 64 # oled display height 12 | 13 | i2c = I2C(0) # Init I2C using I2C0 defaults, SCL=Pin(GP9), SDA=Pin(GP8), freq=400000 14 | 15 | oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Init oled display 16 | 17 | 18 | ssid = 'MiKaH' 19 | password = 'camjam123' 20 | 21 | wlan = network.WLAN(network.STA_IF) 22 | wlan.active(True) 23 | wlan.connect(ssid, password) 24 | 25 | connectCount = 0 26 | 27 | #Default hosted website tex 28 | html = """ 29 | 30 |
31 | 36 |%s
39 | Print N Play Website 40 | 41 | 42 | """ 43 | 44 | max_wait = 10 45 | while max_wait > 0: 46 | if wlan.status() < 0 or wlan.status() >= 3: 47 | break 48 | max_wait -= 1 49 | print('waiting for connection...') 50 | time.sleep(1) 51 | 52 | if wlan.status() != 3: 53 | raise RuntimeError('network connection failed') 54 | else: 55 | print('connected') 56 | status = wlan.ifconfig() 57 | print( 'ip = ' + status[0] ) 58 | 59 | addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] 60 | 61 | s = socket.socket() 62 | s.bind(addr) 63 | s.listen(1) 64 | 65 | # Get current time 66 | import urequests 67 | r = urequests.get('http://worldtimeapi.org/api/ip') 68 | result = str(r.content) 69 | startTime = result[int(result.find("datetime")) + 11:30 + result.find("datetime")] 70 | oled.fill(0) 71 | oled.text("Start Time:", 1, 1) 72 | oled.text(startTime, 1, 11) 73 | oled.text("IP Address:", 1, 21) 74 | oled.text(str(status[0]), 1, 31) 75 | oled.show() 76 | 77 | print('Start Time', startTime) 78 | print('listening on', addr) 79 | 80 | # Listen for connections 81 | while True: 82 | try: 83 | cl, addr = s.accept() 84 | clientIP = addr[0] 85 | print('client connected from', clientIP) 86 | request = cl.recv(1024) 87 | 88 | oled.fill(0) 89 | oled.text("Start Time:", 1, 1) 90 | oled.text(startTime, 1, 11) 91 | oled.text("IP Address:", 1, 21) 92 | oled.text(str(status[0]), 1, 31) 93 | oled.text("Last Client IP:", 1, 41) 94 | oled.text(clientIP, 1, 51) 95 | oled.show() 96 | request = str(request) 97 | connectCount += 1 98 | countText = "This site has been accessed " + str(connectCount) + " time since " + startTime 99 | 100 | response = html % countText 101 | 102 | cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n') 103 | cl.send(response) 104 | cl.close() 105 | 106 | except OSError as e: 107 | cl.close() 108 | print('connection closed') -------------------------------------------------------------------------------- /Webhost Example Pico.py: -------------------------------------------------------------------------------- 1 | # Based on sample code provided here : 2 | # https://www.raspberrypi.com/news/how-to-run-a-webserver-on-raspberry-pi-pico-w/ 3 | 4 | import network 5 | import socket 6 | import time 7 | import urequests 8 | 9 | ssid = 'SSID' 10 | password = 'PASSWORD' 11 | 12 | #Default hosted website text 13 | html = """ 14 | 15 | 16 | 21 |%s
24 | Print N Play Website 25 | 26 | 27 | """ 28 | 29 | wlan = network.WLAN(network.STA_IF) 30 | wlan.active(True) 31 | wlan.connect(ssid, password) 32 | 33 | connectCount = 0 34 | 35 | 36 | 37 | max_wait = 10 38 | while max_wait > 0: 39 | if wlan.status() < 0 or wlan.status() >= 3: 40 | break 41 | max_wait -= 1 42 | print('waiting for connection...') 43 | time.sleep(1) 44 | 45 | if wlan.status() != 3: 46 | raise RuntimeError('network connection failed') 47 | else: 48 | print('connected') 49 | status = wlan.ifconfig() 50 | print( 'ip = ' + status[0] ) 51 | 52 | addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] 53 | 54 | s = socket.socket() 55 | s.bind(addr) 56 | s.listen(1) 57 | 58 | # Get current time 59 | r = urequests.get('http://worldtimeapi.org/api/ip') 60 | result = str(r.content) 61 | startTime = result[int(result.find("datetime")) + 11:30 + result.find("datetime")] 62 | 63 | 64 | print('Start Time', startTime) 65 | print('listening on', addr) 66 | 67 | # Listen for connections 68 | while True: 69 | try: 70 | cl, addr = s.accept() 71 | clientIP = addr[0] 72 | print('client connected from', clientIP) 73 | request = cl.recv(1024) 74 | request = str(request) 75 | connectCount += 1 76 | countText = "This site has been accessed " + str(connectCount) + " time since " + startTime 77 | 78 | response = html % countText 79 | 80 | cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n') 81 | cl.send(response) 82 | cl.close() 83 | 84 | except OSError as e: 85 | cl.close() 86 | print('connection closed') 87 | -------------------------------------------------------------------------------- /picoinvaders.py: -------------------------------------------------------------------------------- 1 | #Pico Invaders! 2 | # 3 | # TODO : Implement alien shots, Shields, Sound 4 | from machine import Pin, I2C, ADC, PWM 5 | from ssd1306 import SSD1306_I2C 6 | from time import sleep 7 | import framebuf 8 | import random 9 | 10 | WIDTH = 128 # oled display width 11 | HEIGHT = 64 # oled display height 12 | 13 | Pot = ADC(26) 14 | conversion_factor = 3.3 / (65535) # Conversion from Pin read to proper voltage 15 | 16 | speaker = PWM(Pin(18)) 17 | 18 | i2c = I2C(0) # Init I2C using I2C0 defaults, SCL=Pin(GP9), SDA=Pin(GP8), freq=400000 19 | 20 | oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Init oled display 21 | 22 | lowres = True 23 | 24 | if lowres == True: 25 | #smaller alien sprites. set spritex to 5 and spritey to 5 26 | inv1a = bytearray(b"\xd0xPx\xf0") 27 | inv1b = bytearray(b"\xf0xPx\xd0") 28 | inv2a = bytearray(b"\xe0P\xf8P\xe0") 29 | inv2b = bytearray(b"`\xd0x\xd0`") 30 | spritex = 5 #how big are your alien sprites? 31 | spritey = 5 32 | aliencountx = 4 #How many rows and columns of aliens 33 | aliencounty = 5 34 | alienspacingx = 5 35 | alienspacingy = 3 36 | else: 37 | #sprite definitions for Aliens. set spritex and spritey to 7 38 | inv1a = bytearray(b"~\xd8\x88\xf8\x88\xd8~") 39 | inv1b = bytearray(b"|\xda\xc8\xf8\xc8\xda|") 40 | inv2a = bytearray(b"\x88\\:\x1e:\\\x88") 41 | inv2b = bytearray(b"\x08\\\xba\x1e\xba\\\x08") 42 | spritex = 7 #how big are your alien sprites? 43 | spritey = 7 44 | aliencountx = 4 #How many rows and columns of aliens 45 | aliencounty = 4 46 | alienspacingx = 3 47 | alienspacingy = 3 48 | logo = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x01\xff\x80\x00\x07\xbd\xe0\x00\x00\x00\x00\x03\xe0\x00\x00\x00\x01\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x01\x08\x80\x00\x00\x01\xef\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x01\x08\x80\x00\x00\x01\xef\x00\x00\x00\x00\xff\xfc\x07\xff\xe0\x01\x08\x80\x00\x00\x01\xef\x00\x00\x00\x00\xff\xfc\x07\xff\xe0\x01\x08\x80\x00\x00\x01\xef\x00\x00\x00\x00\x00\x00\x07\xff\xe0\x01\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x008\xe0\x00\xf7\x00\x00\x07\xbd\xefx\x1e\x00\x02\xff\x00\x00\x18\xe0\x00\x00\x00\x00\x07\xbd\xefx\x1e\x00?\xff\x00\x00?\xe0\x00\x0c\x00\x00\x07\xbd\xefx\x1e\x00?\xd0\x00\x00\x1f\xc0\x08<\x00\x00\x07\xbd\xefx\x1e\x00<\x00\x00\x00\x0f\x80\x0c\xf0\x00\x00\x00\x00\x00\x00\x00\x00?\xff\x00\x00\x00\x00\x07\xc0\x00\x00\xf0=\xe0{\xc0\x00?\xff\x00\x00\x00\x00\x03\xc0\x00\x00\xf0=\xe0{\xc0\x00\x00\xbf\x00\x00\x00\x00\x00\xf0\x00\x00\xf0=\xe0{\xc0\x00\x00\x00\x00\x00\x00\x00\x00<\x00\x00\xf0=\xe0{\xc0\x00\x00`\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xc0\x07\xff\xe0\x00\x00\x00\x00\xf0=\xefx\x00\x00\x00\x7f\xfe\x07\xff\xe0\x00\x00\x00\x00\xf0=\xefx\x00\x00\x00\x1e\xfe\x07\xff\xe0\x00\x00\x00\x00\xf0=\xefx\x00\x00\x00\x18\x1e\x00\x00\x00\x00\x00\x00\x00\xf0=\xefx\x00\x00\x00?\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xfe\x00\x00\x00\x01\xff\x80\x00\x00=\xefx\x00\x00\x00\x7f\x80\x00\x00\x00\x01\xff\x80\x00\x00=\xefx\x00\x00\x00@\x00\x00\x00\x00\x00\x10\x80\x00\x00=\xefx\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x80\x00\x00=\xefx\x00\x00?\xff\x00\x01\xff\x80\x00\x10\x80\x00\x00\x00\x00\x00\x00\x00?\xff\x00\x03\xff\xc0\x00\x10\x80\x00\xf0=\xefx\x00\x00?\xff\x00\x07\xff\xe0\x00\x1f\x80\x00\xf0=\xefx\x00\x008\x07\x00\x07\x00\xe0\x00\x0f\x00\x00\xf0=\xefx\x00\x000'\x00\x06\x00\xe0\x00\x00\x00\x00\xf0=\xefx\x00\x00?\xff\x00\x07\xe7\xe0\x01\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xfe\x00\x03\xe3\xc0\x01\xfc\x00\x00\xf0=\xe0{\xc0\x00\x0f\xfc\x00\x01\xe3\x80\x00\x04\x00\x00\xf0=\xe0{\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\xf0=\xe0{\xc0\x00\x00\x7f\xfe\x00\x00\x00\x01\xfc\x00\x00\xf0=\xe0{\xc0\x00\x00\x7f\xfe\x00\x00\x00\x01\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xfe\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xefx\x1e\x00\x00q\xce\x01\xff\x80\x00\x00\x00\x00\x07\xbd\xefx\x1e\x00\x00`\xc6\x03\xff\xc0\x01\xff\x80\x00\x07\xbd\xefx\x1e\x00\x00p\x8e\x07\xff\xe0\x01\xff\x80\x00\x07\xbd\xefx\x1e\x00\x00\x00\x00\x07\x00\xe0\x00\x10\x80\x00\x00\x00\x00\x00\x00\x00\xff\xfc\x00\x06\x04\xe0\x00\x10\x80\x00\x00\x01\xef\x00\x00\x00\xff\xfc\x00\x07\xff\xe0\x00\x10\x80\x00\x00\x01\xef\x00\x00\x00\xff\xfc\x00\x03\xff\xc0\x00\x10\x80\x00\x00\x01\xef\x00\x00\x00\x03\x9c\x00\x01\xff\x80\x00\x1f\x80\x00\x00\x01\xef\x00\x00\x00\t\x9c\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\xfe\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\xfep\x00\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xbd\xe0\x00\x00\x00\x00\x1cx\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00<\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00q\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x18\x00\x00\x00") 49 | 50 | ship = bytearray(b" p\xf8l>//>l\xf8p ") 51 | ufo = bytearray(b"\x0c\x00>\x80\x1d\x80\r\xe0\x1d\xc0\x15\x80>\x80\x0c\x00") 52 | 53 | num0 = bytearray(b"\x7f\x80\xff\xc0\x80@\x80@\xff\xc0\x7f\x80") 54 | num1 = bytearray(b"\x00\x00\x00\x80\x00\x80\xff\xc0\xff\xc0\x00\x00") 55 | num2 = bytearray(b"\xe1\x80\xf1\xc0\x98@\x8c@\x87\xc0\x83\x80") 56 | num3 = bytearray(b"@\x80\xc0\xc0\x84@\x84@\xff\xc0{\x80") 57 | num4 = bytearray(b"0\x00<\x00/\x00#\x80\xff\xc0\xff\xc0") 58 | num5 = bytearray(b"O\xc0\xcf\xc0\x84@\x84@\xfc@x@") 59 | num6 = bytearray(b"\x7f\x80\xff\xc0\x84@\x84@\xfc\xc0x\x80") 60 | num7 = bytearray(b"\x00@\xe0@\xfc@\x1f@\x03\xc0\x00\xc0") 61 | num8 = bytearray(b"{\x80\xff\xc0\x84@\x84@\xff\xc0{\x80") 62 | num9 = bytearray(b"G\x80\xcf\xc0\x88@\x88@\xff\xc0\x7f\x80") 63 | 64 | aliens = [] 65 | class Alien(object): 66 | 67 | def __init__(self, type, x, y): 68 | self.visible = True 69 | self.type = type 70 | self.x = x 71 | self.y = y 72 | self.origx = x 73 | self.origy = y 74 | 75 | def create_alien(type, x, y): 76 | alien = Alien(type, x, y) 77 | return alien 78 | 79 | def define_aliens(): 80 | type = "inv1a" #First row is type 1. 81 | for x in range (1, aliencountx + 1): 82 | for y in range (1, aliencounty + 1): 83 | aliens.append(create_alien(type, (120 - ((x * (spritex + alienspacingx)) - spritex)), (y * (spritey + alienspacingy)) - spritey)) 84 | if type == "inv1a": 85 | type = "inv2a" #Second row is type 2 86 | else: 87 | type = "inv1a" 88 | 89 | def reset_aliens(visibility): # Used to reset aliens to starting position and, optionally, visibility 90 | x = 1 91 | y = 1 92 | for c in aliens: 93 | if visibility: 94 | c.visible = True 95 | 96 | c.x = c.origx 97 | c.y = c.origy 98 | 99 | # Load images into framebuffer 100 | inv1aBuff = framebuf.FrameBuffer(inv1a, 7, 7, framebuf.MONO_HLSB) 101 | inv1bBuff = framebuf.FrameBuffer(inv1b, 7, 7, framebuf.MONO_HLSB) 102 | inv2aBuff = framebuf.FrameBuffer(inv2a, 7, 7, framebuf.MONO_HLSB) 103 | inv2bBuff = framebuf.FrameBuffer(inv2b, 7, 7, framebuf.MONO_HLSB) 104 | 105 | ufoBuff = framebuf.FrameBuffer(ufo, 12, 8, framebuf.MONO_HLSB) 106 | 107 | logoBuff = framebuf.FrameBuffer(logo, 128, 64, framebuf.MONO_HLSB) 108 | 109 | #Dictionary for lookup of digits for score, level, possibly lives 110 | numbers = { 111 | '0': framebuf.FrameBuffer(num0, 10, 6, framebuf.MONO_HLSB), 112 | '1': framebuf.FrameBuffer(num1, 10, 6, framebuf.MONO_HLSB), 113 | '2': framebuf.FrameBuffer(num2, 10, 6, framebuf.MONO_HLSB), 114 | '3': framebuf.FrameBuffer(num3, 10, 6, framebuf.MONO_HLSB), 115 | '4': framebuf.FrameBuffer(num4, 10, 6, framebuf.MONO_HLSB), 116 | '5': framebuf.FrameBuffer(num5, 10, 6, framebuf.MONO_HLSB), 117 | '6': framebuf.FrameBuffer(num6, 10, 6, framebuf.MONO_HLSB), 118 | '7': framebuf.FrameBuffer(num7, 10, 6, framebuf.MONO_HLSB), 119 | '8': framebuf.FrameBuffer(num8, 10, 6, framebuf.MONO_HLSB), 120 | '9': framebuf.FrameBuffer(num9, 10, 6, framebuf.MONO_HLSB)} 121 | 122 | shipBuff = framebuf.FrameBuffer(ship, 8, 12, framebuf.MONO_HLSB) 123 | # Clear the oled display in case it has junk on it. 124 | oled.fill(0) 125 | oled.blit(logoBuff, 0, 0) 126 | # Finally update the oled display so the image & text is displayed 127 | oled.show() 128 | 129 | sleep(2) 130 | 131 | addy = 3 #pixels of movement per turn on aliens 132 | 133 | shotx = 1 134 | shoty = 1 135 | loopCount = 0 136 | define_aliens() 137 | score = 0 138 | difficulty = 1 139 | showufo = False 140 | ufoy = 0 141 | ufoCount = 0 142 | soundfreq = 160 143 | while True: 144 | if showufo: 145 | if soundfreq == 1100: soundfreq = 2000 146 | else: soundfreq = 1100 147 | speaker.freq(soundfreq) 148 | speaker.duty_u16(2000) 149 | if shotx > 36 and showufo == False: speaker.duty_u16(0) 150 | ufoChance = random.randrange(1, 350, 1) # 1 in 1000 chance of running this loop that UFO will appear 151 | if ufoChance == 123 and showufo == False: 152 | showufo = True 153 | ufoy = 0 154 | if showufo: 155 | ufoy = ufoy + 1 156 | if ufoy > 64: 157 | showufo = False 158 | loopCount = loopCount + 1 159 | oled.fill(0) 160 | if loopCount > 16 - difficulty: 161 | if showufo == False: 162 | if soundfreq == 180: soundfreq = 160 163 | elif soundfreq == 160: soundfreq = 140 164 | elif soundfreq == 140: soundfreq = 120 165 | else: soundfreq = 180 166 | speaker.freq(soundfreq) 167 | speaker.duty_u16(2000) 168 | 169 | dropdown = False 170 | loopCount = 0 171 | for c in aliens: 172 | if c.visible == True: #switch between sprites to animate aliens 173 | if c.type == "inv1a": c.type = "inv1b" 174 | elif c.type == "inv1b": c.type = "inv1a" 175 | elif c.type == "inv2a": c.type = "inv2b" 176 | elif c.type =="inv2b": c.type = "inv2a" 177 | if c.y + addy > 56 or c.y + addy < 0: #are any of the visible invaders at the edge of the screen? 178 | if c.x - 3 < 20: #If they're at the bottom, reset their position 179 | reset_aliens(False) 180 | dropdown = False 181 | dropdown = True 182 | if dropdown == True: #move the aliens down if any of the visible ones hit the screen edge 183 | addy = addy * -1 184 | for c in aliens: 185 | c.x = c.x - 3 186 | else: 187 | for c in aliens: 188 | c.y = c.y + addy 189 | 190 | shippos = (Pot.read_u16() * conversion_factor) #Read potentiometer to get ship position 191 | shippos = (64 - ((52 / 3.3) * shippos) - 12) 192 | shotx = shotx + 2 193 | foundVisible = False #By default, assume all the aliens are dead 194 | if showufo: 195 | if shotx > 120: 196 | if shoty >= ufoy: 197 | if shoty < ufoy + 12: 198 | score = score + 50 199 | showufo = False 200 | ufoy = 0 201 | shotx = 20 202 | shoty = int(shippos) + 6 203 | 204 | for c in aliens: 205 | if shotx >= c.x and c.visible == True: #Collision detection for aliens with the shots 206 | if shotx - 4 <= c.x + 8: 207 | if shoty > c.y: 208 | if shoty <= c.y + 7: #You hit an alien! 209 | c.visible = False 210 | score = score + 10 211 | shotx = 32 212 | shoty = int(shippos) + 6 213 | if c.visible == True: 214 | foundVisible = True 215 | if c.type == "inv1a": #Display aliens 216 | oled.blit(inv1aBuff, c.x, c.y) #display animation frame 1, set to frame 2 for next time 217 | elif c.type == "inv1b": 218 | oled.blit(inv1bBuff, c.x, c.y) #display animation frame 2, set to frame 1 for next time 219 | elif c.type == "inv2a": 220 | oled.blit(inv2aBuff, c.x, c.y) #display animation frame 1, set to frame 2 for next time 221 | elif c.type == "inv2b": 222 | oled.blit(inv2bBuff, c.x, c.y) #display animation frame 2, set to frame 1 for next time 223 | if showufo: 224 | oled.blit(ufoBuff, 120, ufoy) 225 | if shotx > 130: 226 | 227 | shotx = 32 228 | shoty = int(shippos) + 6 229 | 230 | if foundVisible == False: # You finish the level! Increase the difficulty and reset the aliens 231 | if difficulty < 10: 232 | difficulty = difficulty + 1 233 | reset_aliens(True) 234 | 235 | oled.blit(shipBuff, 18, int(shippos)) # draw the ship 236 | oled.line(shotx, shoty, shotx - 4, shoty, 1) #draw the laser 237 | 238 | numcount = 0 #keeps track of the number of times through the loop! 239 | 240 | for c in str(score): 241 | oled.blit(numbers[c], 1, ((numcount * 7) + 2)) #Display the score, 1 digit at a time 242 | numcount = numcount + 1 243 | 244 | numcount = 0 245 | 246 | for c in str(difficulty): 247 | oled.blit(numbers[c], 1, 48 + ((numcount * 7) + 2)) #Display the level, 1 digit at a time 248 | numcount = numcount + 1 249 | 250 | oled.show() 251 | if shotx == 32 and showufo == False: 252 | speaker.duty_u16(0) 253 | speaker.freq(1000) 254 | speaker.duty_u16(2000) 255 | 256 | sleep(0.001) 257 | 258 | --------------------------------------------------------------------------------