Jedes Arduino-Programm (Sketch genannt) hat eine grundlegende Struktur, die aus drei Hauptteilen besteht: Globale Variablen und Includes, der setup()
-Funktion und der loop()
-Funktion.
// 1. Includes und globale Variablen
// Hier werden Bibliotheken eingebunden und Variablen deklariert,
// die im gesamten Programm verfügbar sind.
#include <Servo.h> // Beispiel für das Einbinden einer Bibliothek
const int ledPin = 13; // Beispiel für eine globale Variable
// 2. setup() Funktion
// Dieser Code wird nur einmal ausgeführt, wenn das Arduino-Board startet oder zurückgesetzt wird.
// Er wird verwendet, um Pins zu konfigurieren, Bibliotheken zu initialisieren usw.
void setup() {
pinMode(ledPin, OUTPUT); // Konfiguriert den Pin als Ausgang
Serial.begin(9600); // Startet die serielle Kommunikation
}
// 3. loop() Funktion
// Nachdem setup() abgeschlossen ist, wird der Code in der loop() Funktion
// kontinuierlich in einer Schleife wiederholt, solange das Board mit Strom versorgt wird.
// Hier befindet sich die Hauptlogik des Programms.
void loop() {
digitalWrite(ledPin, HIGH); // Schaltet die LED ein
delay(1000);
digitalWrite(ledPin, LOW); // Schaltet die LED aus
delay(1000);
}
Element | Beschreibung |
---|---|
#include | Wird verwendet, um externe Bibliotheken einzubinden, die zusätzliche Funktionen bereitstellen (z.B. für Servos, LCDs). |
Globale Variablen | Variablen, die außerhalb aller Funktionen deklariert werden. Sie können von überall im Code aus aufgerufen und geändert werden. |
void setup() | Eine einmalige Einrichtungsfunktion. Perfekt für pinMode() , Serial.begin() und andere Initialisierungsaufgaben. |
void loop() | Die Hauptschleife, in der das Programm unendlich oft läuft. Hier wird der Code platziert, der wiederholt ausgeführt werden soll. |
Das einfachste Beispiel, das eine an einen digitalen Pin angeschlossene LED im Sekundentakt blinken lässt.
// Pin, an den die LED angeschlossen ist
const int ledPin = 13;
void setup() {
// Initialisiert den Pin als Ausgang
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH); // Schaltet die LED ein
delay(1000); // Wartet 1 Sekunde
digitalWrite(ledPin, LOW); // Schaltet die LED aus
delay(1000); // Wartet 1 Sekunde
}
Funktion | Beschreibung |
---|---|
pinMode(pin, mode) | Konfiguriert den angegebenen Pin für den Betrieb als Eingang (INPUT ) oder Ausgang (OUTPUT ). |
digitalWrite(pin, value) | Legt eine hohe (HIGH ) oder niedrige (LOW ) Spannung an den Pin an. |
delay(ms) | Pausiert die Programmausführung für die angegebene Anzahl von Millisekunden. |
Dieser Code ändert sanft die Farben einer RGB-LED (mit gemeinsamer Kathode), indem er mit PWM (Pulsweitenmodulation) durch Rot-, Grün- und Blautöne wechselt.
// Pins für jede Farbe (müssen PWM unterstützen)
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 11;
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop() {
// Übergang von Rot zu Grün
for (int i = 0; i < 255; i++) {
analogWrite(redPin, 255 - i);
analogWrite(greenPin, i);
delay(10);
}
// Übergang von Grün zu Blau
for (int i = 0; i < 255; i++) {
analogWrite(greenPin, 255 - i);
analogWrite(bluePin, i);
delay(10);
}
// Übergang von Blau zu Rot
for (int i = 0; i < 255; i++) {
analogWrite(bluePin, 255 - i);
analogWrite(redPin, i);
delay(10);
}
}
Funktion | Beschreibung |
---|---|
analogWrite(pin, value) | Sendet ein analoges Signal (PWM) an einen Pin. Der Wert kann zwischen 0 und 255 liegen. Der Pin muss PWM unterstützen (normalerweise mit einem ~-Symbol gekennzeichnet). |
Liest den analogen Wert eines Potentiometers aus und gibt ihn an den seriellen Monitor aus. Dies zeigt, wie sich die Spannung beim Drehen des Knopfes ändert.
// Pin, an den der mittlere Anschluss des Potentiometers angeschlossen ist
const int potPin = A0;
void setup() {
// Initialisiert die serielle Verbindung zur Datenausgabe
Serial.begin(9600);
}
void loop() {
// Liest den Wert vom analogen Eingang
int sensorValue = analogRead(potPin);
// Gibt den Wert an den seriellen Monitor aus
Serial.println(sensorValue);
delay(100); // Kleine Verzögerung zur Stabilisierung
}
Funktion | Beschreibung |
---|---|
Serial.begin(speed) | Initialisiert den seriellen Port für die Datenkommunikation mit der Geschwindigkeit speed (Baud). |
analogRead(pin) | Liest den Wert von einem analogen Pin (A0-A5). Gibt eine Zahl zwischen 0 und 1023 zurück. |
Serial.println(data) | Sendet Daten an den seriellen Port und fügt einen Zeilenumbruch hinzu. |
Misst die Entfernung zu einem Hindernis mit einem Ultraschallsensor und gibt das Ergebnis in Zentimetern an den seriellen Monitor aus.
const int trigPin = 9;
const int echoPin = 10;
long duration;
int distance;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void loop() {
// Setzt den trigPin zurück
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sendet einen Ultraschallimpuls
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Liest die Zeit des zurückkehrenden Echos
duration = pulseIn(echoPin, HIGH);
// Berechnet die Entfernung
distance = duration * 0.034 / 2;
// Gibt das Ergebnis aus
Serial.print("Entfernung: ");
Serial.print(distance);
Serial.println(" cm");
delay(500);
}
Funktion | Beschreibung |
---|---|
delayMicroseconds(us) | Pausiert die Programmausführung für die angegebene Anzahl von Mikrosekunden. |
pulseIn(pin, value) | Liest die Dauer eines Impulses (HIGH oder LOW ) an einem Pin. Gibt die Zeit in Mikrosekunden zurück. |
Steuert einen Gleichstrommotor mit einem L298N-Treiber: Vorwärts-, Rückwärtslauf, Stopp und Geschwindigkeitsregelung.
// Pins zur Motorsteuerung
const int enA = 9; // PWM für Geschwindigkeit
const int in1 = 8;
const int in2 = 7;
void setup() {
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
}
void loop() {
// Vorwärtsdrehung bei maximaler Geschwindigkeit
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, 255);
delay(2000);
// Rückwärtsdrehung bei halber Geschwindigkeit
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(enA, 128);
delay(2000);
// Motor anhalten
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
delay(2000);
}
Zustand | in1 | in2 | Beschreibung |
---|---|---|---|
Vorwärtsdrehung | HIGH | LOW | Der Motor dreht sich in eine Richtung. |
Rückwärtsdrehung | LOW | HIGH | Der Motor dreht sich in die entgegengesetzte Richtung. |
Anhalten | LOW | LOW | Der Motor stoppt (Freilauf). |
Bremsen | HIGH | HIGH | Der Motor bremst abrupt. |
Dreht die Welle eines Servomotors sanft von 0 auf 180 Grad und zurück. Erfordert die Einbindung der Bibliothek Servo.h
.
#include <Servo.h>
Servo myServo; // Erstellt ein Servo-Objekt
int pos = 0; // Variable zum Speichern der Position
void setup() {
myServo.attach(9); // Verbindet den Servo mit Pin 9
}
void loop() {
// Drehung von 0 auf 180 Grad
for (pos = 0; pos <= 180; pos += 1) {
myServo.write(pos); // Stellt den Winkel ein
delay(15);
}
// Drehung von 180 auf 0 Grad
for (pos = 180; pos >= 0; pos -= 1) {
myServo.write(pos);
delay(15);
}
}
Funktion | Beschreibung |
---|---|
#include <Servo.h> | Bindet die Bibliothek zur Steuerung von Servomotoren ein. |
myServo.attach(pin) | "Verbindet" das Servo-Objekt mit dem angegebenen Pin. |
myServo.write(angle) | Dreht die Servowelle auf den angegebenen Winkel (von 0 bis 180). |
Liest einen Tastendruck ohne Verwendung von delay()
aus und ignoriert dabei das "Prellen" der Kontakte – falsche Signale beim Drücken und Loslassen.
const int buttonPin = 2;
const int ledPin = 13;
int ledState = HIGH;
int buttonState;
int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);
}
void loop() {
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
digitalWrite(ledPin, ledState);
lastButtonState = reading;
}
Funktion | Beschreibung |
---|---|
millis() | Gibt die Anzahl der Millisekunden zurück, die seit dem Start des Programms vergangen sind. Wird verwendet, um Timer ohne Blockierung des Codes zu erstellen. |
Spielt eine einfache Melodie mit einem passiven Summer unter Verwendung der Funktion tone()
.
// Pin, an den der Summer angeschlossen ist
const int buzzerPin = 8;
// Noten der Melodie (Frequenz in Hz)
// c4=262, d4=294, e4=330, f4=349, g4=392, a4=440, b4=494
int melody[] = {262, 294, 330, 349, 392, 440, 494, 523};
int noteDuration = 500; // Dauer jeder Note
void setup() {
// Nichts im Setup erforderlich
}
void loop() {
// Spielt die Melodie ab
for (int thisNote = 0; thisNote < 8; thisNote++) {
tone(buzzerPin, melody[thisNote], noteDuration);
// Pause zwischen den Noten
delay(noteDuration + 50);
}
noTone(buzzerPin); // Schaltet den Ton aus
delay(2000); // Pause vor der Wiederholung
}
Funktion | Beschreibung |
---|---|
tone(pin, frequency) | Erzeugt an einem Pin ein Rechtecksignal mit der angegebenen Frequenz (in Hz). |
tone(pin, frequency, duration) | Erzeugt ein Signal mit der angegebenen Frequenz und Dauer (in ms). |
noTone(pin) | Stoppt die Signalerzeugung an einem Pin. |
Steuert einen adressierbaren LED-Streifen (z. B. WS2812B). Dieser Code erzeugt einen "Regenbogen"-Effekt. Die Installation der 'Adafruit NeoPixel'-Bibliothek ist erforderlich.
#include <Adafruit_NeoPixel.h>
#define LED_PIN 6 // Steuer-Pin des Streifens
#define LED_COUNT 16 // Anzahl der LEDs im Streifen
// Erstellt ein Streifen-Objekt
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin(); // Initialisiert den Streifen
strip.show(); // Schaltet alle LEDs aus
strip.setBrightness(50); // Stellt die Helligkeit ein (0-255)
}
void loop() {
rainbow(20); // Startet den Regenbogen-Effekt
}
void rainbow(int wait) {
for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
for(int i=0; i
Funktion | Beschreibung |
---|---|
strip.begin() | Initialisiert die Bibliothek und bereitet den Pin für den Betrieb vor. |
strip.show() | Aktualisiert die Farben auf dem Streifen. Ohne diesen Befehl werden Änderungen nicht angezeigt. |
strip.setPixelColor(n, color) | Legt die Farbe für die n-te LED fest. |
strip.Color(r, g, b) | Erstellt einen 32-Bit-Farbwert aus den Rot-, Grün- und Blau-Komponenten (0-255). |
strip.setBrightness(value) | Stellt die Gesamthelligkeit des Streifens ein. |
Dieses Programm steuert einen Servomotor basierend auf der Eingabe im seriellen Monitor. Wenn Sie '1' senden, dreht sich der Servo auf 90 Grad. Wenn Sie '0' senden, dreht er sich zurück auf 0 Grad.
#include <Servo.h>
Servo myServo; // Erstellt ein Servo-Objekt
void setup() {
myServo.attach(9); // Verbindet den Servo mit Pin 9
Serial.begin(9600); // Startet die serielle Kommunikation
myServo.write(0); // Setzt den Servo auf die Startposition 0 Grad
Serial.println("Sende '1' fuer 90 Grad und '0' fuer 0 Grad.");
}
void loop() {
// Prüft, ob Daten im seriellen Puffer verfügbar sind
if (Serial.available() > 0) {
// Liest das eingehende Zeichen
char command = Serial.read();
if (command == '1') {
myServo.write(90); // Dreht den Servo auf 90 Grad
Serial.println("Servo auf 90 Grad gedreht.");
} else if (command == '0') {
myServo.write(0); // Dreht den Servo auf 0 Grad
Serial.println("Servo auf 0 Grad gedreht.");
}
}
}
Funktion | Beschreibung |
---|---|
Serial.available() | Gibt die Anzahl der Bytes (Zeichen) zurück, die zum Lesen aus dem seriellen Port verfügbar sind. |
Serial.read() | Liest eingehende serielle Daten. Liest das erste verfügbare Byte der seriellen Daten. |