Der Arduino Nano ist eines der vielseitigsten und anfängerfreundlichsten Mikrocontroller-Boards auf dem Markt. Egal, ob Sie sich für Robotik, IoT, Hausautomation interessieren oder einfach nur Elektronik lernen möchten – dieser Leitfaden führt Sie durch alles, was Sie wissen müssen, um loszulegen und tolle Projekte zu realisieren.
In diesem umfassenden Leitfaden lernen Sie:
Der Arduino Nano ist ein kleines, für Steckplatinen geeignetes Mikrocontroller-Board, das auf dem ATmega328P-Prozessor (oder in neueren Versionen auf dem ATmega4809) basiert. Es eignet sich perfekt für Embedded-Projekte, bei denen der Platz begrenzt ist.
Vorteile:
Ideal für:
| Spezifikation | Details |
|---|---|
| Prozessor | ATmega328P |
| Betriebsspannung | 5 V |
| Eingangsspannung | 7–12 V (über Vin) oder 5 V (über USB) |
| Digitale I/O-Pins | 14 (6 PWM-fähig) |
| Analoge Eingangs-Pins | 8 |
| Gleichstrom pro I/O | 40 mA |
| Flash-Speicher | 32 KB |
| SRAM | 2 KB |
| EEPROM | 1 KB |
| Taktrate | 16 MHz |
| Abmessungen | 45 mm × 18 mm |
Der Arduino Nano verfügt über folgende Pin-Gruppen:
Digitale Pins (0–13):
Analoge Pins (A0–A7):
Spezielle Pins:
Für detaillierte Pinbelegungsdiagramme suchen Sie bei Google Bilder nach „Arduino Nano Pinbelegungsdiagramm“ oder besuchen Sie arduino.cc
Wesentliche Komponenten:
Arduino Nano Mikrocontroller-Board
USB-Kabel (USB Typ A auf Mini-B)
Breadboard (400–830 Löcher)
Jumper-Kabel
Wichtiger Hinweis: Die beiden Pin-Reihen sollten sich auf gegenüberliegenden Seiten des mittleren Kanals befinden. So bleibt der mittlere Bereich frei für den Einbau von Sensoren und anderen Komponenten.
Identifizieren Sie die Stromversorgungs-Pins am Nano:
Stromschienen auf dem Steckbrett anlegen:
Visuelle Anordnung:
[Arduino Nano]
5V → Rote Schiene (Stromversorgung)
GND → Schwarze Schiene (Masse)
Sie haben zwei hervorragende Optionen für die Programmierung Ihres Arduino Nano. Wir werden beide behandeln.
Die Arduino IDE ist die offizielle Entwicklungsumgebung und perfekt für Anfänger geeignet.
Arduino IDE herunterladen:
IDE installieren:
./install.sh ausStarte die Arduino IDE:
setup() und loop() sehenBoard auswählen:
Tools → Board: → Arduino AVR Boards → Arduino NanoProzessor auswählen:
Tools → Processor: → ATmega328P (oder ATmega328P (Old Bootloader), falls Ihr Nano älter ist)COM-Port auswählen:
Tools → Port: → Wählen Sie den angezeigten COM-Port ausCOM3 oder höher/dev/cu.usbserial-####/dev/ttyUSB0Verbindung testen:
Tools → Get Board InfoVS Code bietet eine professionelle Entwicklungsumgebung mit verbesserter Code-Bearbeitung.
VS Code installieren:
Arduino-Erweiterung installieren:
Arduino CLI installieren (erforderliches Backend):
arduino-cli version ausführenVS Code konfigurieren:
Strg+Umschalt+P (Cmd+Umschalt+P auf dem Mac)Arduino AVR BoardsErstellen Sie Ihr erstes Projekt:
sketch.inoBoard-Einstellungen konfigurieren:
.ino-Datei und drücken Sie Strg+Alt+U, um sie hochzuladenSchreiben und laden wir Ihr erstes Programm hoch: ein einfaches LED-Blinkprogramm.
Physikalischer Aufbau:
Code:
// Arduino Nano – Einfaches LED-Blinken // Dieses Programm lässt die integrierte LED an Pin 13 blinken void setup() { // setup() wird einmal ausgeführt, wenn das Board startet // Pin 13 als Ausgang konfigurieren pinMode(13, OUTPUT); } void loop() { // loop() wird wiederholt ausgeführt, endlos // LED einschalten digitalWrite(13, HIGH); // 1000 Millisekunden warten (1 Sekunde) delay(1000); // LED ausschalten digitalWrite(13, LOW); // 1000 Millisekunden (1 Sekunde) warten delay(1000); }
Anweisungen zum Hochladen:
Arduino IDE:
Sketch → Upload (oder Strg+U)VS Code:
.ino-DateiStrg+Alt+UErwartetes Ergebnis:
pinMode(pin, mode)
setup() aufgerufen werdenpinMode(13, OUTPUT) macht Pin 13 zu einem AusgangdigitalWrite(pin, value)
digitalWrite(13, HIGH) sendet 5 V an Pin 13delay(Millisekunden)
delay(500) pausiert für 500 ms (eine halbe Sekunde)setup() vs. loop()
setup(): Wird einmal beim Start ausgeführt, dient der Initialisierungloop(): Wird endlos wiederholt ausgeführt; hier befindet sich die Hauptlogik Ihres ProgrammsArduino-Code ist eigentlich eine vereinfachte Version von C++. Das Verständnis der Grundlagen hilft Ihnen dabei, bessere Programme zu schreiben.
Variablen speichern Informationen. Hier sind die gängigen Typen:
// Integer – ganze Zahlen int age = 25; int count = 0; // Float – Dezimalzahlen float temperature = 23.5; float voltage = 3.14; // Byte – 0 bis 255 (spart Speicherplatz) byte brightness = 255; // Boolean – wahr oder falsch boolean isMotorRunning = true; bool ledIsOn = false; // Character – einzelnes Zeichen char initial = 'A'; // String – Text String sensorName = "Temperature Sensor";
Konstanten sind Werte, die sich nie ändern. Verwende sie für Pin-Nummern:
// Definieren Sie Konstanten am Anfang Ihres Programms const int LED_PIN = 13; const int BUTTON_PIN = 2; const int SENSOR_PIN = A0; // Verwenden Sie sie in Ihrem Code pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH);
Führen Sie Operationen mit Variablen durch:
// Arithmetik int result = 10 + 5; // Addition int math = 20 - 8; // Subtraktion int product = 4 * 5; // Multiplikation int quotient = 20 / 4; // Division int remainder = 17 % 5; // Modulo (Rest) // Vergleich (gibt true oder false zurück) if (10 > 5) { } // größer als if (5 < 10) { } // kleiner als if (5 == 5) { } // gleich if (5 != 10) { } // ungleich // Logik if (a > 5 && b < 10) { } // AND (beide müssen wahr sein) if (a > 5 || b < 10) { } // OR (mindestens eine Bedingung muss wahr sein) if (!isRunning) { } // NOT (Gegenteil von wahr/falsch)
Steuern Sie, was Ihr Programm tut:
// IF-Anweisung if (temperature > 30) { digitalWrite(COOLER_PIN, HIGH); } // IF-ELSE if (buttonPressed) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } // FOR-Schleife – eine bestimmte Anzahl von Malen wiederholen for (int i = 0; i < 10; i++) { digitalWrite(LED_PIN, HIGH); delay(100); digitalWrite(LED_PIN, LOW); delay(100); } // WHILE-Schleife – wiederholen, bis die Bedingung falsch ist while (sensorValue > 500) { Serial.println(sensorValue); sensorValue = analogRead(A0); }
Erstellen Sie wiederverwendbare Code-Blöcke:
// Funktionsdeklaration void blinkLED(int times) { for (int i = 0; i < times; i++) { digitalWrite(LED_PIN, HIGH); delay(200); digitalWrite(LED_PIN, LOW); delay(200); } } // Funktion, die einen Wert zurückgibt int readSensorValue() { int value = analogRead(A0); return value; } // Verwendung von Funktionen void loop() { blinkLED(3); // Funktion mit Parameter aufrufen int sensorReading = readSensorValue(); }
Kommunikation mit Ihrem Computer:
void setup() { // Serielle Kommunikation mit einer Baudrate von 9600 starten Serial.begin(9600); // Meldungen ausgeben Serial.println("System gestartet!"); } void loop() { // Sensorwert ausgeben int value = analogRead(A0); Serial.print("Sensor: "); Serial.println(value); delay(1000); }
Anzeigen der seriellen Ausgabe:
Tools → Serial MonitorNun wollen wir gängige Sensoren an Ihren Arduino Nano anschließen und verwenden.
Funktionsweise: Erkennt Bewegungen oder Objekte mithilfe von Infrarotlicht
Bezugsquellen:
Technische Daten:
Beschreibung des Schaltplans:
┌─────────────────┐
│ IR-Sensor │
│ (PIR) │
├─────────────────┤
│ Vcc Out GND │
└─────────────────┘
│ │ │
│ │ └──→ GND (Nano)
│ │
│ └──→ Pin 2 (Nano)
│
└──→ 5V (Nano)
Code-Beispiel:
const int PIR_PIN = 2; void setup() { pinMode(PIR_PIN, INPUT); Serial.begin(9600); } void loop() { int motionDetected = digitalRead(PIR_PIN); if (motionDetected == HIGH) { Serial.println("Bewegung erkannt!"); digitalWrite(13, HIGH); // LED einschalten } else { Serial.println("Keine Bewegung"); digitalWrite(13, LOW); // LED ausschalten } delay(100); }
Tipps:
Funktionsweise: Misst den Abstand zu Objekten mithilfe von Schallwellen
Bezugsquellen:
Technische Daten:
Beschreibung des Schaltplans (HC-SR04-kompatibler Modus):
Der DFRobot URM13-Sensor unterstützt den HC-SR04-kompatiblen TRIG/ECHO-Modus, sodass Sie die gleiche Verkabelung verwenden können:
┌──────────────────┐
│ Ultraschall │
│ URM13/HC-SR04 │
├──────────────────┤
│ Vcc Trig Ech Gnd│
└──────────────────┘
│ │ │ │
│ │ │ └──→ GND (Nano)
│ │ │
│ │ └──→ Pin 3 (Nano) – ECHO
│ │
│ └──→ Pin 4 (Nano) – TRIG
│
└──→ 5V (Nano)
Hinweis: Der URM13 unterstützt für fortgeschrittenere Anwendungen auch I2C- und UART-Schnittstellen, aber der TRIG/ECHO-Modus funktioniert mit demselben Code wie beim HC-SR04.
Code-Beispiel:
const int TRIG_PIN = 4; const int ECHO_PIN = 3; void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); Serial.begin(9600); } void loop() { // 10-Mikrosekunden-Impuls zum Auslösen senden digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // Messung der Echozeit long duration = pulseIn(ECHO_PIN, HIGH); // Berechnung der Entfernung // Schallgeschwindigkeit: 343 m/s = 0,0343 cm/Mikrosekunde // Entfernung = (Dauer * 0,0343) / 2 (durch 2 teilen für Hin- und Rückweg) int distance = duration * 0,034 / 2; Serial.print("Entfernung: "); Serial.print(distance); Serial.println(" cm"); delay(100); }
Tipps:
Funktionsweise: Strahlt Licht aus, wenn Strom durch sie fließt
Bezugsquellen:
Technische Daten:
Farbspezifikationen:
Beschreibung des Schaltplans:
Plus (langes Bein)
│
├─────[LED]─────[220-Ω-Widerstand]─────┐
│ │
Pin 13 GND
Code-Beispiel:
const int RED_LED = 5; const int GREEN_LED = 6; const int BLUE_LED = 9; void setup() { pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); pinMode(BLUE_LED, OUTPUT); } void loop() { // Rot blinken digitalWrite(RED_LED, HIGH); delay(500); digitalWrite(RED_LED, LOW); // Grün blinken digitalWrite(GREEN_LED, HIGH); delay(500); digitalWrite(GREEN_LED, LOW); // Blau mit PWM dimmen for (int brightness = 0; brightness <= 255; brightness += 5) { analogWrite(BLUE_LED, brightness); delay(50); } }
Tipps:
digitalWrite für vollständiges Ein-/Ausschalten, analogWrite für die HelligkeitFunktionsweise: Dreht sich in präzisen Schritten, hervorragend für die Positionierung geeignet
Bezugsquellen:
Technische Daten:
Beschreibung des Schaltplans:
Das DFRobot 28BYJ-48-Modul verfügt über einen integrierten A4988-Treiber mit einer vereinfachten 4-poligen Schnittstelle:
┌─────────────────────┐
│ 28BYJ-48-Modul │
│ (Motor + Treiber) │
├─────────────────────┤
│ STEP DIR 5V GND │
└─────────────────────┘
│ │ │ │
│ │ │ └──→ GND (Nano)
│ │ │
│ │ └──→ 5V (Nano)
│ │
│ └──→ Pin 11 (Nano) – Richtung
│
└──→ Pin 10 (Nano) – Schritt
Hinweis: Bei herkömmlichen ULN2003-Treiberkonfigurationen (ohne integrierten Treiber) verwenden Sie die Pins 10–13, wie im folgenden Code-Beispiel gezeigt.
Code-Beispiel (für DFRobot-Modul mit STEP/DIR-Schnittstelle):
const int STEP_PIN = 10; const int DIR_PIN = 11; void setup() { pinMode(STEP_PIN, OUTPUT); pinMode(DIR_PIN, OUTPUT); Serial.begin(9600); } void loop() { // Richtung festlegen (HIGH = im Uhrzeigersinn, LOW = gegen den Uhrzeigersinn) digitalWrite(DIR_PIN, HIGH); // Eine volle Umdrehung drehen (4096 Schritte bei einem Übersetzungsverhältnis von 1:64) for (int i = 0; i < 4096; i++) { digitalWrite(STEP_PIN, HIGH); delayMicroseconds(500); // Geschwindigkeit anpassen digitalWrite(STEP_PIN, LOW); delayMicroseconds(500); } delay(1000); // Richtung umkehren digitalWrite(DIR_PIN, LOW); for (int i = 0; i < 4096; i++) { digitalWrite(STEP_PIN, HIGH); delayMicroseconds(500); digitalWrite(STEP_PIN, LOW); delayMicroseconds(500); } delay(1000); }
Code-Beispiel (für herkömmlichen ULN2003-Treiber – manuelle Steuerung):
const int IN1 = 10; const int IN2 = 11; const int IN3 = 12; const int IN4 = 13; void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } // Schrittfolge für den Motor void step(int stepNum) { switch(stepNum) { case 0: digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); break; case 1: digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); break; case 2: digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); break; case 3: digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); break; case 4: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); break; case 5: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); break; case 6: digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); break; case 7: digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); break; } } void loop() { // 2048 Schritte drehen (eine volle Umdrehung) for (int i = 0; i < 2048; i++) { step(i % 8); delay(2); // Verzögerung zwischen den Schritten } delay(1000); }
Besserer Ansatz: Verwende die Stepper.h-Bibliothek
#include <stepper.h>const int STEPS_PER_REVOLUTION = 2048; Stepper stepper(STEPS_PER_REVOLUTION, 10, 11, 12, 13); void setup() { stepper.setSpeed(10); // Drehzahl in U/min } void loop() { // Im Uhrzeigersinn drehen stepper.step(STEPS_PER_REVOLUTION); delay(1000); // Drehung gegen den Uhrzeigersinn stepper.step(-STEPS_PER_REVOLUTION); delay(1000); }
Tipps:
Funktionsweise: Misst Temperatur und Luftfeuchtigkeit
Bezugsquellen:
Technische Daten:
Beschreibung des Schaltplans:
┌─────────────┐
│ DHT22 │
├─────────────┤
│ 1 2 4 │
│ +5V Daten GND│
└─────────────┘
│ │ │
│ │ └──→ GND
│ │
│ └──→ Pin 2 (mit 10kΩ Pull-up-Widerstand zu +5V)
│
└──→ +5V
Code-Beispiel:
#include <dht.h>#define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); } void loop() { delay(2000); // Der Sensor benötigt 2 Sekunden zwischen den Messungen float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); if (isnan(humidity) || isnan(temperature)) { Serial.println("Fehler beim Auslesen des Sensors!"); return; } Serial.print("Temperatur: "); Serial.print(temperature); Serial.println(" °C"); Serial.print("Luftfeuchtigkeit: "); Serial.print(humidity); Serial.println(" %"); }
Installation der DHT-Bibliothek:
Sketch → Include Library → Manage LibrariesTipps:
Benötigte Komponenten:
Verdrahtung:
Vollständiger Code:
#include<arduino.h> const int PIR_SENSOR = 2; const int BUZZER = 5; const int LED = 13; const int DEBOUNCE_DELAY = 100; unsigned long lastMotionTime = 0; boolean alarmActive = false; void setup() { pinMode(PIR_SENSOR, INPUT); pinMode(BUZZER, OUTPUT); pinMode(LED, OUTPUT); Serial.begin(9600); Serial.println("Bewegungsalarmsystem initialisiert"); Serial.println("PIR-Sensor wird aufgewärmt..."); delay(30000); // 30 Sekunden für die Sensorkalibrierung Serial.println("System bereit!"); } void loop() { int motionDetected = digitalRead(PIR_SENSOR); if (motionDetected == HIGH) { unsigned long currentTime = millis(); // Entprellen: ignorieren, wenn seit der letzten Bewegung weniger als 100 ms vergangen sind if (currentTime - lastMotionTime > DEBOUNCE_DELAY) {</arduino.h></dht.h></stepper.h> if (!alarmActive) { triggerAlarm(); alarmActive = true; } lastMotionTime = currentTime; } } else { if (alarmActive) { stopAlarm(); alarmActive = false; } } delay(50); } void triggerAlarm() { Serial.println("BEWEGUNG ERKANNT – ALARM AUSGELÖST!"); // Alarmmuster: Piepton und Blinken for (int i = 0; i < 5; i++) { digitalWrite(BUZZER, HIGH); digitalWrite(LED, HIGH); delay(200); digitalWrite(BUZZER, LOW); digitalWrite(LED, LOW); delay(200); } } void stopAlarm() { digitalWrite(BUZZER, LOW); digitalWrite(LED, LOW); Serial.println("Bewegung gestoppt – Alarm deaktiviert"); }
Benötigte Komponenten:
Verdrahtung für das LCD-I2C-Modul:
Vollständiger Code:
#include <wire.h>#include <liquidcrystal_i2c.h>const int TRIG_PIN = 4; const int ECHO_PIN = 3; // LCD-Adresse 0x27 (bei Abweichung anpassen) LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); // LCD initialisieren lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Entfernungsmesser"); lcd.setCursor(0, 1); lcd.print("Bereit"); Serial.begin(9600); delay(2000); lcd.clear(); } void loop() { int distance = measureDistance(); // Anzeige auf dem LCD lcd.setCursor(0, 0); lcd.print("Distance: "); lcd.print(distance); lcd.print(" cm "); // Anzeige auf Serial Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); // Status auf LCD lcd.setCursor(0, 1); if (distance < 10) { lcd.print("NAH! "); } else if (distance < 30) { lcd.print("NAH "); } else { lcd.print("WEIT "); } delay(500); } int measureDistance() { // Triggerimpuls senden digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // Echo-Dauer messen long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30 ms Zeitlimit // Entfernung berechnen // Schallgeschwindigkeit: 343 m/s = 0,0343 cm/Mikrosekunde int distance = duration * 0,034 / 2; return distance; }
Installation der LiquidCrystal-I2C-Bibliothek:
Sketch → Include Library → Manage LibrariesBenötigte Komponenten:
Verdrahtung:
Vollständiger Code:
#include<dht.h> #define DHTPIN 2 #define DHTTYPE DHT22 const int GREEN_LED = 9; const int YELLOW_LED = 10; const int RED_LED = 11; DHT dht(DHTPIN, DHTTYPE); // Temperaturschwellenwerte const float COLD_TEMP = 15.0; const float WARM_TEMP = 25.0; const float HOT_TEMP = 35.0; void setup() { pinMode(GREEN_LED, OUTPUT); pinMode(YELLOW_LED, OUTPUT); pinMode(RED_LED, OUTPUT); Serial.begin(9600); dht.begin(); Serial.println("Temperaturüberwachung gestartet"); } void loop() { delay(2000); float temperature = dht.readTemperature(); float humidity = dht.readHumidity(); // Auf Sensorfehler prüfen if (isnan(temperature) || isnan(humidity)) { Serial.println("Sensorauslesung fehlgeschlagen!"); return; } // An Serial ausgeben Serial.print("Temp: "); Serial.print(temperature); Serial.print("°C, Luftfeuchtigkeit: "); Serial.print(humidity); Serial.println("%"); // Entsprechende LED einschalten updateLEDs(temperature); } void updateLEDs(float temp) { // Zuerst alle ausschalten digitalWrite(GREEN_LED, LOW); digitalWrite(YELLOW_LED, LOW); digitalWrite(RED_LED, LOW); // Bestimme, welche LED eingeschaltet werden soll if (temp < COLD_TEMP) { // Kalt – Blau wäre schön, aber wir verwenden GRÜN digitalWrite(GREEN_LED, HIGH); Serial.println("Status: KALT"); } else if (temp < WARM_TEMP) { // Angenehm digitalWrite(GREEN_LED, HIGH); Serial.println("Status: ANGENEHM"); } else if (temp < HOT_TEMP) { // Warm – Warnung digitalWrite(YELLOW_LED, HIGH); Serial.println("Status: WARM"); } else { // Heiß – Alarm digitalWrite(RED_LED, HIGH);</dht.h></liquidcrystal_i2c.h></wire.h> Serial.println("Status: HEISS-ALARM!"); } }
Benötigte Komponenten:
Vollständiger Code (mit serieller Datenerfassung):
#include<dht.h> #define DHTPIN 2 #define DHTTYPE DHT22 const int TRIG_PIN = 4; const int ECHO_PIN = 3; DHT dht(DHTPIN, DHTTYPE); struct SensorData { float temperature; float humidity; int distance; unsigned long timestamp; }; SensorData currentReading; void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); Serial.begin(9600); dht.begin(); Serial.println("=== Arduino Nano Multi-Sensor-Logger ==="); Serial.println("Zeit(ms),Temperatur(°C),Luftfeuchtigkeit(%),Entfernung(cm)"); } void loop() { // Alle Sensoren auslesen currentReading.timestamp = millis(); currentReading.temperature = dht.readTemperature(); currentReading.humidity = dht.readHumidity(); currentReading.distance = measureDistance(); // Daten protokollieren logData(currentReading); delay(5000); // Alle 5 Sekunden auslesen } int measureDistance() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); long duration = pulseIn(ECHO_PIN, HIGH, 30000); int distance = duration * 0.034 / 2; return distance; } void logData(SensorData data) { // Im CSV-Format ausgeben für einfachen Import in eine Tabellenkalkulation Serial.print(data.timestamp); Serial.print(","); Serial.print(data.temperature); Serial.print(","); Serial.print(data.humidity); Serial.print(","); Serial.println(data.distance); }
So verwenden Sie die protokollierten Daten:
.csvProblem 1: „Unbekannter serieller Anschluss“
Problem 2: „Sketch konnte nicht hochgeladen werden“
Problem 3: Sensor reagiert nicht
Problem 4: LED leuchtet nicht
pinMode() auf OUTPUT gesetzt istProblem 5: Motor dreht sich nicht
stepper.setSpeed(5)1. Verwenden Sie Konstanten statt magischer Zahlen
// SCHLECHT pinMode(13, OUTPUT); digitalWrite(13, HIGH); // GUT const int LED_PIN = 13; pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH);
2. Fügen Sie Kommentare hinzu, um die Logik zu erklären
// Prüfen, ob die Temperatur den Schwellenwert überschreitet if (temperature > MAX_TEMP) { // Lüfter einschalten digitalWrite(FAN_PIN, HIGH); }
3. Verwenden Sie Funktionen für sich wiederholenden Code
// Anstatt dieses Muster mehrfach zu wiederholen: void blinkPattern(int pin, int times) { for (int i = 0; i < times; i++) { digitalWrite(pin, HIGH); delay(200); digitalWrite(pin, LOW); delay(200); } }
4. Verwalten Sie Ihre Pins
// Definieren Sie alle Pins am Anfang const int LED_PIN = 13; const int SENSOR_PIN = 2; const int BUTTON_PIN = 4; const int MOTOR_PIN = 5;
5. Serielle Schnittstelle zum Debuggen verwenden
void loop() { int sensorValue = analogRead(A0); Serial.print("Rohwert: "); Serial.println(sensorValue);</dht.h> if (sensorValue > 500) { Serial.println("Schwellenwert überschritten!"); } }
6. Vermeiden Sie lange Verzögerungen in kritischen Schleifen
// SCHLECHT – blockiert alles für 5 Sekunden void loop() { doSomething(); delay(5000); // Nichts anderes läuft! } // BESSER – Verwende millis() für nicht blockierende Zeitmessung unsigned long lastTime = 0; void loop() { unsigned long currentTime = millis(); if (currentTime - lastTime > 5000) { doSomething(); lastTime = currentTime; } }
Tipps zum Speicher:
byte statt intTipps zur Geschwindigkeit:
Serial.print()-Anweisungen in schnellen SchleifenSchließen Sie niemals an:
Verwenden Sie immer:
Schützen Sie Ihren USB-Anschluss:
Kurzschlüsse vermeiden:
Sie verfügen nun über ein umfassendes Verständnis des Arduino Nano, von der Grundeinrichtung bis hin zu fortgeschrittenen Projekten. Beginnen Sie mit einfachen LED-Blinkern, gehen Sie dann zur Sensorintegration über und widmen Sie sich nach und nach komplexeren Projekten.
Denken Sie daran:
Der Arduino Nano eröffnet eine Welt voller kreativer Möglichkeiten. Viel Spaß beim Bauen!
pinMode(pin, OUTPUT/INPUT) // Pin-Modus konfigurieren digitalWrite(pin, HIGH/LOW) // Digitaler Ausgang digitalRead(pin) // Digitaler Eingang analogRead(pin) // Analoger Eingang (0-1023) analogWrite(pin, value) // PWM-Ausgang (0–255) delay(milliseconds) // Ausführung unterbrechen delayMicroseconds(microseconds) // Pause (kurze Verzögerung) millis() // Millisekunden seit Start Serial.begin(9600) // Serielle Kommunikation mit Baudrate starten Serial.println(Wert) // Mit Zeilenumbruch ausgeben Serial.print(Wert) // Ohne Zeilenumbruch ausgeben pulseIn(Pin, HIGH/LOW) // Impulsbreite messen
Digitale Ein-/Ausgänge: 0–13 (0,1 = seriell, 13 = integrierte LED)
PWM-Pins: 3, 5, 6, 9, 10, 11
Analoge Eingänge: A0–A7
Stromversorgung: 5 V, 3,3 V, GND (×3)
Spezial: AREF, RST, ICSP
PIR-Bewegungssensor: Pin 2 (digital)
Ultraschall-Echo: Pin 3 (digital)
DHT-Temperatur: Pin 2 (digital)
Summer/Lautsprecher: Pin 5 (PWM)
Schrittmotor (4 Pins): Pins 10–13
LED (PWM für Helligkeit): Pins 3, 5, 6, 9, 10, 11
Taste: Beliebiger digitaler Pin
Analoger Sensor: A0–A7
Dokumentversion: 1.0
Letzte Aktualisierung: Dezember 2025
Zielgruppe: Absolute Anfänger bis fortgeschrittene Maker
Gesamtumfang: Umfassender Leitfaden mit Code-Beispielen und Links zu Komponenten
Viel Spaß beim Programmieren und beim Bau toller Projekte!