# created by Larry Streck and Miah Nelson
# Inspired by Idris Zainal Abidin's project at
# https://www.cytron.io/tutorial/metronome-maker-pi-pico-programmed-with-circuitpython
# The LCD1602 library is based on the LAFVIN LCD1602 tutorial
# https://lafvintech.com/pages/tutorials
import utime
import machine
from machine import Pin, I2C
from LCD1602 import LCD
import neopixel
def button_increase_handler(pin):
global bpm, beat_duration
utime.sleep_ms(20) # debounce delay
if not pin.value():
bpm += 1
beat_duration = 60 / bpm
lcd.write(0,0," Tempo: {} BPM ".format(bpm))
def button_decrease_handler(pin):
global bpm, beat_duration
utime.sleep_ms(20) # debounce delay
if not pin.value():
bpm -= 1
beat_duration = 60 / bpm
lcd.write(0,0," Tempo: {} BPM ".format(bpm))
buzzer_pin = machine.Pin(18, machine.Pin.OUT)
led_pin = machine.Pin(28)
button_increase_pin = machine.Pin(20, machine.Pin.IN, machine.Pin.PULL_UP)
button_decrease_pin = machine.Pin(21, machine.Pin.IN, machine.Pin.PULL_UP)
num_leds = 1
led_strip = neopixel.NeoPixel(led_pin, num_leds)
adc=machine.ADC(26)
lcd = LCD(addr=0x27, blen=1, sda_pin = 4, scl_pin=5, freq=400000)
lcd.clear()
lcd.message(" For Lainey\n The Full Dirty")
button_increase_pin.irq(trigger=Pin.IRQ_FALLING, handler=button_increase_handler)
button_decrease_pin.irq(trigger=Pin.IRQ_FALLING, handler=button_decrease_handler)
def play_buzzer():
for _ in range(10):
buzzer_pin.value(1)
utime.sleep_us(200)
buzzer_pin.value(0)
utime.sleep_us(200)
def play_different_sound():
for _ in range(10):
buzzer_pin.value(1)
utime.sleep_us(500)
buzzer_pin.value(0)
utime.sleep_us(500)
def flash_led(color):
led_strip[0] = color
led_strip.write()
utime.sleep(0.1)
led_strip[0] = (0, 0, 0)
led_strip.write()
bpm = 120
beat_duration = 60 / bpm
beat_count = 0
while True:
if beat_count % 4 == 0:
flash_led((0, 255, 0))
play_buzzer()
else:
flash_led((255, 0, 0))
play_different_sound()
utime.sleep(beat_duration)
beat_count += 1
if beat_count == 4:
beat_count = 0