Arduino-WS (3)

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...
}