Grundlagen · 10 Min. Lesezeit

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.

Wenn du die Blöcke Schritt für Schritt lernen willst, gibt es die Reihe Von Blöcken zum Code: was Blockprogrammierung ist, eine LED mit Blöcken blinken lassen, der Falls-Block, Schleifen und Variablen und Sensoren mit Blöcken lesen und MicroPython. Dieser Beitrag fasst all diese Lektionen in einer Tabelle zusammen.
Blöcke des Projekts Frequenzeinstellung mit Buzzer: globale Variablen, vier Taster-Pins als EINGANG im Setup, Falls-Blöcke in immer wiederholen, Begrenzen- und Ton-Blöcke
Blöcke des Projekts Frequenzeinstellung mit Buzzer. Deklarieren, als EINGANG setzen, Pin lesen, setzen, begrenzen, Ton spielen und Ton stoppen aus der Tabelle stecken alle in diesem einen Programm.

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.

GruppeBlock (Beschriftung in der App)Arduino C++MicroPython (Pico)
AufbauSetup (läuft einmal)void setup() { … }Die Zeilen vor while True:
Aufbauimmer wiederholenvoid loop() { … }while True: (Inhalt um 4 Leerzeichen eingerückt)
Aufbauglobale Variablen (ganz oben)Anfang der Datei, vor setup()Die ersten Zeilen nach den Imports
Aufbauum blinkTwicevoid blinkTwice() { … } · Aufruf: blinkTwice();def blinkTwice(): · Aufruf: blinkTwice()
PinsPin 13 als AUSGANG setzenpinMode(13, OUTPUT);led = Pin(15, Pin.OUT)
PinsPin 2 als EINGANG (PULLUP) setzenpinMode(2, INPUT_PULLUP);btn = Pin(14, Pin.IN, Pin.PULL_UP)
PinsHOCH an Pin 13 schreiben · NIEDRIG an Pin 13 schreibendigitalWrite(13, HIGH); · digitalWrite(13, LOW);led.value(1) · led.value(0)
PinsPin 2 lesendigitalRead(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()
Zeit1000 ms warten · 0.5 Sekunden warten (Pico)delay(1000); · delay(500);time.sleep_ms(1000) · time.sleep(0.5)
Zeit10 µs wartendelayMicroseconds(10);time.sleep_us(10)
Zeitms seit dem Startmillis() (unsigned long)time.ticks_ms()
Bedingungfalls … mache … sonst falls … sonst …if (…) { … } else if (…) { … } else { … }if …: · elif …: · else:
Bedingung? = ? (≠, <, ≤, >, ≥)== != < <= > >=== != < <= > >=
Bedingung? und ? · ? oder ? · nicht ?&& · || · !xand · or · not x
Schleifewiederhole 3 -mal: machefor (int i = 0; i < 3; i++) { … }for i in range(3):
Schleifezähle i von 0 bis 5 in Schritten von 1for (i = 0; i <= 5; i++) (5 inklusive, 6 Durchläufe)for i in range(0, 6): (6 nicht inklusive)
Schleifewiederhole solangewhile (…) { … }while …:
Schleifedie Schleife abbrechenbreak;break
Variablendeklariere Ganzzahl (int) delayTime = 60int delayTime = 60;delayTime = 60 (ohne Typangabe)
Variablendeklariere Kommazahl (float) voltage = 0.0float voltage = 0.0;voltage = 0.0
Variablensetze x auf 0 · erhöhe x um 1x = 0; · x += 1; (oder x++;)x = 0 · x += 1 (x++ gibt es nicht)
VariablenArray 2 3 4 · Element 0 von ledPinsint ledPins[] = {2, 3, 4}; · ledPins[0]ledPins = [2, 3, 4] · ledPins[0]
Mathematik1 + 1 (auch −, ×, ÷)+ - * / · mit zwei int 7 / 2 = 3+ - * / · 7 / 2 = 3.5, Ganzzahldivision 7 // 2 = 3
MathematikRest von 10 ÷ 310 % 310 % 3
Mathematikx umrechnen: 0 – 1023 → 0 – 255map(x, 0, 1023, 0, 255)Nicht eingebaut; eine Funktion arduino_map() schreiben
Mathematikbegrenze 50 zwischen 0 und 100constrain(50, 0, 100)min(max(50, 0), 100)
Serielle SchnittstelleSeriell starten mit 9600 BaudSerial.begin(9600);Nicht nötig, print() läuft über USB
Serielle Schnittstelleseriell ausgeben … neue Zeile · ohne UmbruchSerial.println(x); · Serial.print(x);print(x) · print(x, end="")
Analog und PWManalog lesen A0analogRead(A0) → 0–1023 (beim ESP32 0–4095)ADC(26).read_u16() → 0–65535
Analog und PWMPWM 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)
Ton440 Hz an Pin 8 spielen · Ton an Pin 8 stoppentone(8, 440); · noTone(8);Kein Pico-Block: bz = PWM(Pin(16)) · bz.freq(440) · bz.duty_u16(32768) · Stopp: bz.duty_u16(0)
ServoServo 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°)
SensorDauer 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.

Rechne Schwellwerte und Spannungen beim Wechsel vom Arduino zum Pico neu. Ein Lichtschwellwert von 400 am Uno entspricht auf dem Pico etwa 25600 (400 × 65535 / 1023). Der Pico arbeitet mit 3,3 V: Versorge Sensor-Spannungsteiler über den Pin 3V3(OUT) und lege nie 5 V an GPIO- oder ADC-Pins.

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++-ZeileLeseregel
setze state auf 1state = 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 spielentone(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.

FehlerSymptomLösung
Kein Semikolon am Zeilenende„expected ';' before …“; der Compiler zeigt oft auf die Zeile darunterJede 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 StelleZu 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 Bedingungif (state = 1) ist immer wahr und setzt state auf 1; in Python SyntaxErrorVergleichen mit ==, zuweisen mit =. Der Vergleich = im Block ist im Code immer ==.
Kommazahl in einem intint volt = 3.7; speichert 3; 5 / 2 ergibt 2Für Kommazahlen float nehmen und beim Teilen eine Zahl als 5.0 schreiben.
Falscher Wert von digitalRead erwartetif (digitalRead(2) == 5) greift nie; mit Pull-up-Taster ist die Logik umgedrehtdigitalRead 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 NameErrordigitalWrite, pinMode und Serial genau so schreiben. In Python beginnen True und False mit Großbuchstaben.
Zählschleife um eins zu kurz übersetztEine 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 verschobenIndentationError oder eine Zeile landet außerhalb der SchleifeJede Zeile unter while und if mit denselben 4 Leerzeichen beginnen; Tabs und Leerzeichen nicht mischen.
Python-Zeit für Millisekunden haltentime.sleep(500) wartet über 8 Minutentime.sleep(0.5) oder time.sleep_ms(500) schreiben.
C++-Gewohnheiten in PythonSyntaxError durch x++, && oder ; am ZeilenendePython nutzt x += 1, and, or; ein Zeilenendzeichen gibt es nicht.
Wenn der Compiler auf eine Zeile zeigt, schau immer auch in die Zeile darüber. Ein fehlendes Semikolon oder eine offene Klammer wird oft eine Zeile unter dem eigentlichen Problem bemerkt. Werden mehrere Fehler auf einmal gemeldet, behebe nur den ersten und kompiliere neu; die übrigen sind oft nur Folgefehler.

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.

VerbindungArduino UnoRaspberry Pi Pico
LDR-Bein 15V3V3(OUT), physischer Pin 36
LDR-Bein 2 + ein Ende des 10-kΩ-Widerstands (Mittelpunkt)A0GP26 / ADC0, physischer Pin 31
Anderes Ende des 10-kΩ-WiderstandsGNDGND, physischer Pin 38
Langes LED-Bein (über einen 220-Ω-Widerstand)D9 (PWM-Pin)GP15, physischer Pin 20
Kurzes LED-BeinGNDGND, physischer Pin 18
Lichtwert / PWM-Bereich0–1023 / 0–2550–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:

  1. globale Variablen (ganz oben): deklariere Ganzzahl (int) lightValue = 0 und deklariere Ganzzahl (int) brightness = 0
  2. Setup (läuft einmal): Seriell starten mit 9600 Baud, danach Pin 9 als AUSGANG setzen
  3. immer wiederholen: setze lightValue auf (analog lesen A0)
  4. falls (lightValue < 400) mache: setze brightness auf (lightValue umrechnen: 0 – 400 → 255 – 0); sonst: setze brightness auf 0
  5. PWM brightness an Pin 9 schreiben
  6. seriell ausgeben „Light: “ ohne Umbruch, seriell ausgeben lightValue ohne Umbruch, seriell ausgeben „ PWM: “ ohne Umbruch, seriell ausgeben brightness neue Zeile
  7. 200 ms warten
C++ (Arduino IDE)
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}
33
MicroPython
1# ─────────────────────────────────────────
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
34

Vergleichst 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).

Probier Schritt drei gleich mit diesem Beispiel: Erhöhe am Uno den Schwellwert von 400 auf 600, damit die LED früher zu leuchten beginnt. Für dieselbe Änderung am Pico setzt du THRESHOLD auf etwa 38400. Beobachte den Light-Wert im seriellen Monitor (9600 Baud) oder in der Shell von Thonny und finde den passenden Schwellwert für deinen Raum.

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.

Alle Projekte ansehen
Frequenzeinstellung mit Buzzer
#14Mittel

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

4.6(69)
118
Nachtlicht mit LDR
#12Anfänger

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

4.8(102)
205
Lichtstärke messen mit LDR
#11Anfänger

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

4.6(81)
139
LED mit Taster schalten (Push)
#9Anfänger

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

4.8(113)
229
LED mit Taster ein- und ausschalten
#10Anfänger

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

4.8(100)
167
LED-Lauflicht mit einstellbarer Geschwindigkeit
#7Mittel

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

4.6(72)
146
HC-SR04 Abstandsmessung (serielle Anzeige)
#27Anfänger

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

4.6(46)
71
Raspberry Pi Pico: Externe LED zum Leuchten bringen (Steckbrett)
#148Anfänger

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

4.5(2)
7