Grundstruktur
void setup() {
// Wird einmal beim Start ausgeführt
}
void loop() {
// Wird danach ständig wiederholt
}
| Befehl | Erklärung |
|---|---|
setup() | Wird beim Start genau einmal ausgeführt. |
loop() | Wird danach fortlaufend wiederholt. |
Pins konfigurieren
pinMode(7, INPUT);
pinMode(8, OUTPUT);
pinMode(9, INPUT_PULLUP);
| Befehl | Erklärung |
|---|---|
pinMode(pin, INPUT) | Pin als Eingang verwenden. |
pinMode(pin, OUTPUT) | Pin als Ausgang verwenden. |
pinMode(pin, INPUT_PULLUP) | Eingang mit internem Pull-up-Widerstand. |
Digitale Ein- und Ausgabe
digitalWrite(8, HIGH);
digitalWrite(8, LOW);
int zustand = digitalRead(7);
| Befehl | Erklärung |
|---|---|
digitalWrite(pin, HIGH) | Ausgang auf HIGH setzen. |
digitalWrite(pin, LOW) | Ausgang auf LOW setzen. |
digitalRead(pin) | Digitalen Zustand lesen: HIGH oder LOW. |
Merke: HIGH entspricht logisch 1, LOW logisch 0.
Analoge Ein- und Ausgabe
Analog lesen
int wert = analogRead(A0);
Beim Arduino Uno liefert analogRead() normalerweise Werte von 0 bis 1023.
float spannung = wert * 5.0 / 1023;
PWM ausgeben
analogWrite(9, 128);
| Befehl | Erklärung |
|---|---|
analogRead(A0) | Analoge Spannung messen. |
analogWrite(pin, wert) | PWM-Signal ausgeben. |
wert | Typischerweise 0 bis 255. |
analogWrite(9, 0); // 0 %
analogWrite(9, 128); // ca. 50 %
analogWrite(9, 255); // 100 %
Wichtig: Beim klassischen Arduino Uno erzeugt
analogWrite() keine echte variable Spannung, sondern PWM.
Serielle Ausgabe
Zuerst im setup():
Serial.begin(9600);
Danach:
Serial.print("Wert: ");
Serial.println(wert);
| Befehl | Erklärung |
|---|---|
Serial.begin(9600) | Serielle Kommunikation starten. |
Serial.print() | Ausgabe ohne Zeilenumbruch. |
Serial.println() | Ausgabe mit anschliessendem Zeilenumbruch. |
Serial.print("Temperatur: ");
Serial.println(23);
Ausgabe:
Temperatur: 23
Warten und Zeit messen
delay(1000);
| Befehl | Erklärung |
|---|---|
delay(ms) | Programm für eine bestimmte Anzahl Millisekunden anhalten. |
millis() | Millisekunden seit dem Start des Arduino. |
unsigned long zeit = millis();
Variablen
int zahl = 10;
float temperatur = 22.5;
bool aktiv = true;
char zeichen = 'A';
| Datentyp | Beispiel | Verwendung |
|---|---|---|
int | int x = 5; | Ganze Zahlen |
float | float x = 2.5; | Dezimalzahlen |
bool | bool x = true; | Wahr/Falsch |
char | char x = 'A'; | Einzelnes Zeichen |
String | String name = "Arduino"; | Text |
unsigned long | unsigned long t = millis(); | Grosse positive Zahlen, oft für Zeitmessung |
Listen / Arrays
Begriff: Was in Python oft eine Liste ist, wird bei Arduino/C++ meistens als Array gespeichert. Ein Array enthält mehrere Werte desselben Datentyps und hat normalerweise eine feste Länge.
Array erstellen
int messwerte[] = {512, 630, 487, 700};
int ledPins[] = {3, 5, 6, 9};
String namen[] = {"Rot", "Grün", "Blau"};
Element lesen oder verändern
int ersterWert = messwerte[0]; // 512
messwerte[2] = 500; // dritten Wert ändern
Wichtig: Die Zählung beginnt bei
0. Bei vier Elementen sind deshalb nur die Indizes 0 bis 3 gültig.
Länge bestimmen
int anzahl = sizeof(messwerte) / sizeof(messwerte[0]);
sizeof(messwerte) liefert den gesamten Speicherbedarf. Durch den Speicherbedarf eines einzelnen Elements geteilt ergibt sich die Anzahl der Elemente.
Alle Elemente mit einer Schleife verwenden
int ledPins[] = {3, 5, 6, 9};
int anzahl = sizeof(ledPins) / sizeof(ledPins[0]);
void setup() {
for (int i = 0; i < anzahl; i++) {
pinMode(ledPins[i], OUTPUT);
}
}
void loop() {
for (int i = 0; i < anzahl; i++) {
digitalWrite(ledPins[i], HIGH);
delay(200);
digitalWrite(ledPins[i], LOW);
}
}
| Ausdruck | Bedeutung |
|---|---|
int zahlen[5]; | Array mit Platz für fünf Ganzzahlen anlegen. |
zahlen[0] | Erstes Element lesen. |
zahlen[i] = 10; | Element an Position i verändern. |
sizeof(zahlen) / sizeof(zahlen[0]) | Anzahl der Elemente bestimmen. |
Achtung: Ein Zugriff ausserhalb des Arrays, beispielsweise
messwerte[4] bei vier Elementen, kann zu unvorhersehbarem Verhalten führen. Arduino prüft die Grenzen nicht automatisch.
Bedingungen und Operatoren
if (wert > 500) {
digitalWrite(8, HIGH);
} else {
digitalWrite(8, LOW);
}
if (wert > 800) {
// ...
}
else if (wert > 400) {
// ...
}
else {
// ...
}
Vergleichsoperatoren
| Operator | Bedeutung |
|---|---|
== | gleich |
!= | ungleich |
< | kleiner |
> | grösser |
<= | kleiner oder gleich |
>= | grösser oder gleich |
Logische Operatoren
| Operator | Bedeutung |
|---|---|
&& | UND |
|| | ODER |
! | NICHT |
if (temperatur > 20 && licht == HIGH) {
// ...
}
Schleifen
for-Schleife
for (int i = 0; i < 10; i++) {
Serial.println(i);
}
Wiederholt einen Codeblock eine bestimmte Anzahl Mal.
while-Schleife
while (digitalRead(7) == HIGH) {
// Wiederholen, solange Bedingung wahr ist
}
Funktionen
void ledAn() {
digitalWrite(8, HIGH);
}
Aufruf:
ledAn();
Funktion mit Rückgabewert:
int verdoppeln(int zahl) {
return zahl * 2;
}
Aufruf:
int ergebnis = verdoppeln(5);
Konstanten für Pins
Statt:
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
besser:
const int LED_PIN = 8;
void setup() {
pinMode(LED_PIN, OUTPUT);
}
So ist der Code verständlicher und leichter anzupassen.
Zufallszahlen
int zahl = random(1, 7);
Erzeugt eine Zufallszahl von 1 bis 6.
random(min, max);
max ist dabei nicht enthalten.
Nützliche Zahlenfunktionen
| Befehl | Erklärung |
|---|---|
min(a, b) | Kleineren Wert bestimmen. |
max(a, b) | Grösseren Wert bestimmen. |
abs(x) | Absolutwert. |
constrain(x, min, max) | Wert auf einen Bereich begrenzen. |
map() | Wert von einem Bereich auf einen anderen umrechnen. |
int pwm = map(sensorwert, 0, 1023, 0, 255);
Komplettes Mini-Beispiel
Ein Taster steuert eine LED:
const int LED_PIN = 8;
const int BUTTON_PIN = 7;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
int button = digitalRead(BUTTON_PIN);
if (button == LOW) {
digitalWrite(LED_PIN, HIGH);
Serial.println("Taster gedrückt");
}
else {
digitalWrite(LED_PIN, LOW);
}
delay(50);
}
Merksätze
pinMode()bestimmt die Rolle des Pins.digitalRead()liest HIGH oder LOW.digitalWrite()setzt einen digitalen Ausgang.analogRead()misst einen analogen Wert.analogWrite()erzeugt meist PWM.Serial.print()bleibt auf derselben Zeile.Serial.println()beginnt danach eine neue Zeile.delay()blockiert das Programm während der Wartezeit.millis()ermöglicht Zeitmessung ohne das Programm anzuhalten.