bitte um Codereview und Kommentare

So,

nun will ich Euch mal ein Stück Anfängercode zeigen :slight_smile: Ich bitte Euch mir mal Rückmeldung dazu zu geben. Sollte man das mitµC so machen? Ich programmiere sonst eigentlich auf dem Desktop und kenne die Besonderheiten der µC nicht so gut.

Es ist im Prinzip sehr einfach. An einer beliebigen Anzahl von Eingängen sind Taster angeschlossen. In meinem Fall 4 Stück. Die sollen beliebig viele LEDs schalten (bei mir wieder 4). Der Vorteil der Arrays ist, dass ich z.B. mit einem Taster mehrere LEDs schalten kann. Die Taster ziehen den Input auf GND - so dass ich die internen PullUp Wiederstände nutzen kann. Das läst sich aber im Programm durch umsetzen des Defines ACTIVE ändern. Welche Variante ist da aus Sicht des µControllers besser? Impuls bei LOW oder bei HIGH.

Bei den LEDs habe ich mich dazu entschloßen, eine gemeinsame Anode zu nehmen und die Katoden pro Pin zu schalten. Die Idee hier war, das der µC nicht den vollen Saft abbekommt. Ist das so richtig?

Für das was das Programm im Moment macht, ist das vielleicht alles ein bißchen dick aufgetragen und man könnte das ganze in lesbarerer Form schreiben (ohne Schleifen, jeden Pin einzeln lesen und schreiben). Ist das so trotzdem die richtige Richtung?

#define MAX_LINES 4         // Anzahl an Inputpins
#define ACTIVE LOW          // Input aktiv bei HIGH oder LOW Signal

#define LED1_PORT 8         // Pin für LED1
#define LED2_PORT 9         // Pin für LED2
#define LED3_PORT 10        // Pin für LED3
#define LED4_PORT 11        // Pin für LED4

#define LINE1 2             // Pin für Taster 1
#define LINE2 3             // Pin für Taster 2
#define LINE3 4             // Pin für Taster 3
#define LINE4 5             // Pin für Taster 4

int lines[MAX_LINES] = {LINE1,LINE2,LINE3,LINE4};                  // Array mit den Inputpins
int leds[MAX_LINES] = {LED1_PORT,LED2_PORT,LED3_PORT,LED4_PORT};   // Array mit den LED Pins 
int signal[MAX_LINES] = {0,0,0,0};                                 // Array zum zwischenspeichern der Signale 
  
void setup() {
  
  Serial.begin(9600);

  for (int i=0; i<MAX_LINES; i++){      // Schleife um alle Input- und Outputpins zu konfigurieren.
    pinMode(lines[i], INPUT);           // setze den Pin aus lines[i] auf INPUT
    if (ACTIVE == LOW){                 // wenn der Taster im gedrückten Zustand den Pin auf GND zieht, 
      digitalWrite(lines[i],HIGH);      // kann der interne Pull-Up Wiederstand genutzt werden.
    }
    pinMode(leds[i], OUTPUT);           // setze den Pin leds[i] auf OUTPUT
  }
}

void loop() {
  
  for (int i=0; i<MAX_LINES; i++){        // Schleife über alle Inputpins
    signal[i] = digitalRead(lines[i]);    // einlesen des Pins lines[i] in das Array signal[i]
    if(signal[i] == ACTIVE){              // Wenn Taster gedrückt wurde
      digitalWrite(leds[i],LOW);          // schalte LED ein  
      Serial.print("Signal: ");           // und gebe die Zeit auf der seriellen Schnittstelle aus. 
      Serial.print(i);
      Serial.print(" millis: ");
      Serial.println(millis());
    }else{                                // wenn Taster nicht gedrückt
      digitalWrite(leds[i],HIGH);         // schalte LED aus
    }
  }
}


// TODO:
// Datentypen - ist int evtl. zu groß?

speerwerfer: Die Taster ziehen den Input auf GND - so dass ich die internen PullUp Wiederstände nutzen kann. Das läst sich aber im Programm durch umsetzen des Defines ACTIVE ändern. Welche Variante ist da aus Sicht des µControllers besser? Impuls bei LOW oder bei HIGH.

Ob Du Pullup oder Pulldown Widerstände benutzt ist egal, bei Pullup ist der Vorteil daß der Atmega sie intern hat und Du sie nicht außen drauflöten mußt.

speerwerfer: Bei den LEDs habe ich mich dazu entschloßen, eine gemeinsame Anode zu nehmen und die Katoden pro Pin zu schalten. Die Idee hier war, das der µC nicht den vollen Saft abbekommt. Ist das so richtig?

Ist auch egal ob Du die LED auf +5V schaltest oder auf Mass und dann mit LOW bzw HIGH einschaltest. Der Unteschied ist wenn Du einen Transistor als Schalter nimmst. Da ist ein NPN (N-MOSFET) mit Open Collektor (open Drain) günstiger da dieser mit 5V anzusteuern kannst auch wenn der Verbrauche mit einer größeren Spannung versorgt wird.

speerwerfer: Für das was das Programm im Moment macht, ist das vielleicht alles ein bißchen dick aufgetragen und man könnte das ganze in lesbarerer Form schreiben (ohne Schleifen, jeden Pin einzeln lesen und schreiben). Ist das so trotzdem die richtige Richtung?

Die Schleifen sind nicht "unlesbar" sondern reduzieren den Kode. also besser schleifen als 4 mal das gleiche schreiben.

Grüeß Uwe