Zum Inhalt

🕷️ Spyder-Aufgaben – Fortgeschrittene

Hier arbeitest du direkt in Spyder – mit echten Dateien, Sensordaten und grafischen Auswertungen.
Öffne Spyder, erstelle eine neue .py-Datei und löse die Aufgaben Schritt für Schritt.

So gehst du vor

  1. Öffne Spyder auf dem iMac
  2. Erstelle eine neue Datei: Datei → Neu
  3. Schreibe deinen Code im Editor (links)
  4. Drücke F5 um das Programm auszuführen
  5. Sieh das Ergebnis in der IPython-Konsole (unten rechts)

Pakete installieren

Für die Matplotlib-Aufgaben benötigst du matplotlib. Falls es fehlt, gib in der IPython-Konsole ein:

!pip install matplotlib


Leichte Aufgaben


Aufgabe 1 · Ohm'sches Gesetz

Der Widerstand \(R = \frac{U}{I}\) ist ein Grundprinzip der Elektronik – auch im Makerspace.

Aufgabe:
Erstelle eine Liste mit 5 verschiedenen Spannungen U (in Volt) und berechne für jeden Wert den Strom I bei einem festen Widerstand von R = 220 Ohm (typischer LED-Vorwiderstand).
Gib jede Zeile so aus:

U = 1.0 V  →  I = 4.55 mA
U = 2.0 V  →  I = 9.09 mA
...

(Tipp: I = U / R, Ausgabe in mA bedeutet multiplizieren mit 1000)

💡 Lösung anzeigen
R = 220  # Ohm (typischer LED-Vorwiderstand)
spannungen = [1.0, 2.0, 3.3, 5.0, 12.0]  # Volt

for U in spannungen:
    I_mA = (U / R) * 1000
    print(f"U = {U:.1f} V  →  I = {I_mA:.2f} mA")

Aufgabe 2 · PWM und LED-Helligkeit

PWM (Pulse Width Modulation) steuert die Helligkeit von LEDs – z.B. beim Tinkerforge LED Strip Bricklet.
Ein PWM-Wert geht von 0 (aus) bis 255 (volle Helligkeit).

Aufgabe:
Schreibe eine Funktion helligkeit_prozent(pwm), die einen PWM-Wert (0–255) in Prozent umrechnet.
Teste sie mit den Werten [0, 64, 128, 192, 255] und gib aus:

PWM   0  →   0.0 %
PWM  64  →  25.1 %
...
💡 Lösung anzeigen
def helligkeit_prozent(pwm):
    return (pwm / 255) * 100

pwm_werte = [0, 64, 128, 192, 255]

for pwm in pwm_werte:
    prozent = helligkeit_prozent(pwm)
    print(f"PWM {pwm:3d}  →  {prozent:5.1f} %")

Mittlere Aufgaben


Aufgabe 3 · Sensor-Statistik

Der Temperature Bricklet von Tinkerforge liefert Temperaturwerte in °C.
Stell dir vor, du hast folgende Messreihe aufgezeichnet:

messungen = [21.4, 22.1, 23.8, 21.9, 24.5, 22.7, 23.1, 22.4, 21.8, 24.0]

Aufgabe:
Berechne und gib aus: - Minimale Temperatur - Maximale Temperatur - Durchschnittstemperatur (auf 2 Nachkommastellen) - Anzahl der Messungen über 23 °C

(Nutze min(), max(), sum(), len() – keine externen Pakete nötig)

💡 Lösung anzeigen
messungen = [21.4, 22.1, 23.8, 21.9, 24.5, 22.7, 23.1, 22.4, 21.8, 24.0]

t_min = min(messungen)
t_max = max(messungen)
t_avg = sum(messungen) / len(messungen)
ueber_23 = sum(1 for t in messungen if t > 23)

print(f"Minimum:      {t_min:.1f} °C")
print(f"Maximum:      {t_max:.1f} °C")
print(f"Durchschnitt: {t_avg:.2f} °C")
print(f"Über 23 °C:   {ueber_23} Messungen")

Aufgabe 4 · Einheitentabelle

Im Makerspace und in der Physik arbeiten wir oft mit verschiedenen Einheiten.

Aufgabe:
Schreibe ein Programm, das eine Liste von Temperaturen in °C in °F und Kelvin umrechnet.
Gib die Ergebnisse als übersichtliche Tabelle aus:

 °C     °F      K
----  ------  ------
   0    32.0   273.2
  20    68.0   293.2
 100   212.0   373.2

(Formeln: °F = °C × 9/5 + 32, K = °C + 273.15)

💡 Lösung anzeigen
celsius_werte = [0, 10, 20, 37, 50, 100]

print(f"{'°C':>4}  {'°F':>6}  {'K':>6}")
print("-" * 22)

for c in celsius_werte:
    f = c * 9 / 5 + 32
    k = c + 273.15
    print(f"{c:4d}  {f:6.1f}  {k:6.1f}")

Aufgabe 5 · Bricklet-Verwaltung mit Dict

Im Tinkerforge-Setup hat jedes Bricklet eine eindeutige ID und einen Typ.

Aufgabe:
Erstelle ein Dictionary mit 6 Bricklets (mindestens 3 verschiedene Typen, z.B. "Temperatur", "Distanz", "LED").
Schreibe dann Code, der: 1. Alle Bricklets mit ihrem Typ ausgibt 2. Nur die Bricklets vom Typ "Temperatur" auflistet 3. Die Gesamtanzahl der Bricklets ausgibt

💡 Lösung anzeigen
bricklets = {
    "xAB1": {"typ": "Temperatur",  "name": "Temperature Bricklet V2"},
    "xAB2": {"typ": "Distanz",     "name": "Distance US Bricklet V2"},
    "xAB3": {"typ": "Temperatur",  "name": "Temperature IR Bricklet V2"},
    "xAB4": {"typ": "LED",         "name": "LED Strip Bricklet V2"},
    "xAB5": {"typ": "Luftdruck",   "name": "Barometer Bricklet V2"},
    "xAB6": {"typ": "Temperatur",  "name": "Outdoor Weather Bricklet"},
}

# 1. Alle Bricklets ausgeben
print("Alle Bricklets:")
for uid, info in bricklets.items():
    print(f"  {uid}  [{info['typ']}]  {info['name']}")

# 2. Nur Temperatur-Bricklets
print("\nTemperatur-Bricklets:")
for uid, info in bricklets.items():
    if info["typ"] == "Temperatur":
        print(f"  {uid}  {info['name']}")

# 3. Gesamtanzahl
print(f"\nGesamt: {len(bricklets)} Bricklets")

Fortgeschrittene Aufgaben – Matplotlib


Aufgabe 6 · Erster Matplotlib-Plot: Kennlinie

Jetzt wird's grafisch! Matplotlib ist vorinstalliert in Anaconda/Spyder.

Aufgabe:
Erstelle einen Plot der Strom-Spannungs-Kennlinie einer LED:

  • Spannungswerte: [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.3] V
  • Stromwerte (mA): [0.0, 0.1, 0.5, 2.0, 8.0, 20.0, 45.0, 75.0] mA

Der Plot soll haben: - Titel: LED-Kennlinie - X-Achse: Spannung (V) - Y-Achse: Strom (mA) - Rote Linie mit runden Markierungspunkten - Gitternetz (grid)

💡 Lösung anzeigen
import matplotlib.pyplot as plt

spannung = [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.3]
strom_mA = [0.0, 0.1, 0.5, 2.0, 8.0, 20.0, 45.0, 75.0]

plt.figure(figsize=(8, 5))
plt.plot(spannung, strom_mA, color="red", marker="o", linewidth=2)
plt.title("LED-Kennlinie", fontsize=14)
plt.xlabel("Spannung (V)")
plt.ylabel("Strom (mA)")
plt.grid(True)
plt.tight_layout()
plt.show()

Aufgabe 7 · Sensordaten aus CSV einlesen und plotten

Im Makerspace-Labor werden Messdaten oft in CSV-Dateien gespeichert.

Vorbereitung:
Erstelle zuerst eine Datei namens temperaturen.csv in deinem Arbeitsordner und kopiere diesen Inhalt hinein:

zeit_s,temperatur_C
0,20.1
10,20.5
20,21.3
30,22.8
40,24.1
50,25.6
60,26.2
70,26.8
80,27.1
90,27.3
100,27.2
110,26.9
120,26.5

Aufgabe:
Schreibe ein Programm, das: 1. Die CSV-Datei mit dem csv-Modul einliest 2. Einen Plot des Temperaturverlaufs über die Zeit erstellt 3. Den Maximalwert mit einer gestrichelten roten Linie markiert 4. Titel, Achsenbeschriftungen und Legende hinzufügt

💡 Lösung anzeigen
import csv
import matplotlib.pyplot as plt

zeiten = []
temperaturen = []

with open("temperaturen.csv", newline="") as csvdatei:
    reader = csv.DictReader(csvdatei)
    for zeile in reader:
        zeiten.append(float(zeile["zeit_s"]))
        temperaturen.append(float(zeile["temperatur_C"]))

t_max = max(temperaturen)

plt.figure(figsize=(10, 5))
plt.plot(zeiten, temperaturen, color="steelblue", linewidth=2, label="Temperatur")
plt.axhline(y=t_max, color="red", linestyle="--", label=f"Maximum: {t_max} °C")
plt.title("Temperaturverlauf – Makerspace Sensor")
plt.xlabel("Zeit (s)")
plt.ylabel("Temperatur (°C)")
plt.legend()
plt.grid(True, alpha=0.4)
plt.tight_layout()
plt.show()

Aufgabe 8 · Balkendiagramm: Sensoren vergleichen

Im Tinkerforge-Setup können wir an verschiedenen Positionen messen.

Aufgabe:
Erstelle ein Balkendiagramm, das die Durchschnittstemperaturen an 4 Messorten im Labor vergleicht:

orte = ["Eingang", "Drucker-Ecke", "Laser-Tisch", "Fenster"]
durchschnitte = [21.2, 28.7, 24.1, 19.8]

Der Plot soll: - Farbige Balken (einen anderen Farbton pro Balken, oder alle steelblue) - Eine horizontale Linie beim Gesamt-Durchschnitt (gestrichelt) - Werte auf den Balken angezeigt (z.B. 21.2°C) - Beschriftungen und Titel

💡 Lösung anzeigen
import matplotlib.pyplot as plt
import numpy as np

orte = ["Eingang", "Drucker-Ecke", "Laser-Tisch", "Fenster"]
durchschnitte = [21.2, 28.7, 24.1, 19.8]
farben = ["#4A90D9", "#E8731A", "#5BA85A", "#9B59B6"]

gesamt_avg = sum(durchschnitte) / len(durchschnitte)

fig, ax = plt.subplots(figsize=(9, 5))
balken = ax.bar(orte, durchschnitte, color=farben, edgecolor="white", width=0.6)

# Werte auf Balken
for balken_obj, wert in zip(balken, durchschnitte):
    ax.text(
        balken_obj.get_x() + balken_obj.get_width() / 2,
        balken_obj.get_height() + 0.3,
        f"{wert}°C",
        ha="center", va="bottom", fontsize=10, fontweight="bold"
    )

ax.axhline(y=gesamt_avg, color="red", linestyle="--",
           label=f"Ø Gesamt: {gesamt_avg:.1f}°C")
ax.set_title("Temperaturvergleich – Makerspace Messpunkte", fontsize=13)
ax.set_ylabel("Durchschnittstemperatur (°C)")
ax.set_ylim(0, 35)
ax.legend()
ax.grid(axis="y", alpha=0.3)
plt.tight_layout()
plt.show()

Aufgabe 9 · Subplots: Temperatur und Luftfeuchtigkeit

Der Air Quality Bricklet von Tinkerforge misst gleichzeitig Temperatur und Luftfeuchtigkeit.

Vorbereitung:
Erstelle eine Datei luftdaten.csv:

sekunde,temperatur,luftfeuchtigkeit
0,20.0,55.0
5,20.2,55.5
10,20.6,56.1
15,21.1,57.3
20,21.8,58.9
25,22.5,60.4
30,23.2,62.1
35,23.7,63.8
40,24.0,64.5
45,24.1,64.8
50,24.0,64.6
55,23.8,64.0
60,23.5,63.2

Aufgabe:
Erstelle eine Figur mit zwei übereinanderliegenden Subplots: - Oben: Temperaturverlauf (blau) - Unten: Luftfeuchtigkeit (grün) - Gemeinsame X-Achse (Zeit in Sekunden) - Jeder Subplot mit eigenem Y-Achsen-Label

💡 Lösung anzeigen
import csv
import matplotlib.pyplot as plt

sekunden = []
temp = []
hum = []

with open("luftdaten.csv", newline="") as f:
    reader = csv.DictReader(f)
    for zeile in reader:
        sekunden.append(float(zeile["sekunde"]))
        temp.append(float(zeile["temperatur"]))
        hum.append(float(zeile["luftfeuchtigkeit"]))

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 7), sharex=True)

ax1.plot(sekunden, temp, color="steelblue", linewidth=2)
ax1.set_ylabel("Temperatur (°C)")
ax1.set_title("Air Quality Bricklet – Messdaten")
ax1.grid(True, alpha=0.3)
ax1.fill_between(sekunden, temp, alpha=0.1, color="steelblue")

ax2.plot(sekunden, hum, color="seagreen", linewidth=2)
ax2.set_ylabel("Luftfeuchtigkeit (%)")
ax2.set_xlabel("Zeit (s)")
ax2.grid(True, alpha=0.3)
ax2.fill_between(sekunden, hum, alpha=0.1, color="seagreen")

plt.tight_layout()
plt.show()

Aufgabe 10 · Vollständige Datenanalyse: 3D-Drucker Temperaturprotokoll

Ein 3D-Drucker-Protokoll enthält Temperaturwerte von Nozzle (Düse) und Heatbed (Druckbett).

Vorbereitung:
Erstelle eine Datei druckprotokoll.csv:

sekunde,nozzle_C,heatbed_C,status
0,25,25,Aufheizen
30,80,35,Aufheizen
60,140,50,Aufheizen
90,185,60,Aufheizen
120,210,70,Drucken
150,215,80,Drucken
180,215,80,Drucken
210,215,80,Drucken
240,215,80,Drucken
270,215,80,Drucken
300,200,75,Abkuehlen
330,160,65,Abkuehlen
360,100,50,Abkuehlen
390,60,40,Abkuehlen
420,30,30,Fertig

Aufgabe:
Erstelle eine professionelle Visualisierung mit: 1. Zwei Linien (Nozzle in Orange, Heatbed in Blau) im selben Plot 2. Zieltemperatur-Linien: Nozzle-Ziel = 215°C (gestrichelt orange), Heatbed-Ziel = 80°C (gestrichelt blau) 3. Farbigen Hintergrundstreifen für die 3 Phasen: Aufheizen (gelb), Drucken (grün), Abkühlen (rot) — jeweils transparent 4. Legende, Titel, Achsenbeschriftungen

💡 Lösung anzeigen
import csv
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

sekunden, nozzle, heatbed, status_liste = [], [], [], []

with open("druckprotokoll.csv", newline="") as f:
    reader = csv.DictReader(f)
    for zeile in reader:
        sekunden.append(float(zeile["sekunde"]))
        nozzle.append(float(zeile["nozzle_C"]))
        heatbed.append(float(zeile["heatbed_C"]))
        status_liste.append(zeile["status"])

fig, ax = plt.subplots(figsize=(12, 6))

# Hintergrundphasen
phasen = {
    "Aufheizen": ("#FFEB3B", 0.15),
    "Drucken":   ("#4CAF50", 0.12),
    "Abkuehlen": ("#F44336", 0.10),
    "Fertig":    ("#9E9E9E", 0.08),
}
aktuell = status_liste[0]
start = sekunden[0]
for i in range(1, len(sekunden)):
    if status_liste[i] != aktuell or i == len(sekunden) - 1:
        farbe, alpha = phasen.get(aktuell, ("#FFFFFF", 0.05))
        ax.axvspan(start, sekunden[i], color=farbe, alpha=alpha)
        aktuell = status_liste[i]
        start = sekunden[i]

# Temperaturen
ax.plot(sekunden, nozzle, color="#E65100", linewidth=2.5, label="Nozzle")
ax.plot(sekunden, heatbed, color="#1565C0", linewidth=2.5, label="Heatbed")

# Ziellinien
ax.axhline(215, color="#E65100", linestyle="--", alpha=0.5, label="Nozzle-Ziel 215°C")
ax.axhline(80,  color="#1565C0", linestyle="--", alpha=0.5, label="Heatbed-Ziel 80°C")

ax.set_title("3D-Drucker Temperaturprotokoll", fontsize=14)
ax.set_xlabel("Zeit (s)")
ax.set_ylabel("Temperatur (°C)")
ax.legend(loc="lower right")
ax.grid(True, alpha=0.3)
ax.set_ylim(0, 250)
plt.tight_layout()
plt.show()

Weiterführend

Wenn du diese Aufgaben gelöst hast, kannst du:

  • 🔌 Echte Daten mit Tinkerforge-Bricklets messen und direkt in Python verarbeiten
  • 📁 Eigene CSV-Logdateien schreiben und visualisieren
  • 📊 Matplotlib-Plots in Reports einbetten (als .png speichern mit plt.savefig("plot.png"))
  • 🤖 Die Analyse mit LEGO Spike Prime oder micro:bit Messdaten wiederholen

→ Zurück zum Interaktiven Anfänger-Tutorial