Der Arduino Nano R4 ist ein Mikrocontroller-Board im Nano-Format. Es besteht aus dem eigentlichen Mikrocontroller, digitalen Ein- und Ausgängen und analogen Eingängen.
Board installieren

- Icon für den Boardverwalter anklicken oder Werkzeuge-> Board -> Boardverwalter
- nach dem UNO R4 Board suchen
- Board installieren
Board auswählen

Wenn der Arduino Nano R4 nicht automatisch erkannt wurde, klicke auf „Wähle ein anderes Board und einen anderen Port“ und suche nach Nano R4. Je nach Betriebssystem wird der USB-Port eine andere Bezeichnung haben.
Hardware
RGB-LED
Die auf dem Board verbaute RGB-LED wird mit festen Bezeichnungen angesprochen:
- LEDR -> rote LED
- LEDG -> grüne LED
- LEDB -> blaue LED
HIGH schaltet die LED aus, LOW schaltet sie ein.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
void setup() { pinMode(LEDR, OUTPUT); pinMode(LEDG, OUTPUT); pinMode(LEDB, OUTPUT); // alle LEDs ausschalten digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); } void loop() { // rot ein, alle anderen aus digitalWrite(LEDR, LOW); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); delay(1000); // grün ein, alle anderen aus digitalWrite(LEDR, HIGH); digitalWrite(LEDG, LOW); digitalWrite(LEDB, HIGH); delay(1000); // blau ein, alle anderen aus digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, LOW); delay(1000); // alle aus digitalWrite(LEDR, HIGH); digitalWrite(LEDG, HIGH); digitalWrite(LEDB, HIGH); delay(1000); } |
LED
Die eingebaute orangene LED hat die Bezeichnung LED_BUILTIN, HIGH schaltet sie ein, LOW schaltet sie aus.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); } |
Pinbelegung
digitale Pins

Die digitalen Ein-/Ausgänge liefern im Normalfall ein HIGH (1) oder LOW (0). Eine Ausnahme bilden die mit einem ~ gekennzeichneten Pins. Sie können mit der ⇒Pulsweitenmodulation angesprochen werden.
An diese Ein- und Ausgänge können zum Beispiel LEDs, Lautsprecher, Displays, Motoren oder Sensoren angeschlossen werden. Der Mikrocontroller kann alle diese Bauteile steuern, Signale auslesen und aufgrund der gelesenen Daten verschiedene Aktionen auslösen.
analoge Pins

Die analogen Eingänge messen die anliegende Spannung. Diese Spannung wird vom Analog-Digital-Wandler (ADC = Analog Digital Converter) in digitale Werte umgewandelt.
- 9 Bit: 0 – 511
- 10 Bit: 0 – 1023
- 11 Bit: 0 – 2047
- 12 Bit: 0 – 4096
- 14 Bit: 0 – 16383
Die Standardauflösung ist 10 Bit.


|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
int REGLER = A0; int ReglerWert = 0; void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial); // Auflösung 14-bit (0 - 16383) analogReadResolution(14); } void loop() { ReglerWert = analogRead(REGLER); Serial.println(ReglerWert); delay(200); } |
I²C

⇒Info

A4 -> SDA
A5 -> SCL

Zufallszahlen darstellen

Das dazugehörige Programm:

|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include "LCDIC2.h" // 4-zeiliges LCD LCDIC2 lcd(0x27, 20, 4); // 2-zeiliges LCD // LCDIC2 lcd(0x3f, 16, 2); void setup() { // Zufallsgenerator starten randomSeed(analogRead(A0)); // LCD starten lcd.begin(); // Cursor "verstecken" lcd.setCursor(false); // Ausgabe auf dem LCD // Cursor auf Position 0 in Zeile 0 setzen lcd.setCursor(0, 0); lcd.print("Zufallszahlen:"); lcd.setCursor(0, 1); for (int i = 1; i <= 6; i++) { int Zahl = random(1, 7); lcd.print(String(Zahl)); lcd.print(" "); } } void loop() { // bleibt leer, Programm läuft nur einmal } |
QWIIC
Neben der I²C-Schnittstelle mit A4/A5 ist auf dem Board auch eine QWIIC-Schnittstelle verbaut.



Beispiel: Datum und Uhrzeit mit dem RTC-Modul PCF8523

|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include "RTClib.h" // Name des RTC-Moduls RTC_PCF8523 rtc; void setup() { // RTC starten Wire1 -> QWIIC if (!rtc.begin(&Wire1)) { Serial.println("RTC konnte nicht gestartet werden!"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("RTC verbunden!"); // Zeitpunkt der Kompilierung String Zeitpunkt = (F(__DATE__), F(__TIME__)); Serial.println("Zeitpunkt des Kompilierens: " + Zeitpunkt); // Zeit aus dem Zeitpunkt des Kompilierens setzen rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); rtc.start(); } void loop() { // aktuelle Zeit holen DateTime aktuell = rtc.now(); char Datum[] = " DD.MM.YYYY "; // Datum in String umwandeln und anzeigen Serial.print(aktuell.toString(Datum)); // Zeit anzeigen // Format der Uhrzeit festlegen char Zeit[] = "Uhrzeit: hh:mm:ss"; // Datum in String umwandeln und anzeigen Serial.println(aktuell.toString(Zeit)); delay(1000); } |
Module mit QWIIC und Standard-I²C mischen
Beispiel Zeit mit RTC PCF8253 (QWIIC) und LCD (Standard-I²C) anzeigen
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#include "RTClib.h" #include "Wire.h" #include "LCDIC2.h" // 4-zeiliges LCD LCDIC2 lcd(0x27, 20, 4); // Name des RTC-Moduls (rtc) RTC_PCF8523 rtc; char daysOfTheWeek[7][12] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"}; void setup() { Serial.begin(9600); delay(1000); // LCD starten lcd.begin(); // Cursor "verstecken" lcd.setCursor(false); // RTC-Modul starten if (!rtc.begin(&Wire1)) { Serial.println("RTC nicht verbunden"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("RTC verbunden!"); rtc.start(); /* wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen Jahr, Monat, Tag, Stunde, Minute, Sekunde Beispiel: 2024 Mai 5. 10 Uhr 30 Minuten 30 Sekunden rtc.adjust(DateTime(2024, 5, 5, 10, 30, 30)); alternativ: rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); */ rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); } void loop() { // rtc.now() -> aktuelle Zeit holen DateTime aktuell = rtc.now(); /* Datumsformat festlegen DD -> Tag mit führender 0 MM -> Monat mit führender 0 YYYY -> vollständige Angabe des Jahres */ char Datum[] = "DD.MM.YYYY "; // Datum in Zeichenkette (String) umwandeln und anzeigen // Serial.print(aktuell.toString(Datum)); lcd.setCursor(0, 0); lcd.print(daysOfTheWeek[aktuell.dayOfTheWeek()]); lcd.setCursor(0, 1); lcd.print(aktuell.toString(Datum)); // Format der Zeitangabe festlegen char Zeit[] = "hh:mm:ss"; // Zeitangabe in Zeichenkette (String) umwandeln und anzeigen Serial.print("Uhrzeit: "); Serial.println(aktuell.toString(Zeit)); lcd.setCursor(0, 2); lcd.print(aktuell.toString(Zeit)); // 1 Sekunde Pause delay(1000); } |
SPI

⇒Info

D13 -> CLK
D12 -> CIPO
D11 -> COPI
D10 -> CS
RTC
Serieller Monitor

|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
#include "RTC.h" void setup() { Serial.begin(9600); RTC.begin(); // aktuelles Datum/Zeit setzen // MESZ: SAVING_TIME_ACTIVE // MEZ: SAVING_TIME_INACTIVE RTCTime Zeit(22, Month::FEBRUARY, 2026, 12, 37, 30, DayOfWeek::SUNDAY, SaveLight::SAVING_TIME_INACTIVE); RTC.setTime(Zeit); } void loop() { RTCTime aktuelleZeit; // aktuelle Zeit holen RTC.getTime(aktuelleZeit); // Wochentag als Objekt von DayOfWeek erzeugen DayOfWeek Wochentag = aktuelleZeit.getDayOfWeek(); switch (Wochentag) { case DayOfWeek::SUNDAY: Serial.print("Sonntag "); break; case DayOfWeek::MONDAY: Serial.print("Montag "); break; case DayOfWeek::TUESDAY: Serial.print("Dienstag "); break; case DayOfWeek::WEDNESDAY: Serial.print("Mittwoch "); break; case DayOfWeek::THURSDAY: Serial.print("Donnerstag "); break; case DayOfWeek::FRIDAY: Serial.print("Freitag "); break; case DayOfWeek::SATURDAY: Serial.print("Samstag "); break; } // wenn Tag < 10 führende 0 ergänzen if (aktuelleZeit.getDayOfMonth() < 10) Serial.print("0"); Serial.print(aktuelleZeit.getDayOfMonth()); Serial.print("."); switch (Month2int(aktuelleZeit.getMonth())) { case 1: Serial.print("Januar"); break; case 2: Serial.print("Februar"); break; case 3: Serial.print("M\341rz"); break; case 4: Serial.print("April"); break; case 5: Serial.print("Mai"); break; case 6: Serial.print("Juni"); break; case 7: Serial.print("Juli"); break; case 8: Serial.print("August"); break; case 9: Serial.print("September"); break; case 10: Serial.print("Oktober"); break; case 11: Serial.print("November"); break; case 12: Serial.print("Dezember"); break; } Serial.print(" "); Serial.print(String(aktuelleZeit.getYear())); Serial.print(" "); // Uhrzeit Serial.print("Uhrzeit: "); // wenn Stunde < 10 führende 0 ergänzen if (aktuelleZeit.getHour() < 10) Serial.print("0"); Serial.print(aktuelleZeit.getHour()); Serial.print(":"); // wenn Minuten < 10 führende 0 ergänzen if (aktuelleZeit.getMinutes() < 10) Serial.print("0"); Serial.print(aktuelleZeit.getMinutes()); Serial.print(":"); // wenn Sekunden < 10 führende 0 ergänzen if (aktuelleZeit.getSeconds() < 10) Serial.print("0"); Serial.println(aktuelleZeit.getSeconds()); delay(1000); } |
Quellen
- Arduino Nano R4 User Manual
- Espresif WiFi APIArduino Nano R4 Hardware
- QWIIC-Steckverbindungen
Letzte Aktualisierung: