Das brauchst du für dieses Tutorial
- Arduino Board (z.B. Arduino Uno) – Auf Amazon ansehen
- USB-Kabel für Arduino – Auf Amazon ansehen
Zusätzlich benötigst du:
- Computer mit installierter Arduino IDE
- Optional: LED mit 220Ω Widerstand für praktische Beispiele
- Optional: Taster mit 10kΩ Pull-down-Widerstand
Hinweis: Dieses Tutorial ist rein softwarebezogen – du kannst alle Beispiele direkt im Serial Monitor testen, ohne zusätzliche Hardware anzuschließen.
Arithmetische Operatoren – Rechnen mit Arduino
Die arithmetischen Operatoren kennst du bereits aus der Mathematik. Ich zeige dir, wie du sie in deinen Arduino-Projekten einsetzt:
Addition (+) – Addiert zwei Werte
Subtraktion (-) – Subtrahiert einen Wert vom anderen
Multiplikation (*) – Multipliziert zwei Werte
Division (/) – Dividiert einen Wert durch einen anderen
Modulo (%) – Gibt den Rest einer Division zurück
Hier siehst du ein praktisches Beispiel:
void setup() {
Serial.begin(9600);
int a = 15;
int b = 4;
Serial.print("Addition: ");
Serial.println(a + b); // Ergebnis: 19
Serial.print("Subtraktion: ");
Serial.println(a - b); // Ergebnis: 11
Serial.print("Multiplikation: ");
Serial.println(a * b); // Ergebnis: 60
Serial.print("Division: ");
Serial.println(a / b); // Ergebnis: 3 (Ganzzahldivision!)
Serial.print("Modulo: ");
Serial.println(a % b); // Ergebnis: 3 (Rest der Division)
}
void loop() {
// Hier passiert nichts
}
Wichtig: Bei der Division von Ganzzahlen (int) erhältst du immer nur ganze Zahlen als Ergebnis. Wenn du Dezimalstellen brauchst, verwende float oder double:
float a = 15.0; float b = 4.0; float ergebnis = a / b; // Ergebnis: 3.75
Der Modulo-Operator ist besonders nützlich, wenn du prüfen möchtest, ob eine Zahl gerade oder ungerade ist:
int zahl = 7;
if (zahl % 2 == 0) {
Serial.println("Gerade Zahl");
} else {
Serial.println("Ungerade Zahl");
}
Vergleichsoperatoren – Werte miteinander vergleichen
Vergleichsoperatoren sind essentiell für Entscheidungen in deinem Code. Sie geben immer einen Boolean-Wert zurück (true oder false):
Gleich (==) – Prüft auf Gleichheit
Ungleich (!=) – Prüft auf Ungleichheit
Größer als (>) – Prüft ob größer
Kleiner als (<) – Prüft ob kleiner
Größer oder gleich (>=) – Prüft ob größer oder gleich
Kleiner oder gleich (<=) – Prüft ob kleiner oder gleich
Hier ein praktisches Beispiel mit Sensordaten:
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorWert = analogRead(A0);
int schwellenwert = 512;
if (sensorWert == schwellenwert) {
Serial.println("Exakt am Schwellenwert!");
}
if (sensorWert != schwellenwert) {
Serial.println("Nicht am Schwellenwert");
}
if (sensorWert > schwellenwert) {
Serial.println("Über dem Schwellenwert");
}
if (sensorWert < schwellenwert) {
Serial.println("Unter dem Schwellenwert");
}
if (sensorWert >= 1000) {
Serial.println("Sehr hoher Wert!");
}
if (sensorWert <= 100) {
Serial.println("Sehr niedriger Wert!");
}
delay(1000);
}
Häufiger Fehler: Verwechsle nicht den Vergleichsoperator == mit dem Zuweisungsoperator =. Das ist eine der häufigsten Fehlerquellen:
// FALSCH:
if (sensorWert = 100) { // Weist 100 zu, vergleicht nicht!
}
// RICHTIG:
if (sensorWert == 100) { // Vergleicht mit 100
}
Logische Operatoren – Komplexe Bedingungen erstellen
Mit logischen Operatoren kombinierst du mehrere Bedingungen. Ich nutze sie ständig, um komplexe Entscheidungen zu programmieren:
UND (&&) – Beide Bedingungen müssen wahr sein
ODER (||) – Mindestens eine Bedingung muss wahr sein
NICHT (!) – Kehrt den Wahrheitswert um
Schauen wir uns ein realistisches Beispiel an – eine intelligente Alarmanlage:
void setup() {
Serial.begin(9600);
pinMode(2, INPUT); // Bewegungssensor
pinMode(3, INPUT); // Türkontakt
pinMode(13, OUTPUT); // Alarm-LED
}
void loop() {
bool bewegungErkannt = digitalRead(2);
bool tuerOffen = digitalRead(3);
bool nachtModus = true; // Könnte von RTC kommen
// UND-Operator: Alarm nur wenn Bewegung UND Nachtmodus
if (bewegungErkannt && nachtModus) {
Serial.println("ALARM: Bewegung im Nachtmodus!");
digitalWrite(13, HIGH);
}
// ODER-Operator: Warnung bei Bewegung ODER offener Tür
if (bewegungErkannt || tuerOffen) {
Serial.println("Warnung: Aktivität erkannt");
}
// NICHT-Operator: Aktion wenn KEINE Bewegung
if (!bewegungErkannt) {
Serial.println("Alles ruhig");
digitalWrite(13, LOW);
}
// Komplexe Kombination
if ((bewegungErkannt && nachtModus) || tuerOffen) {
Serial.println("Sicherheitsprotokoll aktiviert!");
}
delay(500);
}
Wahrheitstabelle für &&:
- true && true = true
- true && false = false
- false && true = false
- false && false = false
Wahrheitstabelle für ||:
- true || true = true
- true || false = true
- false || true = true
- false || false = false
Zuweisungsoperatoren – Effizienter Code schreiben
Zuweisungsoperatoren speichern nicht nur Werte, sondern können auch Berechnungen durchführen. Ich zeige dir die wichtigsten:
Einfache Zuweisung (=) – Weist einen Wert zu
Addition mit Zuweisung (+=) – Addiert und speichert
Subtraktion mit Zuweisung (-=) – Subtrahiert und speichert
Multiplikation mit Zuweisung (*=) – Multipliziert und speichert
Division mit Zuweisung (/=) – Dividiert und speichert
void setup() {
Serial.begin(9600);
int punkte = 100;
Serial.print("Start: ");
Serial.println(punkte);
// Klassische Schreibweise
punkte = punkte + 50;
Serial.print("Nach +50: ");
Serial.println(punkte); // 150
// Verkürzte Schreibweise (empfohlen)
punkte += 30;
Serial.print("Nach +=30: ");
Serial.println(punkte); // 180
punkte -= 20;
Serial.print("Nach -=20: ");
Serial.println(punkte); // 160
punkte *= 2;
Serial.print("Nach *=2: ");
Serial.println(punkte); // 320
punkte /= 4;
Serial.print("Nach /=4: ");
Serial.println(punkte); // 80
}
void loop() {
// Hier passiert nichts
}
Diese zusammengesetzten Operatoren machen deinen Code nicht nur kürzer, sondern auch lesbarer. Ich verwende sie besonders gern in Zählschleifen und bei der Verarbeitung von Sensordaten:
int gesamtMessungen = 0;
void loop() {
int sensorWert = analogRead(A0);
gesamtMessungen += sensorWert; // Addiert jede Messung
delay(100);
}
Inkrement und Dekrement – Zählen leicht gemacht
Die Inkrement- und Dekrement-Operatoren sind spezialisierte Zuweisungsoperatoren für +1 und -1:
Inkrement (++) – Erhöht um 1
Dekrement (–) – Verringert um 1
Du kannst sie vor (Präfix) oder nach (Postfix) der Variable platzieren – mit unterschiedlicher Bedeutung:
void setup() {
Serial.begin(9600);
int zaehler = 5;
// Postfix: Erst verwenden, dann erhöhen
Serial.println(zaehler++); // Gibt 5 aus
Serial.println(zaehler); // Gibt 6 aus
zaehler = 5; // Zurücksetzen
// Präfix: Erst erhöhen, dann verwenden
Serial.println(++zaehler); // Gibt 6 aus
Serial.println(zaehler); // Gibt 6 aus
}
void loop() {
// Hier passiert nichts
}
In der Praxis nutze ich diese Operatoren hauptsächlich in Schleifen und Zählern:
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
static int blinkZaehler = 0;
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
blinkZaehler++; // Zählt jeden Blink
if (blinkZaehler >= 10) {
Serial.println("10 Blinks erreicht!");
blinkZaehler = 0; // Zurücksetzen
}
}
Bitweise Operatoren – Low-Level-Programmierung
Bitweise Operatoren arbeiten direkt auf der Bit-Ebene deiner Daten. Sie sind extrem effizient und werden oft für Hardware-Kommunikation und Optimierungen verwendet:
AND (&) – Bitweises UND
OR (|) – Bitweises ODER
XOR (^) – Bitweises Exklusiv-ODER
NOT (~) – Bitweise Negation
Linksshift (<<) – Verschiebt Bits nach links
Rechtsshift (>>) – Verschiebt Bits nach rechts
Hier ein praktisches Beispiel für die Port-Manipulation – damit steuerst du mehrere Pins gleichzeitig:
void setup() {
Serial.begin(9600);
// Beispiel 1: Bitweises AND
byte a = 0b11110000; // Binär: 11110000
byte b = 0b10101010; // Binär: 10101010
byte ergebnis = a & b; // Binär: 10100000
Serial.print("AND Ergebnis: ");
Serial.println(ergebnis, BIN);
// Beispiel 2: Bitweises OR
ergebnis = a | b; // Binär: 11111010
Serial.print("OR Ergebnis: ");
Serial.println(ergebnis, BIN);
// Beispiel 3: Bitweises XOR
ergebnis = a ^ b; // Binär: 01011010
Serial.print("XOR Ergebnis: ");
Serial.println(ergebnis, BIN);
// Beispiel 4: Bitweises NOT
ergebnis = ~a; // Invertiert alle Bits
Serial.print("NOT Ergebnis: ");
Serial.println(ergebnis, BIN);
// Beispiel 5: Links-Shift (Multipliziert mit 2)
byte wert = 5; // Binär: 00000101
ergebnis = wert << 1; // Binär: 00001010 (dezimal: 10)
Serial.print("Links-Shift: ");
Serial.println(ergebnis);
// Beispiel 6: Rechts-Shift (Dividiert durch 2)
wert = 20; // Binär: 00010100
ergebnis = wert >> 1; // Binär: 00001010 (dezimal: 10)
Serial.print("Rechts-Shift: ");
Serial.println(ergebnis);
}
void loop() {
// Hier passiert nichts
}
Ein super nützliches Praxis-Beispiel ist das Setzen und Löschen einzelner Bits – ideal für die Arbeit mit Registern:
void setup() {
Serial.begin(9600);
byte status = 0b00000000;
// Bit 3 setzen (auf 1)
status |= (1 << 3);
Serial.print("Nach Setzen von Bit 3: ");
Serial.println(status, BIN); // 00001000
// Bit 5 setzen
status |= (1 << 5);
Serial.print("Nach Setzen von Bit 5: ");
Serial.println(status, BIN); // 00101000
// Bit 3 löschen (auf 0)
status &= ~(1 << 3);
Serial.print("Nach Löschen von Bit 3: ");
Serial.println(status, BIN); // 00100000
// Bit 5 prüfen
if (status & (1 << 5)) {
Serial.println("Bit 5 ist gesetzt!");
}
// Bit 5 togglen (umschalten)
status ^= (1 << 5);
Serial.print("Nach Toggle von Bit 5: ");
Serial.println(status, BIN); // 00000000
}
void loop() {
// Hier passiert nichts
}
Praktischer Tipp: Bitweise Operationen sind perfekt, wenn du mehrere LEDs gleichzeitig steuern oder Port-Register direkt manipulieren möchtest:
void setup() {
// Setze Pins 8-13 als Output mit einem Befehl
DDRB = 0b00111111; // Ports 8-13 sind auf PORTB
}
void loop() {
// Schalte alle LEDs gleichzeitig an
PORTB = 0b00111111;
delay(500);
// Schalte alle LEDs gleichzeitig aus
PORTB = 0b00000000;
delay(500);
}
Operator-Priorität – Die Reihenfolge ist wichtig
Genau wie in der Mathematik haben Arduino Operatoren eine bestimmte Ausführungsreihenfolge. Ich zeige dir die wichtigsten Regeln:
Priorität von hoch nach niedrig:
- Klammern ()
- Inkrement/Dekrement (++, –)
- Multiplikation, Division, Modulo (*, /, %)
- Addition, Subtraktion (+, -)
- Bitweise Shifts (<<, >>)
- Vergleichsoperatoren (<, >, <=, >=)
- Gleichheit (==, !=)
- Bitweise AND (&)
- Bitweise XOR (^)
- Bitweise OR (|)
- Logisches AND (&&)
- Logisches OR (||)
- Zuweisungsoperatoren (=, +=, -=, etc.)
Ein praktisches Beispiel zeigt, warum das wichtig ist:
void setup() {
Serial.begin(9600);
int ergebnis;
// Ohne Klammern
ergebnis = 5 + 3 * 2;
Serial.println(ergebnis); // 11 (nicht 16!)
// Grund: * wird vor + ausgeführt
// Mit Klammern
ergebnis = (5 + 3) * 2;
Serial.println(ergebnis); // 16
// Komplexeres Beispiel
int a = 10;
int b = 5;
bool bedingung = a > 5 && b < 10 || a == 15;
// Wird ausgeführt als: ((a > 5) && (b < 10)) || (a == 15)
Serial.println(bedingung); // true
}
void loop() {
// Hier passiert nichts
}
Mein Tipp: Wenn du dir unsicher bist, verwende lieber eine Klammer zu viel als zu wenig. Das macht deinen Code auch für andere lesbarer!
Praxis-Beispiel: Alle Operatoren in einem Projekt
Zum Abschluss zeige ich dir ein komplettes Beispiel, das verschiedene Operatorentypen kombiniert – ein einfaches Ampel-System mit Logik:
// Pin-Definitionen
const int rotPin = 11;
const int gelbPin = 10;
const int gruenPin = 9;
const int tasterPin = 2;
// Zustandsvariablen
unsigned long letzteSchaltung = 0;
int ampelPhase = 0;
int tasterDruecke = 0;
void setup() {
Serial.begin(9600);
// Ausgänge definieren
pinMode(rotPin, OUTPUT);
pinMode(gelbPin, OUTPUT);
pinMode(gruenPin, OUTPUT);
pinMode(tasterPin, INPUT);
Serial.println("Ampel-System gestartet!");
}
void loop() {
unsigned long aktuelleZeit = millis();
bool tasterGedrueckt = digitalRead(tasterPin);
// Inkrement-Operator: Zähle Taster-Drücke
if (tasterGedrueckt) {
tasterDruecke++;
Serial.print("Taster gedrückt: ");
Serial.println(tasterDruecke);
delay(300); // Entprellung
}
// Modulo-Operator: Alle 10 Drücke Statistik
if (tasterDruecke % 10 == 0 && tasterDruecke > 0) {
Serial.println("--- 10 Taster-Drücke erreicht! ---");
tasterDruecke = 0; // Reset
}
// Vergleichs- und logische Operatoren: Ampelsteuerung
// Zeitintervall: 3 Sekunden = 3000 Millisekunden
if ((aktuelleZeit - letzteSchaltung >= 3000) || tasterGedrueckt) {
// Inkrement mit Modulo: Zyklische Phasen 0-2
ampelPhase++;
ampelPhase %= 3;
// Alle LEDs aus (bitweise Operation möglich, hier klassisch)
digitalWrite(rotPin, LOW);
digitalWrite(gelbPin, LOW);
digitalWrite(gruenPin, LOW);
// Vergleichsoperatoren: Welche Phase?
if (ampelPhase == 0) {
// Phase 0: Rot
digitalWrite(rotPin, HIGH);
Serial.println("Phase: ROT");
} else if (ampelPhase == 1) {
// Phase 1: Rot + Gelb
digitalWrite(rotPin, HIGH);
digitalWrite(gelbPin, HIGH);
Serial.println("Phase: ROT + GELB");
} else {
// Phase 2: Grün
digitalWrite(gruenPin, HIGH);
Serial.println("Phase: GRUEN");
}
// Zuweisungsoperator
letzteSchaltung = aktuelleZeit;
}
// Logischer Operator: Warnung bei bestimmten Bedingungen
if (ampelPhase == 2 && tasterDruecke > 5) {
Serial.println("Warnung: Viele Taster-Drücke bei Grünphase!");
}
// Bitweises Beispiel: LED-Helligkeit durch PWM
int helligkeit = 128; // 50% Helligkeit
// Verdoppeln mit Links-Shift
int voelleHelligkeit = helligkeit << 1; // 256 (begrenzt auf 255)
// Halbieren mit Rechts-Shift
int halbeHelligkeit = helligkeit >> 1; // 64
}
Häufige Fehler beim Einsatz von Arduino Operatoren
Aus meiner Erfahrung sind das die typischen Stolperfallen:
1. Verwechslung von = und ==
// FALSCH:
if (sensorWert = 100) { // Zuweisung statt Vergleich!
// RICHTIG:
if (sensorWert == 100) {
2. Integer-Division vergessen
int a = 7; int b = 2; int ergebnis = a / b; // Ergebnis ist 3, nicht 3.5! // Besser: float ergebnis = (float)a / b; // Ergebnis ist 3.5
3. Operator-Priorität ignorieren
// Unklar: if (a > 5 && b < 10 || c == 0) // Besser: if ((a > 5 && b < 10) || (c == 0))
4. Überlauf bei Berechnungen
byte wert = 250; wert += 10; // Überlauf! Ergebnis ist 4, nicht 260
Fazit: Meistere die Arduino Operatoren
Operatoren sind das Fundament jeder Arduino-Programmierung. Du hast jetzt einen kompletten Überblick über alle wichtigen Operator-Typen – von einfachen Berechnungen bis zu effizienter Bit-Manipulation.
Das Wichtigste zusammengefasst:
✓ Arithmetische Operatoren ermöglichen dir Berechnungen mit Sensordaten und Messwerten
✓ Vergleichsoperatoren treffen Entscheidungen basierend auf Bedingungen
✓ Logische Operatoren kombinieren mehrere Bedingungen für komplexe Logik
✓ Zuweisungsoperatoren machen deinen Code effizienter und lesbarer
✓ Inkrement/Dekrement vereinfacht Zähler und Schleifen
✓ Bitweise Operatoren ermöglichen direkten Hardware-Zugriff und Optimierungen
Mein Rat: Experimentiere mit den Code-Beispielen und baue sie in deine eigenen Projekte ein. Öffne den Serial Monitor und beobachte, wie verschiedene Operatoren arbeiten. Je mehr du übst, desto intuitiver wirst du sie einsetzen.
Deine nächsten Schritte:
- Kombiniere verschiedene Operatorentypen in einem eigenen Projekt
- Lerne Kontrollstrukturen (if, while, for) für noch komplexere Logik
- Setze bitweise Operatoren für effiziente Port-Manipulation ein
- Nutze Operatoren für die intelligente Verarbeitung von Sensordaten
Viel Erfolg beim Programmieren deiner Arduino-Projekte! Mit diesem Wissen über Operatoren steht dir die komplette Welt der Arduino-Programmierung offen.
was bedeutet der Operator >> oder <>1; // rechstschieben um 1 (Division /2)
n = n<<2; // rechstschieben um 2 (Multplikation *4)
Hallo zusammen,
was bedeutet der Operator >> oder << ?
Gruß, Thomas
Hallo,
wie bekomme ich die senkrechten Striche für or in der Programmieroberfläche hin?
@Denny: Genau so ist es. Danke. Hoffentlich stimmt der Rest :D
Die Beispiele für die Boolschen Operatoren sind immer „wahr“, da dort eine Zuweisung (=) und kein Vergleich (==) stattfindet, oder?
Es müsste also
(a==2)&&(b==5)
heißen, oder habe ich da was falsch verstanden?
@Nelson: Dankeschön. Ich hoffe, jetzt stimmt es. :)
„|| ODER (a=2)!!(b=5)“ na der Tippfehler ist ja noch drinn :)
@rtp: Genau. Es soll || heißen. Vielen Dank. Ich hab es geändert :)
Ist der ODER-Operator wirklich „!!“ ? Das ist doch bestimmt ein Tipp-Fehler und es sollte dort „||“ stehen, oder?
wäre noch < oder > zu erwähnen,die synonyme für > und < darstellen ( greater than und lower than oder so)