from machine import Pin, ADC, PWM
from time import sleep, ticks_ms, ticks_diff
class Buzzer:
def __init__(self, pin):
self.buzzer = PWM(Pin(pin))
self.buzzer.duty_u16(0)
def beep(self, numBeeps):
for _ in range(numBeeps):
self.buzzer.freq(1000)
self.buzzer.duty_u16(2000)
sleep(0.2)
self.buzzer.duty_u16(0)
sleep(0.1)
def play_winning_sound(self):
print("Winner!")
self.beep(3)
for freq in range(1000, 2000, 100):
self.buzzer.freq(freq)
self.buzzer.duty_u16(3000)
sleep(0.1)
self.buzzer.duty_u16(0)
def tone(self, freq, duration=0.2, duty=2000):
self.buzzer.freq(freq)
self.buzzer.duty_u16(duty)
sleep(duration)
self.buzzer.duty_u16(0)
class Servo:
def __init__(self, pin):
self.servo = PWM(Pin(pin))
self.servo.freq(50)
def set_angle(self, value):
duty = int((value / 65535) * 6000 + 2000)
self.servo.duty_u16(duty)
class LightSensor:
def __init__(self, pin):
self.sensor = ADC(Pin(pin))
def read_level(self):
value = self.sensor.read_u16()
return 65535 - value
class Potentiometer:
def __init__(self, pin):
self.adc = ADC(Pin(pin))
def read(self):
return self.adc.read_u16()
class Game:
def __init__(self, buzzer, servo_yaw, servo_roll, pot1, pot2, lightsensor, cooldown=1000):
self.buzzer = buzzer
self.servo_yaw = servo_yaw
self.servo_roll = servo_roll
self.pot1 = pot1
self.pot2 = pot2
self.lightsensor = lightsensor
self.score = 0
self.lastScoreTime = 0
self.cooldown = cooldown
def reset(self):
self.score = 0
self.buzzer.beep(2)
print("Ready for new game")
def update_servos(self):
yaw_value = self.pot1.read()
roll_value = self.pot2.read()
self.servo_yaw.set_angle(yaw_value)
self.servo_roll.set_angle(roll_value)
def check_light_and_score(self):
light_level = self.lightsensor.read_level()
currentTime = ticks_ms()
if light_level > 50000 and ticks_diff(currentTime, self.lastScoreTime) > self.cooldown:
self.score += 10
self.lastScoreTime = currentTime
self.buzzer.tone(min(2000, self.score + 100), duty=min(5000, self.score + 1000))
print("Score:", self.score)
if self.score >= 500:
self.buzzer.play_winning_sound()
self.reset()
def run(self):
self.reset()
while True:
self.update_servos()
self.check_light_and_score()
sleep(0.01)
buzzer = Buzzer(14)
servo_yaw = Servo(1)
servo_roll = Servo(0)
pot1 = Potentiometer(26)
pot2 = Potentiometer(27)
lightsensor = LightSensor(28)
game = Game(buzzer, servo_yaw, servo_roll, pot1, pot2, lightsensor)
game.run()