Inhaltsverzeichnis
Pipimat 2000 - Die Teppichnässer- Alarmanlage
Klingt komisch, is aber so: Diese Schaltung macht MP3- Radau, wenn die Sensormatte einen vierbeinigen Mitbewohner dabei erwischt, dass er mal wieder seine Reviermarke in den Teppich setzt.
Installation von Circuit Python
Wenn der Pico sich am Rechner nicht als USB-Drive zeigt: Beim Einstecken den BOOTSEL- Button so lange gedrückt halten, bis das Laufwerk erkannt wird.
Dann das aktuelle UF2 File von circuitpython homepage herunterladen und durch Drag & Drop auf dem Pico installieren.
Der Pico wird dann neu booten und sich als CIRCUITPI neu anmelden.
Dann wird der Audio-Anteil verkabelt wie auf https://learn.adafruit.com/mp3-playback-rp2040 gezeigt:
| Signal | Pico | Pin |
|---|---|---|
| PAM8302 A+ | GP0 | 1 |
| PAM8302 A- | GND | 3 |
| PAM8302 VIN | VBUS (USB 5V) | 40 |
| PAM8302 GND | GND | 23 |
Für's Audio- Signal brauchen wir MP3 Mono 16Bit PCM max. 24kHz Sample Rate. Wie man das mit Audacity hinbekommt, steht auf https://learn.adafruit.com/microcontroller-compatible-audio-file-conversion
Das Programm
import board
import audiomp3
import audiopwmio
import time
import analogio
import digitalio
led = digitalio.DigitalInOut(board.LED)
led.direction = digitalio.Direction.OUTPUT
led.value = True
# Set up an analog input on ADC0 (GP26), which is physically pin 31.
# E.g., this may be attached to photocell or photointerrupter with associated pullup resistor.
sensor = analogio.AnalogIn(board.A0)
alarm = False
supress_alarm= False
lower_threshold = 50000
upper_threshold = 55000
button = digitalio.DigitalInOut(board.GP2)
button.switch_to_input(pull=digitalio.Pull.UP)
audio = audiopwmio.PWMAudioOut(board.GP0)
decoder = audiomp3.MP3Decoder(open("trash.mp3", "rb"))
while True:
if alarm:
led.value = not led.value
else:
led.value = True
# Read the sensor once per cycle.
sensor_level = sensor.value
# uncomment the following to print tuples to plot with the mu editor
print(sensor_level)
if alarm:
if sensor_level > upper_threshold:
led.value = False
alarm = False
print("Off")
else:
supress_alarm=False
if sensor_level < lower_threshold:
led.value = True
alarm = True
print("On")
if not button.value:
audio.play(decoder)
while audio.playing:
pass
print("Done playing!")
if alarm and not supress_alarm:
audio.play(decoder)
while audio.playing:
if not button.value:
supress_alarm=True
audio.stop()
# comment the next line if the alarm shall run endless
#supress_alarm=True
print("Done alarm playing!")
time.sleep(1) # slow sampling to avoid flooding