Pico-Bibliothek


LedRing

Der LED-Ring besteht aus einer ringförmig angeordneten Reihe von NeoPixels. NeoPixels, auch WS2812-LEDs genannt, sind seriell angeschlossene Vollfarb-LEDs, die einzeln adressierbar sind und deren Rot-, Grün- und Blauanteil zwischen 0 und 255 eingestellt werden kann.

RGB-Farbmischer: https://informatik.schule.de/rgb/RGB_farbmischer.html

Anlegen des LedRing-Objekts:

from LedRing import LedRing
 
NUM_LEDS = 24
ledRing = LedRing(NUM_LEDS)

Setzen der Farbe einer LED:

ledRing[0] = (255, 0, 0) # set to red, full brightness
ledRing[1] = (0, 128, 0) # set to green, half brightness
ledRing[2] = (0, 0, 64)  # set to blue, quarter brightness

Setzen der Farbe aller LEDs:

ledRing.fill(0, 0, 0) # set all LEDs to black

Die gesetzte Farbe aller LEDs auf dem LED-Ring anzeigen:

ledRing.write()

Die gesetzten Farben der LEDs werden erst dann auf dem LED-Ring dargestellt, nachdem die write()-Methode ausgeführt wurde.

Auslesen der Farbe einer LED:

r, g, b = ledRing[0]     # read color of first LED

Auslesen der Anzahl der LEDs im Ring:

n = ledRing.n

Beispielprogramm:

from LedRing import LedRing
 
NUM_LEDS = 24
ledRing = LedRing(NUM_LEDS)
 
BLACK   = (0, 0, 0)
RED     = (255, 0, 0)
GREEN   = (0, 255, 0)
BLUE    = (0, 0, 255)
YELLOW  = (255, 255, 0)
MAGENTA = (255, 0, 255)
CYAN    = (0, 255, 255)
WHITE   = (255, 255, 255)
 
ledRing.fill(BLACK)     # set all LEDs to black
ledRing[0] = RED        # set first LED to red
ledRing[1] = GREEN      # set second LED to green
ledRing[2] = BLUE       # set third LED to blue
 
ledRing.write()         # show previously set colors on LED ring

PicoWlan

Anlegen des WLAN-Objekts:

from PicoWlan import PicoWlan
import secrets
 
wlan = PicoWlan(secrets.WIFI_SSID, secrets.WIFI_PASSWORD, secrets.WIFI_COUNTRY)

Die erforderliche Zugangsdaten werden in einer Datei namens „secrets.py“ abgelegt:

secrets.py
#### create file "secrets.py" containing:
#### WIFI_SSID     = "my_ssid"
#### WIFI_PASSWORD = "my_password"
#### WIFI_COUNTRY  = "my_country" e.g. "EN", "DE", ...
 
WIFI_SSID     = "my_ssid"
WIFI_PASSWORD = "my_password"
WIFI_COUNTRY  = "my_country"

Starten des WLANs:

wlan.run()

Timer

Anlegen des Timer-Objekts:

from Timer import CyclicTimerMs
 
MILLISECS = 500 # number of milliseconds 
cyclicTimer = CyclicTimerMs(MILLISECS )

Starten des Timers:

cyclicTimer.start()

Prüfen, ob die eingestellte Zeit verstrichen ist:

if (cyclicTimer.overrun() == True:
    print("Overrun of timer")

Beispielprogramm:

from Timer import CyclicTimerMs
 
MILLISECS = 1000 # number of milliseconds
 
cyclicTimer = CyclicTimerMs(MILLISECS )
cyclicTimer.start()
 
while True:
    while not cyclicTimer.overrun():
        time.sleep(0.01)
 
    print("Next second")

TimeApiIo

Die TimeApiIo.Klasse ermöglicht das Holen der aktuellen Zeitinformation von der von https://timeapi.io/ bereitgestellten API. Hierfür ist ein Zugang zum Internet erforderlich (z.B. über die Klasse PicoWlan).

Weitere Infos gibt es hier: https://timeapi.io/swagger/index.html

Anlegen des TimeApiIo-Objekts:

from TimeApiIo import TimeApiIo
 
timeApiIo = TimeApiIo()

Setzen der Zeitzone:

timeApiIo.setTimeZone("Europe/Berlin")

Lesen der aktuellen Zeitinformation:

t = timeApiIo.getCurrentTime()

Die Methode liefert ein Dictionary-Objekt mit folgender Struktur zurück:

{
  "year": 2023,
  "month": 12,
  "day": 4,
  "hour": 12,
  "minute": 21,
  "seconds": 54,
  "milliSeconds": 652,
  "dateTime": "2023-12-04T12:21:54.6520906",
  "date": "12/04/2023",
  "time": "12:21",
  "timeZone": "Europe/Berlin",
  "dayOfWeek": "Monday",
  "dstActive": false
}

Beispielprogramm:

import TimeApiIo from TimeApiIo
 
timeApiIo = TimeApiIo()
timeApiIo.setTimeZone("Europe/Berlin")
 
data = timeApiIo.getCurrentTime()
print(data) # Aktuelle Zeitinformation ausgeben

Button

Anlegen des Button-Objekts:

from Button import Button 
 
pin = 14                   # GPIO14
pressedLevel = Button.LOW  # Taster schaltet gegen GND
 
button = Button(pin, pressedLevel, bounceTimeMs=200, longTimeMs=5000)

Die Parameter sind:

Lesen eines Events

event = button.event()

Die Methode liefert folgende Ergeignisse zurück:


Potentiometer

Anlegen des Potentiometer-Objekts:

from Potentiometer import Potentiometer
 
pin = 28
potentiometer = Potentiometer(pin)

Die Parameter sind:

Lesen einer Potentiometerstellung

# Auslesen der Potentiometerstellung 
value = potentiometer.read()

Die Methode liefert Werte zwischen 0.0 und 1.0 zurück.

Beispielprogramm:

from Potentiometer import Potentiometer
from time import sleep_ms
 
potentiometer = Potentiometer(28)
 
# To read from the pin, set up a loop:
while True:
    print(potentiometer.read())
    sleep_ms(200)

DipSwitch

Anlegen des DipSwich-Objekts:

from DipSwitch import DipSwitch
 
pins = [ 19, 20, 21, 22 ]
onLevel = DipSwitch.LOW
dipSwitch = DipSwitch(pins, onLevel)

Die Parameter sind:

Lesen einer Schalterstellung

# Auslesen des ersten Schalters
value = dipSwitch[0]

Die Methode liefert folgende Werte zurück:

Anzahl der Schalter ermitteln

n = dipSwitch.size()

Die Methode liefert die Anzahl der Schalter des DIP-Schalters zurück.

Beispielprogramm:

from DipSwitch import DipSwitch
 
DIP_PINS = [ 19, 20, 21, 22 ]
dipSwitch = DipSwitch(DIP_PINS, DipSwitch.LOW)
 
for i in range(dipSwitch.size()):
    print ("DIP-Switch "+ str(i) + ": " + str(dipSwitch[i]))

Buzzer

Die Buzzer-Klasse ermöglicht die Ansteuerung eines Summers.

Anlegen des Buzzer-Objekts:

from Buzzer import Buzzer 
 
pin = 16
buzzer = Buzzer(pin)

Die Parameter sind:

Ausgabe eines Tons:

frequency = 1000
milliseconds = 200
buzzer.beep(frequency, milliseconds)

Die Parameter sind:

Die nächste Oktave erhält man durch Multiplikation der Frequenz frequency mit dem Wert 2 (z.B.: Buzzer.C * 2), die vorherige durch Division durch den Wert 2 (z.B.: Buzzer.A / 2).

Dieses Vorgehen kann man kaskadieren. Das bedeutet, dass die Frequenzen der zweithöheren Oktave durch eine weitere Multiplikation mit dem Wert 2 ermittelt werden können, also z.B. Buzzer.C * 2 * 2 bzw. Buzzer.C * 4. Analog dazu lassen sich natürlich auch die Frequenzen der vorherigen Oktaven durch mehrfache Division ermitteln.

Beispielprogramm:

Das folgende Beispielprogramm spielt das Kinderlied „Alle meine Entchen“ auf dem Summer ab.

from Buzzer import Buzzer 
 
pin = 16
buzzer = Buzzer(pin)
 
buzzer.beep(Buzzer.C, Buzzer.QUARTER)
buzzer.beep(Buzzer.D, Buzzer.QUARTER)
buzzer.beep(Buzzer.E, Buzzer.QUARTER)
buzzer.beep(Buzzer.F, Buzzer.QUARTER)
buzzer.beep(Buzzer.G, Buzzer.HALF)
buzzer.beep(Buzzer.G, Buzzer.HALF)
buzzer.beep(Buzzer.A, Buzzer.QUARTER)
buzzer.beep(Buzzer.A, Buzzer.QUARTER)
buzzer.beep(Buzzer.A, Buzzer.QUARTER)
buzzer.beep(Buzzer.A, Buzzer.QUARTER)
buzzer.beep(Buzzer.G, Buzzer.WHOLE)
buzzer.beep(Buzzer.A, Buzzer.QUARTER)
buzzer.beep(Buzzer.A, Buzzer.QUARTER)
buzzer.beep(Buzzer.A, Buzzer.QUARTER)
buzzer.beep(Buzzer.A, Buzzer.QUARTER)
buzzer.beep(Buzzer.G, Buzzer.WHOLE)
buzzer.beep(Buzzer.F, Buzzer.QUARTER)
buzzer.beep(Buzzer.F, Buzzer.QUARTER)
buzzer.beep(Buzzer.F, Buzzer.QUARTER)
buzzer.beep(Buzzer.F, Buzzer.QUARTER)
buzzer.beep(Buzzer.E, Buzzer.HALF)
buzzer.beep(Buzzer.E, Buzzer.HALF)
buzzer.beep(Buzzer.G, Buzzer.QUARTER)
buzzer.beep(Buzzer.G, Buzzer.QUARTER)
buzzer.beep(Buzzer.G, Buzzer.QUARTER)
buzzer.beep(Buzzer.G, Buzzer.QUARTER)
buzzer.beep(Buzzer.C, Buzzer.WHOLE)

RGB

tbd.


mymachine

Das Modul mymachine stellt Objekte zur Verfügung, die spezifische Funktionen im Zusammenhang mit der Hardware bereitstellen. Die Funktionen ermöglichen den Zugriff auf und die Steuerung von Hardware-Blöcken des Systems.

from mymachine import rightButton, leftButton    # Zwei Objekte der Klasse Button
from mymachine import dipSwitch                  # Objekt der Klasse DipSwitch     
from mymachine import potentiometer              # Objekt der Klasse Potentiometer
from mymachine import ledRing                    # Objekt der Klasse LedRing
from mymachine import buzzer                     # Objekt der Klasse Buzzer