Arduino und die Programmiersprache C
Inhalt des 3. Teils des Arduino-Workshops: Arrays und Schleifen (while und for)
Variablen: Typ Array KURZFORM (lang:s.u.) -------------------- const int LEN_a = 3; int a[LEN_a]; // [] deuten auf ein Array hin a[0]=3; a[1]=2; a[2]=1; int a[LEN_a] = { 3, 2, 1 }; // ergibt dasselbe // a[1] ist 2 a[1] = 0; // ergibt für a: { 3, 0, 1 } // a[1] ist 0 Schleifen: while / for KURZFORM (lang:s.u.) ---------------------- int a[LEN_a] = { 3, 2, 1 }; // while-Schleife int i=0; while(i<LEN_a) // Am Ende kein ';' hinschreiben!!! Keine Fehlermeldung! { ...benutze a[i]... i++; // Bem.: i++ ist Kurzform für i+=1 ist Kurzform für i=i+1 } // for-Schleife mit derselben Wirkung // das "int " kann man ins for einfach mit reinschreiben, es geht aber auch vorweg for(int i=0; i<LEN_a; i++) // Am Ende kein ';' hinschreiben!!! Keine Fehlermeldung! { ...benutze a[i]... } Einfacher Lauflicht-Code: ------------------------- const int PIN_LED0 = 13; const int PIN_LED1 = 4; const int PIN_LED2 = 5; const int PIN_POTI = A0; void setup() { pinMode(PIN_LED0, OUTPUT); pinMode(PIN_LED1, OUTPUT); pinMode(PIN_LED2, OUTPUT); // Analog-Pin PIN_POTI muß nicht initialisiert werden. } void loop() { int poti = analogRead(PIN_POTI); digitalWrite(PIN_LED0, 1); delay(poti); digitalWrite(PIN_LED0, 0); digitalWrite(PIN_LED1, 1); delay(poti); digitalWrite(PIN_LED1, 0); digitalWrite(PIN_LED2, 1); delay(poti); digitalWrite(PIN_LED2, 0); } Mit Array und Schleife hingeschrieben ------------------------------------- const int PIN_LEDs = 3; int PIN_LED[PIN_LEDs] = { 13, 4, 5}; const int PIN_POTI = A0; void setup() { for (int i=0; i<PIN_LEDs; i++) pinMode(PIN_LED[i], OUTPUT); // Bei genau einem Befehl kann man die { } weglassen // Analog-Pin PIN_POTI muß nicht initialisiert werden. } void loop() { int poti = analogRead(PIN_POTI); for (int i=0; i<PIN_LEDs; i++) { digitalWrite(PIN_LED[i], 1); delay(poti); digitalWrite(PIN_LED[i], 0); } }
Arrays und Schleifen ausführlicher
Variablen: Typ Array -------------------- const int LEN_a = 3; int a[LEN_a]; // [] deuten auf ein Array hin a[0]=3; a[1]=2; a[2]=1; int a[LEN_a] = { 3, 2, 1 }; // ergibt dasselbe // a[1] ist 2 a[1] = 0; // ergibt für a: { 3, 0, 1 } // a[1] ist 0 char meintext[]= "Bla bla"; // ä,ö,ü,... gehen evtl. nicht // strlen(meintext) ergibt 7 (Länge des Strings) // sizeof(meintext) ergibt 8 (Speicherverbrauch in Byte) char meintext[]= {'B', 'l', 'a', ' ', 'b', 'l', 'a', 0}; // das Gleiche // ^-Ende-Markierung // "ASCII-Tabelle" (Auszug): // ' ' == 32 // '!' == 33 // '0' == 48 // '1' == 49 // 'A' == 65 // 'B' == 66 // 'a' == 97 // 'b' == 98 // Zur Erinnerung: // char konnte -128...127 (oder evtl. 0...255) speichern // unsigned char konnte 0...255 speichern // signed char konnte -128...127 speichern // alle obigen verbrauchen 1 Byte int a[LEN_a] = { 3, 2, 1 }; int *meinzeiger = a; // meinzeiger[i] ist dasselbe wie a[i] a[2] = 0; // meinzeiger[2] ist 0 // Achtung: sizeof(...) (Speicherverbrauch) geht nicht immer wie man erwartet! // sizeof(a) ist der Speicherverbrauch für das Array a, also 3*2Byte // sizeof(meinzeiger) ist der Speicherverbrauch für einen Zeiger Serielle Schnittstelle (UART) ----------------------------- Arduino-Dokus (nicht nur dazu) siehe: http://www.arduino.cc/en/Reference/HomePage http://labs.arduino.org/Arduino+Reference void setup() { Serial.begin(9600); Serial.println("Hallo Welt!"); } void loop() { if (Serial.available()) { char c = Serial.read(); Serial.print("Gesehen: "); Serial.println(c); // "ln" bedeutet Zeilenfortsatz danach char s[]="Gesehen: x"; s[9] = c; // c anstelle des 'x' Serial.println(s); } } // Serial.println(x); ist nicht C, sondern C++ (Indiz: der '.' "im Namen"). // Es gibt x aus, wobei x Ein int, float, char *, ... etc. ein kann Schleifen: while / for ---------------------- const int LEN_a = 3; int a[LEN_a] = { 3, 2, 1 }; // while-Schleife int i=0; while(i<LEN_a) // Am Ende kein ';' hinschreiben!!! Keine Fehlermeldung! { Serial.println(a[i]); i++; // Bem.: i++ ist Kurzform für i+=1 ist Kurzform für i=i+1 } // Gibt aus: 3 2 1 // for-Schleife mit derselben Wirkung // das "int " kann man ins for einfach mit reinschreiben, es geht aber auch vorweg for(int i=0; i<LEN_a; i++) // Am Ende kein ';' hinschreiben!!! Keine Fehlermeldung! { Serial.println(a[i]); } Mit Funktion hingeschrieben: void listeElemente(int *ar, int laenge) // nicht länge schreiben { for(int i=0; i<laenge; i++) { Serial.println(ar[i]); } } listeElemente(a,LEN_a); // man kann auch mehrere Einträge an 1. und 3. Stelle schreiben: int a[LEN_a] = { 3, 2, 1 }; for(int i=0, int j=3; i<laenge; i++, j--) { Serial.print("i="); Serial.print(i); Serial.print(" a[i]="); Serial.print(a[i]); Serial.print(" j="); Serial.println(j); } // gibt aus: i=0 a[i]=3 j=3 i=1 a[i]=2 j=2 i=2 a[i]=1 j=1 // man kann auch mehrere Schleifen ineinander schachteln: for (int j=0; j<3; j++) // zählt j von 0 bis 2 { for (int i=0; i<2; i++) // zählt i von 0 bis 1 { Serial.print(j); Serial.print(" "); Serial.println(i); } } // gibt aus: 0 0 0 1 1 0 1 1 2 0 2 1 2-dimensionale Arrays --------------------- const int PHASEN = 4; const int PIN_LEDs = 3; int PIN_LED[PIN_LEDs] = { 3, 5, 6}; int muster[PHASEN][PIN_LEDs] = { {0,1,0}, {1,0,1}, {0,1,0}, {0,0,0} }; // Zugriff geht dann so: // muster[1][2] ergibt 1 // muster[3][2] ergibt 0 (der jeweils höchste erlaubte Index!)
Aufgabe
const int PHASEN = 4; const int PIN_LEDs = 3; int PIN_LED[PIN_LEDs] = { 3, 5, 6}; int muster[PHASEN][PIN_LEDs] = { {0,1,0}, {1,0,1}, {0,1,0}, {0,0,0} }; // Zugriff geht dann so: // muster[1][2] ergibt 1 // muster[3][2] ergibt 0 (der jeweils höchste erlaubte Index!) void setup() { for (int i=0; i<PIN_LEDs; i++) pinMode(PIN_LED[i], OUTPUT); // Bei genau einem Befehl kann man die { } weglassen } void loop() { int zeit = 500; // Parameter fürs delay(zeit); // bitte ausfüllen... }