🕷️ 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
- Öffne Spyder auf dem iMac
- Erstelle eine neue Datei: Datei → Neu
- Schreibe deinen Code im Editor (links)
- Drücke F5 um das Programm auszuführen
- 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:
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:
(Tipp: I = U / R, Ausgabe in mA bedeutet multiplizieren mit 1000)
💡 Lösung anzeigen
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:
💡 Lösung anzeigen
Mittlere Aufgaben¶
Aufgabe 3 · Sensor-Statistik¶
Der Temperature Bricklet von Tinkerforge liefert Temperaturwerte in °C.
Stell dir vor, du hast folgende Messreihe aufgezeichnet:
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:
(Formeln: °F = °C × 9/5 + 32, K = °C + 273.15)
💡 Lösung anzeigen
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
.pngspeichern mitplt.savefig("plot.png")) - 🤖 Die Analyse mit LEGO Spike Prime oder micro:bit Messdaten wiederholen
→ Zurück zum Interaktiven Anfänger-Tutorial