from machine import Pin, PWM, ADC
from time import sleep
# servo class
class Servo:
def __init__(self, pin):
self.servo = PWM(Pin(pin))
self.servo.freq(50)
def set_from_adc(self, adc_value):
servo_duty = int(3000 + adc_value * 4000 / 65536)
self.servo.duty_u16(servo_duty)
# buzzer class
class Buzzer:
def __init__(self, pin):
self.buzzer = PWM(Pin(pin))
self.off()
def beep(self, duty=1000, freq=1000, times=1):
for _ in range(times):
self.buzzer.freq(freq)
self.buzzer.duty_u16(duty)
sleep(0.2)
self.off()
sleep(0.1)
def winning_sound(self):
print("Winner!")
self.beep(3)
self.buzzer.duty_u16(5000)
def off(self):
self.buzzer.duty_u16(0)
# button class
class Button:
def __init__(self, pin):
self.button = Pin(pin, Pin.IN, Pin.PULL_UP)
def pressed(self):
return self.button.value() == 0 # Active-low
# ldr_game class
class LDR_Game:
def __init__(self, servo1, servo2, pot1, pot2, ldr, buzzer, button):
self.servo1 = servo1
self.servo2 = servo2
self.pot1 = pot1
self.pot2 = pot2
self.ldr = ldr
self.buzzer = buzzer
self.button = button
self.score = 0
self.game_started = False
def starting(self):
print("Press button to start the game...")
while not self.button.pressed():
sleep(0.1)
sleep(0.2) # Debounce
while self.button.pressed():
sleep(0.1)
print("Game Started!")
self.game_started = True
self.reset()
def reset(self):
self.score = 0
self.buzzer.beep(2)
print("Ready for new game")
def move_servos(self):
self.servo1.set_from_adc(self.pot1.read_u16())
self.servo2.set_from_adc(self.pot2.read_u16())
def check_ldr(self):
ldr_value = self.ldr.read_u16()
if ldr_value <5000: # strong light detected
self.score += 10
self.buzzer.buzzer.freq(self.score + 100)
self.buzzer.buzzer.duty_u16(self.score + 1000)
print("Score:", self.score)
if self.score > 1000:
self.buzzer.winning_sound()
self.reset()
self.game_started = False
else:
self.buzzer.off()
# set up hardware
ldr = ADC(Pin(28))
pot1 = ADC(Pin(26))
pot2 = ADC(Pin(27))
servo1 = Servo(0)
servo2 = Servo(1)
buzzer = Buzzer(14)
button = Button(16)
# instantiate game
game = LDR_Game(servo1, servo2, pot1, pot2, ldr, buzzer, button)
# wait for button to be pressed to start the game
game.starting()
# main loop
while True:
if game.game_started:
game.move_servos()
game.check_ldr()
sleep(0.1)