liest den Wert eines analogen Pins
int SENSOR = A0; int SensorWert; void setup() { // bei analogWrite ist kein setup notwendig } void loop() { SensorWert = analogRead(SENSOR); }
bringt eine LED mit der Pulsweitenmodulation an einem digitalen Pin mit unterschiedlicher Helligkeit zum Leuchten
int LED = 7; void setup() { // bei analogWrite ist kein setup notwendig } void loop() { for (int i = 0; i < 255; i += 5) { analogWrite(LED, i); delay(200); } }
Ein Sensor wird einem Interrupt zugeordnet.
attachInterrupt(digitalPinToInterrupt(TASTER), LEDSchalten, CHANGE);
Bei Betätigung des Sensors wird der Interrupt ausgelöst.
Der normale Programmablauf wird unterbrochen und die festgelegte Funktion (Interrupt-Service-Routine) wird ausgeführt.
Anschließend wird das Programm normal fortgesetzt.
Mit Hilfe von Arrays können Daten eines einheitlichen Typs (int, bool oder Strings) im Speicher abgelegt und jederzeit wieder hervor geholt werden. Mit den eckigen Klammern wird die Anzahl der Elemente festgelegt.
Eindimensionale Arrays
int LED[5] = {3, 4, 5, 6, 7}; bool Status[5] = {1, 0, 1, 0, 1}; String Bauteile[5] = {"Taster", "Potentiometer", "Fernbedienung", "Sensor", "LED"}; char Buchstaben[] = {"aeiou"};
Zweidimensionale Arrays
Im Unterschied zu eindimensionalen Arrays, die eine bestimmte Anzahl von Elemente in einer Reihe haben, können zweidimensionale Arrays zwei Dimensionen haben.Sie sind in Reihen und Spalten organisiert:
// 4 Reihen, 4 Spalten int Zahlen[4] [4] = { {1, 2, 3, 4}, {11, 12, 13, 14}, {21, 22, 23, 24}, {31, 32, 33, 34} }; void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} /* Elemente des Arrays anzeigen i -> Zeilen, j -> Spalten for-Schleife durch die Reihen */ for ( int i = 0; i < 4; i++ ) { Serial.print("Zeile " + String(i) + ": "); // for-Schleife durch die Spalten for (int j = 0; j < 4; j++) { Serial.print(String(Zahlen[i] [j]) + " "); } Serial.println(); } } void loop() { // bleibt leer, das Programm läuft nur einmal }
const definiert eine Variable als Konstante, die im Laufe des Programms nicht verändert werden kann.
const int LED = 7; const float Temperatur = 22.5;
Der Versuch, eine mit define deklarierte Variable zu verändern, führt zu einer Fehlermeldung.
define definiert eine Variable als Konstante, die im Laufe des Programms nicht verändert werden kann.
# define LED 7 # define Temperatur 22.5
Der Versuch, eine mit define deklarierte Variable zu verändern, führt zu einer Fehlermeldung.
hält das Programm für die angegebene Zeit in Millisekunden an
int LED = 7; void setup() { pinMode(GELB, OUTPUT); } void loop() { digitalWrite(GELB, HIGH); delay(1000); digitalWrite(GELB, LOW); delay(1000); }
liest den Wert eines digitalen Pins (HIGH/LOW)
int LED = 7; int TASTER = 8; int TasterStatus; void setup() { pinMode(LED, OUTPUT); pinMode(TASTER, INPUT_PULLUP); } void loop() { TasterStatus = digitalRead(TASTER); if (TasterStatus == LOW) digitalWrite(LED, HIGH); }
schreibt den Wert eines digitalen Pins (HIGH/LOW)
int LED = 7; void setup() { pinMode(LED, OUTPUT); } void loop() { digitalWrite(LED, HIGH); }
Das F-Makro spart Speicherplatz:
Das F-Makro sorgt dafür, dass der Text nicht im SRAM verbleibt, er wird vielmehr im deutlich größeren ➨Flash abgelegt und stellt so Speicherplatz für Variablen im SRAM zur Verfügung.
Beispiele:
Serial.println(F("Initialisierung abgeschlossen")); Serial.println(F("-----------------------------------"));
Sie hat die Form:
Von (Startwert = Wert; Startwert kleiner oder gleich Endwert; Schrittweite)
for (int i = 0; i < 10; i ++) { // Anweisung }
Beginne mit dem Startwert 0, führe die Befehle solange aus, bis der Wert 10 erreicht ist.
Die Schrittweite beträgt 1.
In diese Schleife werden nun die Anweisungen gepackt, die solange ausgeführt werden, bis i den Wert 10 erreicht hat.
void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} } void loop() { for (int i = 0; i < 10; i ++) { Serial.println(i); } }
➨for
trifft je nach der vorliegenden Bedingung eine Entscheidung, wie das Programm weitergehen soll.
// wenn die Bedingung erfüllt ist ... if (Bedingung == Zustand) { // Befehl ausführen } // sonst else { // alternativen Befehl ausführen }
int LED = 7; int TASTER = 13; void setup() { pinMode(LED, OUTPUT); pinMode(TASTER, INPUT_PULLUP); } void loop() { int TasterLesen = digitalRead(TASTER); if (TasterLesen == LOW) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } }
stellt die Position eines Zeichens innerhalb eines Strings fest
void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} String BeispielString = "Programmieren finde ich toll ;-)"; // das t suchen int Suche = BeispielString.indexOf("t"); Serial.print("Position t in " + BeispielString + ": "); Serial.println(Suche); } void loop() { // bleibt leer, Programm läuft nur einmal }
bestimmt die Anzahl der Zeichen eines Strings
void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} String BeispielString = "Programmieren finde ich toll ;-)"; // Länge bestimmen int Laenge = BeispielString.length(); Serial.print("Lu00e4nge des Strings " + BeispielString + ": "); Serial.println(String(Laenge) + " Zeichen."); } void loop() { // bleibt leer, Programm läuft nur einmal }
überträgt einen Wertebereich auf einen anderen.
Übertragung eines analogen Sensorwertes, der zwischen 0 und 1023 liegen kann, auf die durch analogWrite() möglichen Werte:
int SensorWert = analogRead(SENSOR); /* map -> Umwandlung des gelesenen Wertes von 0 bis 1023 (analoger Sensorwert) auf 0 bis 255 */ int Helligkeit = map(SensorWert, 0, 1023, 0, 255); analogWrite(LED, Helligkeit);
➨map
startet den Zeitnehmer, die Zeit wird in Millisekunden gemessen.
Allerdings kann millis() nicht die aktuelle Zeit bestimmen.
int TASTER = 7; int TasterLesen; float StartZeit; float VerstricheneZeit; float Sekunden; void setup() { pinMode(TASTER, INPUT_PULLUP); Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} StartZeit = millis(); } void loop() { TasterLesen = digitalRead(TASTER); if (TasterLesen == LOW) { delay(200); // Zeit berechnen float Sekunden; VerstricheneZeit = millis() - StartZeit; // 1000 ms = 1 s Sekunden = VerstricheneZeit / 1000; // Sekunden in String umwandeln String AnzahlSekunden = String(Sekunden); // . durch , ersetzen AnzahlSekunden.replace(".", ","); // Ausgabe im Seriellen Monitor Serial.println(AnzahlSekunden + " Sekunden"); } }
ermittelt den Restwert einer Division
int Zahl = 144; void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} Serial.println("Die Teiler von " + String(Zahl)); // nur bis zur Hälfte der Zahl prüfen for ( int i = 2 ; i <= Zahl / 2 ; i++) { // wenn kein Rest → Zahl ist teilbar → aktuellen Divisor anzeigen if (Zahl % i == 0) { Serial.println(i); } } } void loop() { // bleibt leer, Programm läuft nur einmal }
setzt das Verhalten eines Pins
- OUTPUT Pin wird als Ausgabe definiert z.B eine LED
- INPUT Pin ist ein Eingang (z. B. Ein Taster)
- INPUT_PULLUP am Eingangs-Pin wird ein 50kΩ Widerstand aktiviert der Eingang hat dann im nicht gedrückten Zustand die Eigenschaft TRUE (bzw. HIGH) und im betätigten Fall FALSE (bzw. LOW)
int LED =7; int TASTER = 8; void setup() { pinMode(LED, OUTPUT); pinMode(TASTER, INPUT_PULLUP); }
erzeugt Zufallszahlen
void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} // Zufallsgenerator starten randomSeed(analogRead(0)); } void loop() { int Minimum = 1; int Maximum = 7; int Zahl = random(Minimum, Maximum); Serial.print("ZufallszZahl: "); Serial.println(Zahl); delay(1000); }
wartet auf die Eingabe im Seriellen Monitor.
while(Serial.available() > 0) { // solange lesen, bis return (n = return) eingegeben wurde String Eingabe = Serial.readStringUntil("n"); // das letzte Zeichen ist return = n → soll entfernt werden (-1) Eingabe = Eingabe.substring(0, Eingabe.length() - 1); . . . }
schreibt Zahlen oder Text in den Seriellen Monitor.
void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} // ohne Zeilenumbruch Serial.print("Programmieren macht Spaß!"); int Zahl = 87; Serial.println(Zahl); String Text = "Die Zahlen liegen zwischen 81 und 100!"; // mit Zeilenumbruch Serial.println(Text); } void loop() { // kein setup notwendig, das Programm läuft nur einmal }
liest ein einzelnes Zeichen im Seriellen Monitor
while (Serial.available() > 0) { // Eingabe im Seriellen Monitor lesen char Zahl = Serial.read(); Eingabe += Zahl; // Enter/Senden n gedrückt if (Zahl == 'n') { . . . } }
liest solange im Seriellen Monitor, bis das Zeichen in den Klammern erkannt wird
while (Serial.available() > 0) { // solange lesen, bis return char(13) = return) eingegeben wurde String Eingabe = Serial.readStringUntil(char(13)); // das letzte Zeichen ist return = n → soll entfernt werden (-1) Eingabe = Eingabe.substring(0, Eingabe.length() - 1); . . . }
stellt die Länge einer Variablen (den benötigten Speicherplatz) in Bytes fest.
byte Zahl = 7; int Ergebnis = 10; float Summe = 5.5; void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} // 1 Byte Serial.println(sizeof(Zahl)); // 2 Byte Serial.println(sizeof(Ergebnis)); // 4 Bytes Serial.println(sizeof(Summe)); } void loop() { // bleibt leer, Programm läuft nur einmal }
zeigt den Teilstring von Start bis Ende.
void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} String BeispielString = "Programmieren finde ich toll ;-)"; // Länge bestimmen int Laenge = BeispielString.length(); Serial.print("Lu00e4nge des Strings: "); Serial.println(Laenge); // das t suchen int Suche = BeispielString.indexOf("t"); Serial.print("Position t: "); Serial.println(Suche); // String vom Anfang bis zum t BeispielString.substring(0, Suche); Serial.print("String bis zum t: "); Serial.println(BeispielString.substring(0, Suche)); // oder, weil Laenge schon bestimmt wurde: // BeispielString.substring(suche + 1, Laenge); Serial.print("String vom t bis zum Ende: "); Serial.println(BeispielString.substring(Suche, BeispielString.length())); } void loop() { // bleibt leer, Programm läuft nur einmal }
➨<a class="Kurzreferenz" href="Strings verarbeiten
Genau wie if kann switch case Abfragen durchführen.
void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} // Zufallsgenerator starten randomSeed(analogRead(A0)); } void loop() { int Zahl = random(1, 3) switch (Zahl) { case 1: Serial.print("1"); break; case 2: Serial.print("2"); break; case 3: Serial.print("3"); break; } }
Strukturen (struct) sind eine Sammlung und Beschreibung verschiedener Daten. Sie können beliebige Datentypen verwenden.
struct Stadt { int Platz; String Name; String KFZ_Kennzeichen; float Einwohner; String Vorwahl; int Hoehe; }; Stadt Berlin = { 1, "Berlin", "B", 3.64, "030", 30 }; Stadt Hamburg = { 2, "Hamburg", "HH", 1.84, "040", 6 }; Stadt Muenchen = { 3, "Mu00fcnchen", "M", 1.84, "040", 6 };
tone() schaltet den Lautsprecher ein, noTone() schaltet ihn aus.
int LAUTSPRECHER = 13; void setup() { pinMode(LAUTSPREVHER, OUTPUT); } void loop () { // tone(Ausgabepin, Frequenz, Zeit_in_Millisekunden) tone(LAUTSPRECHER, 1000, 100); // oder Ton ohne Zeitbegrenzung tone(LAUTSPRECHER, 1000); // Lautsprecher ausschalten noTone(LAUTSPRECHER); }
while erfüllt den gleichen Zweck wie die for Schleife.
Allerdings musst du dich selbst um das Hochzählen der Schleifenvariable kümmern.
void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} } void loop() { int i = 0; while (i < 10) { Serial.println(i); i++; } }