Von Blockprogrammierung zu Arduino C++: Tabelle mit MicroPython
Von Blockprogrammierung zu Arduino C++: 34 Blöcke mit C++- und MicroPython-Code in einer Tabelle, typische Fehler, 4-Schritte-Methode und ein Beispielprogramm.
Der schnellste Weg von Blockprogrammierung zu Arduino C++ ist eine einseitige Tabelle neben dir, die zeigt, zu welcher echten Codezeile jeder Block wird. Die kurze Antwort: Blöcke sind keine neue Sprache, sondern die grafische Form von Arduino-C++-Zeilen. Der Block „Pin 13 als AUSGANG setzen“ ist die Zeile pinMode(13, OUTPUT);, der Block „1000 ms warten“ ist delay(1000); und der Block „falls … mache“ ist eine if-Anweisung. Die Tabelle unten stellt die echten Beschriftungen der Blöcke in der BlueGrays-App neben ihren Arduino-C++-Code und ihren MicroPython-Code für den Raspberry Pi Pico.
Diese Seite ist keine Unterrichtsstunde, sondern ein Nachschlageblatt. Du kannst die Tabelle ausdrucken, neben den Arbeitsplatz legen und beim Blick auf ein Projekt prüfen, welche Zeile zu welchem Block gehört. Nach der Tabelle findest du die häufigsten Fehler beim Umstieg, eine Methode in vier Schritten, mit der du die Blöcke hinter dir lässt, und dasselbe Programm als Blöcke, C++ und MicroPython. Das Beispiel lässt sich in der Arduino IDE kompilieren und läuft mit Thonny auf dem Pico.

Bevor du die Tabelle liest: vier Unterschiede zwischen den drei
Blöcke, C++ und MicroPython drücken dieselbe Idee aus, aber die Schreibregeln unterscheiden sich. An diesen vier Unterschieden stolperst du am häufigsten. Der erste ist der Aufbau: Ein Arduino-C++-Programm besteht aus zwei Teilen namens setup() und loop(), die in den Blöcken als „Setup (läuft einmal)“ und „immer wiederholen“ erscheinen. MicroPython hat kein eigenes Setup; die Datei läuft einmal von oben nach unten, und der sich wiederholende Teil steht in einer while True:-Schleife. Der zweite sind Datentypen: In C++ hat jede Variable einen geschriebenen Typ (int, float, bool), in den Blöcken ist das die Option „deklariere Ganzzahl (int)“, in Python wird gar kein Typ geschrieben.
Der dritte Unterschied sind Zahlenbereiche. Am Arduino Uno liefert ein Analogwert 0–1023 und PWM 0–255; beim ESP32 reicht der Analogwert bis 0–4095; auf dem Pico liefert MicroPython Messwerte und PWM-Tastgrad im Bereich 0–65535. Deshalb kannst du einen Schwellwert nicht einfach von einem Board aufs andere übernehmen. Der vierte Unterschied ist die Zeiteinheit: delay() erwartet Millisekunden, time.sleep() Sekunden. Eine halbe Sekunde ist in C++ delay(500) und in MicroPython time.sleep(0.5). Wenn du diese vier Regeln im Kopf behältst, ordnen sich die meisten Tabellenzeilen von selbst.
- Die Zahlen in der Tabelle sind Beispiele: Wo im Block 13 steht, kann in deinem Projekt 7 stehen, und die Zahl in der Codezeile ändert sich mit.
- Die Pins in der MicroPython-Spalte sind GP-Nummern des Pico (GP14, GP15, GP26). Sie müssen nicht mit den Pin-Nummern des Uno übereinstimmen; schau in den Schaltplan.
- Zeilen mit „Kein Pico-Block“ bedeuten, dass dieser Block in Pico-Projekten nicht vorkommt; MicroPython-Code für dieselbe Aufgabe steht trotzdem da.
- Auch der ESP32 wird in Arduino C++ programmiert; die C++-Spalte gilt auch für ihn, nur der Analogbereich und manche Pin-Nummern sind anders.
Tabelle: Block, Arduino C++ und MicroPython
Die Tabelle ist in 12 Gruppen geteilt: Programmaufbau, Pins, Zeit, Bedingung, Schleife, Variablen, Mathematik, serielle Schnittstelle, Analog und PWM, Ton, Servo und Sensor. Der Text in der Block-Spalte ist die Beschriftung, die in der App auf den Blöcken steht; „…“ und „?“ markieren den Steckplatz, in den ein anderer Block kommt. Stehen mehrere Blöcke in einer Zeile, trennt sie ein Punkt.
| Gruppe | Block (Beschriftung in der App) | Arduino C++ | MicroPython (Pico) |
|---|---|---|---|
| Aufbau | Setup (läuft einmal) | void setup() { … } | Die Zeilen vor while True: |
| Aufbau | immer wiederholen | void loop() { … } | while True: (Inhalt um 4 Leerzeichen eingerückt) |
| Aufbau | globale Variablen (ganz oben) | Anfang der Datei, vor setup() | Die ersten Zeilen nach den Imports |
| Aufbau | um blinkTwice | void blinkTwice() { … } · Aufruf: blinkTwice(); | def blinkTwice(): · Aufruf: blinkTwice() |
| Pins | Pin 13 als AUSGANG setzen | pinMode(13, OUTPUT); | led = Pin(15, Pin.OUT) |
| Pins | Pin 2 als EINGANG (PULLUP) setzen | pinMode(2, INPUT_PULLUP); | btn = Pin(14, Pin.IN, Pin.PULL_UP) |
| Pins | HOCH an Pin 13 schreiben · NIEDRIG an Pin 13 schreiben | digitalWrite(13, HIGH); · digitalWrite(13, LOW); | led.value(1) · led.value(0) |
| Pins | Pin 2 lesen | digitalRead(2) → HIGH (1) oder LOW (0) | btn.value() → 1 oder 0 |
| Pins (nur Pico) | Pin led : GP 14, AUSGANG · Pin led einschalten (on) / ausschalten (off) | Entspricht pinMode() + digitalWrite() | led = Pin(14, Pin.OUT) · led.on() / led.off() |
| Zeit | 1000 ms warten · 0.5 Sekunden warten (Pico) | delay(1000); · delay(500); | time.sleep_ms(1000) · time.sleep(0.5) |
| Zeit | 10 µs warten | delayMicroseconds(10); | time.sleep_us(10) |
| Zeit | ms seit dem Start | millis() (unsigned long) | time.ticks_ms() |
| Bedingung | falls … mache … sonst falls … sonst … | if (…) { … } else if (…) { … } else { … } | if …: · elif …: · else: |
| Bedingung | ? = ? (≠, <, ≤, >, ≥) | == != < <= > >= | == != < <= > >= |
| Bedingung | ? und ? · ? oder ? · nicht ? | && · || · !x | and · or · not x |
| Schleife | wiederhole 3 -mal: mache | for (int i = 0; i < 3; i++) { … } | for i in range(3): |
| Schleife | zähle i von 0 bis 5 in Schritten von 1 | for (i = 0; i <= 5; i++) (5 inklusive, 6 Durchläufe) | for i in range(0, 6): (6 nicht inklusive) |
| Schleife | wiederhole solange | while (…) { … } | while …: |
| Schleife | die Schleife abbrechen | break; | break |
| Variablen | deklariere Ganzzahl (int) delayTime = 60 | int delayTime = 60; | delayTime = 60 (ohne Typangabe) |
| Variablen | deklariere Kommazahl (float) voltage = 0.0 | float voltage = 0.0; | voltage = 0.0 |
| Variablen | setze x auf 0 · erhöhe x um 1 | x = 0; · x += 1; (oder x++;) | x = 0 · x += 1 (x++ gibt es nicht) |
| Variablen | Array 2 3 4 · Element 0 von ledPins | int ledPins[] = {2, 3, 4}; · ledPins[0] | ledPins = [2, 3, 4] · ledPins[0] |
| Mathematik | 1 + 1 (auch −, ×, ÷) | + - * / · mit zwei int 7 / 2 = 3 | + - * / · 7 / 2 = 3.5, Ganzzahldivision 7 // 2 = 3 |
| Mathematik | Rest von 10 ÷ 3 | 10 % 3 | 10 % 3 |
| Mathematik | x umrechnen: 0 – 1023 → 0 – 255 | map(x, 0, 1023, 0, 255) | Nicht eingebaut; eine Funktion arduino_map() schreiben |
| Mathematik | begrenze 50 zwischen 0 und 100 | constrain(50, 0, 100) | min(max(50, 0), 100) |
| Serielle Schnittstelle | Seriell starten mit 9600 Baud | Serial.begin(9600); | Nicht nötig, print() läuft über USB |
| Serielle Schnittstelle | seriell ausgeben … neue Zeile · ohne Umbruch | Serial.println(x); · Serial.print(x); | print(x) · print(x, end="") |
| Analog und PWM | analog lesen A0 | analogRead(A0) → 0–1023 (beim ESP32 0–4095) | ADC(26).read_u16() → 0–65535 |
| Analog und PWM | PWM 128 an Pin 9 schreiben · PWM led : GP 14, Frequenz 1000 Hz (Pico) | analogWrite(9, 128); (0–255) | led = PWM(Pin(14)) · led.freq(1000) · led.duty_u16(32768) (0–65535) |
| Ton | 440 Hz an Pin 8 spielen · Ton an Pin 8 stoppen | tone(8, 440); · noTone(8); | Kein Pico-Block: bz = PWM(Pin(16)) · bz.freq(440) · bz.duty_u16(32768) · Stopp: bz.duty_u16(0) |
| Servo | Servo myServo an Pin 9 anschließen · Servo myServo auf 90 Grad drehen | #include <Servo.h> · Servo myServo; · myServo.attach(9); · myServo.write(90); | Kein Pico-Block: s = PWM(Pin(16)) · s.freq(50) · s.duty_ns(1500000) (etwa 90°) |
| Sensor | Dauer des Impulses HOCH an Pin 12 (µs) | pulseIn(12, HIGH) | machine.time_pulse_us(Pin(12, Pin.IN), 1) |
Manche Zeilen wirken auf den ersten Blick eins zu eins, brauchen aber Aufmerksamkeit. Bei „zähle i von 0 bis 5“ ist die 5 eingeschlossen, die Schleife läuft 6-mal; deshalb steht in C++ <= statt <, und Python braucht range(0, 6), weil range die Endzahl auslässt. Auch der Divisionsblock ist eine Falle: Teilst du zwei Ganzzahlen, wirft C++ den Rest weg und 7 / 2 ergibt 3, Python liefert 3.5. Für eine Ganzzahldivision wie in C++ nutzt du in Python //. Die Funktion map() hinter dem Block „x umrechnen“ ist in MicroPython nicht eingebaut; im Beispiel unten erledigt eine zweizeilige Funktion arduino_map() dieselbe Rechnung.
Wie werden verschachtelte Blöcke zu Code?
Einzelne Blöcke zu kennen reicht nicht; die eigentliche Fähigkeit ist, verschachtelte Blöcke in eine Zeile zu übersetzen. Dafür unterscheidest du zwei Formen. Untereinander gestapelte Blöcke mit einer Nase am Rand sind Befehle, und jeder wird zu einer Codezeile. Ovale oder spitze Blöcke, die in den Steckplatz eines anderen Blocks gesteckt werden, sind Werte; im Code stehen sie in Klammern, rechts von einem Gleichheitszeichen oder in einer Bedingung. Die Zeilen unten stammen aus dem kostenlosen Projekt Frequenzeinstellung mit Buzzer: Vier Taster schalten den Ton ein und aus und erhöhen oder senken die Frequenz, die zwischen 50 und 5000 Hz bleibt.
| Block (Frequenzeinstellung mit Buzzer) | C++-Zeile | Leseregel |
|---|---|---|
| setze state auf 1 | state = 1; | Jeder untereinander gestapelte Befehlsblock ist eine Zeile und endet mit einem Semikolon. |
| falls (Pin btnOn lesen = HOCH) mache … | if (digitalRead(btnOn) == HIGH) { … } | Ein ovaler Wertblock kommt in die Klammern; der Vergleich = im Block wird im Code zu ==. |
| setze frequency auf (frequency + 50) | frequency = frequency + 50; | Der innere Block wird zuerst berechnet, das Ergebnis geht an den äußeren Block. |
| setze frequency auf (begrenze frequency zwischen 50 und 5000) | frequency = constrain(frequency, 50, 5000); | Die freien Steckplätze eines Blocks sind im Code die durch Kommas getrennten Argumente. |
| frequency Hz an Pin buzzerPin spielen | tone(buzzerPin, frequency); | Im Code ist die Reihenfolge fest: zuerst der Pin, dann der Wert. Die Wortstellung im Block hängt von der Sprache ab. |
| falls (state = 1) mache … sonst … | if (state == 1) { … } else { … } | Blöcke in der „mache“-Öffnung kommen in das erste { }, Blöcke in der „sonst“-Öffnung in else { }. |
Gewöhne dir beim Lesen dieser Tabelle eines an: Übersetze zuerst den innersten Block und arbeite dich dann nach außen. In „setze frequency auf (begrenze frequency zwischen 50 und 5000)“ ist der innerste Teil constrain(frequency, 50, 5000), und der äußere Setzen-Block macht daraus frequency = …. Ein Wertblock kann nicht allein eine Zeile sein; lässt du ihn mit einem Semikolon stehen, meckert der Compiler vielleicht nicht, aber das Ergebnis wird nirgends gespeichert.
Typische Fehler beim Umstieg von Blöcken auf Code
Der Block-Editor lässt die meisten dieser Fehler gar nicht zu; die Form der Teile verhindert, dass sie an der falschen Stelle einrasten. Im Code fällt dieser Schutz weg, darum begegnen fast allen in den ersten Wochen die folgenden Fehler. Die Fehlermeldungen kommen auf Englisch, aber es gibt nur wenige Muster, und nach ein paar Mal erkennst du sie wieder.
| Fehler | Symptom | Lösung |
|---|---|---|
| Kein Semikolon am Zeilenende | „expected ';' before …“; der Compiler zeigt oft auf die Zeile darunter | Jede Anweisung mit ; abschließen. Nach if-, for- und while-Zeilen kein ; setzen. |
| Geschweifte Klammer fehlt oder ist zu viel | „expected '}' at end of input“ oder Code läuft an der falschen Stelle | Zu jeder { gehört eine }. Strg+T (automatische Formatierung) in der Arduino IDE richtet die Einrückung, eine fehlende Klammer fällt sofort auf. |
| = in einer Bedingung | if (state = 1) ist immer wahr und setzt state auf 1; in Python SyntaxError | Vergleichen mit ==, zuweisen mit =. Der Vergleich = im Block ist im Code immer ==. |
| Kommazahl in einem int | int volt = 3.7; speichert 3; 5 / 2 ergibt 2 | Für Kommazahlen float nehmen und beim Teilen eine Zahl als 5.0 schreiben. |
| Falscher Wert von digitalRead erwartet | if (digitalRead(2) == 5) greift nie; mit Pull-up-Taster ist die Logik umgedreht | digitalRead liefert nur HIGH (1) oder LOW (0). Mit INPUT_PULLUP liest ein gedrückter Taster LOW. |
| Groß- und Kleinschreibung verwechselt | 'digitalwrite' was not declared in this scope; in Python NameError | digitalWrite, pinMode und Serial genau so schreiben. In Python beginnen True und False mit Großbuchstaben. |
| Zählschleife um eins zu kurz übersetzt | Eine Schleife, die im Block 6-mal läuft, läuft im Code 5-mal; die letzte LED leuchtet nie | „von 0 bis 5“ schließt das Ende ein: in C++ i <= 5, in Python range(0, 6). |
| Python-Einrückung verschoben | IndentationError oder eine Zeile landet außerhalb der Schleife | Jede Zeile unter while und if mit denselben 4 Leerzeichen beginnen; Tabs und Leerzeichen nicht mischen. |
| Python-Zeit für Millisekunden halten | time.sleep(500) wartet über 8 Minuten | time.sleep(0.5) oder time.sleep_ms(500) schreiben. |
| C++-Gewohnheiten in Python | SyntaxError durch x++, && oder ; am Zeilenende | Python nutzt x += 1, and, or; ein Zeilenendzeichen gibt es nicht. |
Die Blöcke hinter dir lassen: Methode in 4 Schritten
Den Umstieg in einem Zug zu schaffen, ist anstrengend. Die vier Schritte unten führen in kleinen Etappen vom Lesen zum Schreiben. Ein oder zwei Projekte pro Schritt reichen; bereit für den nächsten Schritt bist du, wenn du den aktuellen ohne Blick auf die Tabelle schaffst.
- Nebeneinander lesen. Öffne Blöcke und Code eines Projekts gleichzeitig und ordne mit dem Finger jedem Block seine Codezeile zu. Die Tabelle liegt in diesem Schritt immer neben dir. Ziel: jede Codezeile einem Block zuordnen können.
- Blöcke ausblenden, raten. Sieh dir zuerst die Blöcke an, schalte dann die Blockansicht aus und schreib den C++-Code dieser Blöcke auf Papier, ohne in den Code zu schauen. Vergleiche danach mit dem echten Code. Probier es auch andersherum: Code lesen, Blöcke erraten.
- Einen Wert im Code ändern. Hol dir den Code auf den Computer und ändere nur eine Zahl: die Wartezeit von 100 auf 500 oder den Schwellwert von 400 auf 600. Hochladen und den Unterschied mit eigenen Augen sehen. Kommt ein Kompilierfehler, geh zurück zur Fehlertabelle oben.
- Eine neue Zeile schreiben. Füge eine Zeile hinzu, die es in den Blöcken nicht gibt: ein Serial.println(), das den Wert im seriellen Monitor ausgibt, eine zweite LED oder ein if mit einem Taster. Jetzt übersetzt du keine Blöcke mehr, du schreibst Code direkt.
Zu jedem Schritt gibt es eine passende Lektion in der Reihe. Für den ersten Schritt ist die Block-Zeilen-Tabelle im Beitrag eine LED mit Blöcken blinken lassen ein guter Start. Für Bedingungen und Schleifen in Schritt zwei und drei lies der Falls-Block und Schleifen und Variablen. Wenn du mit dem Pico zu MicroPython wechselst, erklärt von Blöcken zu MicroPython auch die Einrichtung von Thonny. Willst du den Umstieg im Unterricht über mehrere Wochen verteilen, bietet der 8-Wochen-Plan für Robotik eine fertige Reihenfolge.
Blöcke und Code in der BlueGrays-App nebeneinander öffnen
Am meisten nutzt du diese Tabelle, wenn du zwischen den Blöcken und dem Code eines echten Projekts hin und her wechselst. Die BlueGrays-App hat für über 100 Projekte eine Blockansicht; in mehr als 30 kostenlosen Projekten sind die Blöcke ebenfalls frei, in Premium-Projekten öffnen sich die Blöcke mit Premium. Blöcke sind zum Lesen da: In der App werden Blöcke nicht bearbeitet und nicht auf das Board hochgeladen. Auf das Board kommt immer der echte Code; du holst ihn mit Kopieren oder mit Link kopieren, um ihn am Computer zu öffnen, und fügst ihn in die Arduino IDE oder für den Pico in Thonny ein.
- Als Blöcke zeigen: Schalte diesen Schalter neben dem Quellcode auf einer Projektseite ein, und dasselbe Programm erscheint als Blockbild in der Sprache der App. Tippst du auf das Bild, öffnet es sich im Vollbild; durch Aus- und Einschalten übst du genau die Schritte eins und zwei.
- Blöcke verstehen: Bei eingeschalteter Blockansicht heißt der Tab „Code verstehen“ so. Das Programm wird in Schritte zerlegt, jeder mit dem passenden Teil und einer Erklärung. Die Aufgabe „Probier es selbst“ am Ende ist eine fertige Übung für Schritt vier.
- Code-Guide: Jede der 36 Karten im Bereich Lernen (18 Arduino C++, 18 MicroPython) zeigt ihr Beispiel dreifach mit den Tabs Blöcke, Arduino und MicroPython. Willst du eine Tabellenzeile genauer sehen, öffne die passende Karte.
- Projekte mit Blöcken: Diese Option unter Filtern in Entdecken > Projekte listet nur Projekte mit Blockansicht auf und erleichtert dir die Wahl eines Projekts für den Umstieg.
Wie der Code-Guide funktioniert, erklären wir im Beitrag zum Code-Guide, die Bereiche „Code verstehen“ und „Probier es selbst“ im Leitfaden zu Code verstehen. Für die einzelnen Befehle mit Erklärung passt die Arduino-Befehlsliste gut zu dieser Tabelle.
Ein Programm in drei Formen: Nachtlicht, das mit dem Licht dimmt
Um die Tabelle in Aktion zu sehen, bauen wir ein kleines Programm. Ein LDR misst das Licht; ist der Raum hell, bleibt die LED aus, wird es dunkler, leuchtet die LED langsam heller. Das Programm nutzt Variablen-, Analog-, Bedingungs-, Umrechnen-, PWM-, Seriell- und Warten-Blöcke, also mehr als die Hälfte der Tabelle in einem Beispiel. Die Idee basiert auf dem kostenlosen Projekt Nachtlicht mit LDR; dort ist die LED nur an oder aus, hier wird sie per PWM gedimmt. Für die Verdrahtung des LDR kannst du dir auch den Schaltplan des Projekts Lichtstärke messen mit LDR ansehen.
| Verbindung | Arduino Uno | Raspberry Pi Pico |
|---|---|---|
| LDR-Bein 1 | 5V | 3V3(OUT), physischer Pin 36 |
| LDR-Bein 2 + ein Ende des 10-kΩ-Widerstands (Mittelpunkt) | A0 | GP26 / ADC0, physischer Pin 31 |
| Anderes Ende des 10-kΩ-Widerstands | GND | GND, physischer Pin 38 |
| Langes LED-Bein (über einen 220-Ω-Widerstand) | D9 (PWM-Pin) | GP15, physischer Pin 20 |
| Kurzes LED-Bein | GND | GND, physischer Pin 18 |
| Lichtwert / PWM-Bereich | 0–1023 / 0–255 | 0–65535 / 0–65535 |
Zuerst die Blockfassung. Mit den Beschriftungen aus der App besteht das Programm aus diesen Blöcken; jeder Punkt entspricht einer oder mehreren Zeilen des folgenden C++-Codes:
- globale Variablen (ganz oben): deklariere Ganzzahl (int) lightValue = 0 und deklariere Ganzzahl (int) brightness = 0
- Setup (läuft einmal): Seriell starten mit 9600 Baud, danach Pin 9 als AUSGANG setzen
- immer wiederholen: setze lightValue auf (analog lesen A0)
- falls (lightValue < 400) mache: setze brightness auf (lightValue umrechnen: 0 – 400 → 255 – 0); sonst: setze brightness auf 0
- PWM brightness an Pin 9 schreiben
- seriell ausgeben „Light: “ ohne Umbruch, seriell ausgeben lightValue ohne Umbruch, seriell ausgeben „ PWM: “ ohne Umbruch, seriell ausgeben brightness neue Zeile
- 200 ms warten
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Işığa göre kısılan gece lambası / Dimming night light
4// ─────────────────────────────────────────
5
6int lightValue = 0; // LDR okuması / LDR reading (0-1023)
7int brightness = 0; // LED parlaklığı / LED brightness (0-255)
8
9void setup() {
10 Serial.begin(9600); // Seri port 9600 baud / Serial at 9600 baud
11 pinMode(9, OUTPUT); // LED, PWM pini D9 / LED on PWM pin D9
12}
13
14void loop() {
15 lightValue = analogRead(A0); // Az ışık = küçük değer / Little light = small value
16
17 if (lightValue < 400) {
18 // Karanlık arttıkça LED parlar / The darker it gets, the brighter the LED
19 brightness = map(lightValue, 0, 400, 255, 0);
20 } else {
21 brightness = 0; // Oda aydınlık, LED kapalı / Room is bright, LED off
22 }
23
24 analogWrite(9, brightness); // PWM 0-255 / PWM 0-255
25
26 Serial.print("Light: ");
27 Serial.print(lightValue);
28 Serial.print(" PWM: ");
29 Serial.println(brightness);
30
31 delay(200); // 0,2 sn bekle / Wait 0.2 s
32}
331# ─────────────────────────────────────────
2# BlueGrays · bluegrays.com
3# Işığa göre kısılan gece lambası / Dimming night light
4# ─────────────────────────────────────────
5from machine import Pin, ADC, PWM
6import time
7
8ldr = ADC(26) # GP26 = ADC0 / GP26 = ADC0
9led = PWM(Pin(15)) # LED, GP15 / LED on GP15
10led.freq(1000) # PWM frekansı 1000 Hz / PWM frequency 1000 Hz
11
12THRESHOLD = 25600 # Uno'daki 400'ün karşılığı / Same as 400 on the Uno
13
14
15def arduino_map(x, in_min, in_max, out_min, out_max):
16 # Arduino map() ile aynı hesap / Same math as Arduino map()
17 return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
18
19
20while True:
21 light_value = ldr.read_u16() # 0-65535 / 0-65535
22
23 if light_value < THRESHOLD:
24 # Karanlık arttıkça LED parlar / The darker it gets, the brighter the LED
25 brightness = arduino_map(light_value, 0, THRESHOLD, 65535, 0)
26 else:
27 brightness = 0 # Oda aydınlık, LED kapalı / Room is bright, LED off
28
29 led.duty_u16(brightness) # PWM 0-65535 / PWM 0-65535
30
31 print("Light:", light_value, " PWM:", brightness)
32
33 time.sleep(0.2) # 0,2 sn bekle / Wait 0.2 s
34Vergleichst du beide Programme Zeile für Zeile, zeigen sich alle Unterschiede aus der Tabelle. setup() aus C++ wird in Python zu den Zeilen vor while True, und Serial.begin() fällt weg. Aus analogRead(A0) wird ADC(26).read_u16(), der Bereich wächst von 0–1023 auf 0–65535, deshalb liegt der Schwellwert bei 25600 statt 400. Statt analogWrite(9, …) wird zuerst ein PWM-Objekt angelegt und die Helligkeit mit duty_u16() zwischen 0 und 65535 gesetzt. Weil map() fehlt, wird eine Funktion arduino_map() geschrieben; die Ganzzahldivision // darin entspricht der Ganzzahldivision in C++. Ein print() ersetzt vier einzelne Serial.print(), und delay(200) wird zu time.sleep(0.2).
Der Umstieg von Blockprogrammierung auf Arduino C++ heißt weniger, etwas Neues auswendig zu lernen, als die geschriebene Form der Blöcke wiederzuerkennen, die du schon kennst. Behalte diese Tabelle neben dir, lies bei jedem Projekt zuerst nebeneinander, dann blende die Blöcke aus und schreib selbst. Wenn du die Zeilen in echten Projekten sehen willst, öffne in der BlueGrays-App ein Projekt mit Blockansicht und wechsle mit Als Blöcke zeigen zwischen den beiden Formen desselben Programms.
Häufige Fragen
Was soll ich nach der Blockprogrammierung lernen: C++ oder Python?
Entscheide nach deinem Board. Die meisten Projekte mit Arduino Uno und ESP32 sind in Arduino C++ geschrieben, auf dem Raspberry Pi Pico ist MicroPython verbreitet. Die Logik der Blöcke ist in beiden gleich, deshalb geht der Wechsel zur zweiten Sprache viel schneller, wenn du eine kannst.
Wie lange dauert der Umstieg von Blöcken auf Arduino-Code?
Das ist unterschiedlich, aber wer regelmäßig an ein paar Projekten pro Woche arbeitet, kann meist nach einigen Wochen kurze Programme lesen und kleine Änderungen machen. Erst Code neben den Blöcken lesen, dann einen einzelnen Wert ändern und zuletzt neue Zeilen ergänzen erleichtert den Umstieg.
Kann ich einen Arduino Uno mit Python programmieren?
Der Arduino Uno kann kein MicroPython ausführen; er wird mit der Arduino IDE in C++ programmiert. Für MicroPython brauchst du ein leistungsfähigeres Board wie den Raspberry Pi Pico. Du kannst aber mit einem Python-Programm auf dem Computer über die serielle Schnittstelle Befehle an einen Uno schicken.
Kann ich in BlueGrays Blöcke bearbeiten und auf das Board laden?
Nein. Die Blöcke in BlueGrays sind zum Lesen und Verstehen des Codes da; in der App werden Blöcke nicht bearbeitet und nicht auf das Board geladen. Hochgeladen wird immer der echte Code des Projekts, mit der Arduino IDE oder Thonny.
Ist ein Blockprogramm echter Code?
Blöcke sind die grafische Form von echtem Code; jeder Block entspricht einer oder mehreren Codezeilen. Bei BlueGrays-Projekten mit Blockansicht beschreiben die Blöcke und der hochgeladene Arduino-C++- oder MicroPython-Code dasselbe Programm.
Warum liefert digitalRead 1 oder 0, und ist HIGH dasselbe wie 1?
Ja, beim Arduino ist HIGH gleich 1 und LOW gleich 0, und digitalRead liefert nur einen dieser beiden Werte. Ein mit INPUT_PULLUP angeschlossener Taster liest gedrückt LOW und losgelassen HIGH. In MicroPython gibt pin.value() ebenfalls 1 oder 0 zurück.
Projekte, die du danach bauen kannst
Alle Projekte ansehen
Frequenzeinstellung mit Buzzer
Mit vier Knöpfen steuerst du den Ton eines Summers: Einer startet den Ton, einer macht ihn stumm, die anderen beiden machen ihn höher oder tiefer. Hältst du den Plus- oder Minusknopf gedrückt, ändert

Nachtlicht mit LDR
Ein kleines Nachtlicht, das von selbst angeht, wenn es dunkel wird, und am Morgen wieder ausgeht. Ein Lichtsensor misst, wie hell es im Zimmer ist; ist es dunkel genug, schaltet der Arduino die LED ei

Lichtstärke messen mit LDR
Willst du sehen, wie hell dein Zimmer ist, und zwar als Zahl? Der LDR, ein kleines lichtempfindliches Bauteil, misst das Umgebungslicht, und der Arduino schreibt den Wert jede halbe Sekunde auf deinen

LED mit Taster schalten (Push)
Wie bei einer Türklingel: Das Licht leuchtet, solange du drückst, und geht aus, wenn du loslässt. Der Arduino horcht ständig auf den Taster; solange er gedrückt ist, leuchtet die LED, und sobald du de

LED mit Taster ein- und ausschalten
Einmal drücken und das Licht geht an, noch einmal drücken und es geht aus, genau wie der Lichtschalter in deinem Zimmer. Der Arduino bemerkt jeden Druck und schaltet die LED in den jeweils anderen Zus

LED-Lauflicht mit einstellbarer Geschwindigkeit
Sechs LEDs leuchten nacheinander auf, sodass das Licht von einem Ende zum anderen zu laufen scheint. Drehst du am Knopf des Potentiometers, ändert sich das Tempo sofort: in die eine Richtung rast das

HC-SR04 Abstandsmessung (serielle Anzeige)
Der Sensor HC-SR04 funktioniert wie eine Fledermaus, die im Dunkeln ihren Weg findet: Er sendet einen Ton, den du nicht hörst, lauscht auf das Echo und misst, wie weit der Gegenstand vor ihm entfernt

Raspberry Pi Pico: Externe LED zum Leuchten bringen (Steckbrett)
Der nächste Schritt nach der integrierten LED des Pico: Eine externe LED an das Breadboard anschließen und über den GP14-Pin steuern. In diesem Projekt lernst du, wie du einen beliebigen universellen GPIO-Pin des Pico als Ausgang nutzen kannst, welche Polarität die LED hat (langes Bein = Anode/+, kurzes Bein = Kathode/–) und warum ein Strombegrenzungswiderstand (220 Ω) erforderlich ist. Wenn du den Widerstand weglässt, fließt zu viel Strom durch die LED und sie kann durchbrennen. Die Schaltung i
Weitere Artikel
BlueGrays-App
Diese Schaltung Schritt für Schritt auf dem Handy nachbauen
Schaltplan, Code und Teileliste auf einem Bildschirm. Über 200 Arduino-, ESP32- und Pico-Projekte zum Nachbauen.
Mit dem Handy scannen
Richte die Kamera auf den Code, dann öffnet sich der App-Store deines Handys.
oder im Store öffnen

