Digitalen Input erkennen

Hallo Leute, ich bin relativ neu hier und hätte jetzt schon das erste große Fragezeichen im Gesicht :D

Folgender Fall:

Ich habe ein Projekt, bei dem ich zurzeit nur einen Input und einen Output meines Arduino`s in Benutzung habe. Wenn ich also den Schalter an "Inp01" umlege, wird einfach eine Funktion abgerufen, die zeit verzögert den Output "Outp01" an bzw. aus schaltet. Dies habe ich mit einer Simplen If-Abfrage realisiert.

Nun möchte ich aber die Inputs und Outputs auf jeweils 15 Stück erweitern. Da wird das mit den If abfragen schon ziemlich aufwändig.

Nun zu meiner Frage: Gibt es die Möglichkeit, dass der Arduino erkennt, auf welchem Input grade 5V anliegt, und den Namen dann in einem String ausgibt? Wenn ich also zum Beispiel den Schalter am Input "Inp06" betätige, dass ich dann in einem String stehen hab "Inp06".

Dann könnte ich mir die Menge an if abfragen ja sparen und einfach anschließend mit switch/case arbeiten.

Danke Schon mal im Vorraus, Arduino153

Vllt sowas hier?

 for (int i=1; i <= 15; i++){
      if(digitalRead(i) == HIGH)
          digitalWrite((i + 20), High);
      Else
          digitalWrite((i+20), LOW);
 }

Die Eingänge sind Pin 1 bis 15 und die Ausgänge Pin 21 bis 35. Ungetestet, aber so in der Art sollte was wohl gehen. Wenn du Zeit verzögern willst, dann nutze Millis()

Danke Ich probiers mal aus :D

Wenn ich also zum Beispiel den Schalter am Input “Inp06” betätige, dass ich dann in einem String stehen hab “Inp06”.
Dann könnte ich mir die Menge an if abfragen ja sparen und einfach anschließend mit switch/case arbeiten.

Das geht zwar beides, hat aber nichts miteinander zu tun.
Wenn immer nur einer der Schalter betätigt sein darf, kannst du eine eintsprechende Nummer in eine Integer Variable eintragen, und die in einem switch abfragen.
Diese Nummer kannst du auch in einen String schreiben, den du auf den Serial Monitor sendest.

int i;
for ( i = 0; i < 15 i++)
   if (digitalRead(i) == HIGH) break; // beim ersten Schalter Schleife verlassen
switch (i)
{
  case 0: 
   // spezialBehandlung  Schalter 0
  break;
 ...
}
char sText[6];  // Inp##
sprintf (sText, "Inp%02d", i);
Serial.println (sText);

Ich würde das Lesen der Schalter und das Setzen der Ausgänge komplett trennen.

Erst eine for-Schleife um alle Schalter einzulesen, und, wenn einer umgelegt wurde, den Zeitpunkt speichern.
Ob ein Schalter gerade eben umgelegt wurde erkennt man, dass die gespeicherte Zeit auf null steht.

Und dann, in einer extra Schleife die Ausgänge setzen:
Wenn die Zeit auf Null steht, dann Ausgang aus, sonst prüfen, ob die gewünschte Wartezeit vergangen ist und den Ausgang setzen.

Das könnte dann z.B. so aussehen:

const int SchalterPin[]={1,2,3,4,5,6,7,8};  	// Hier werden alle SchalterPins gespeichert
						// Schalter nach GND. Wenn an, dann LOW am Pin
const int SchalterZahl = sizeof(SchalterPin)/2;  // wieviele Schalter gibt es?
const int Outpin[]={10,11,12,13,14,15,16,17,18}; // Hier werden alle Ausgangspins gespeichert
const int Outzahl = sizeof(Outpin)/2;		// wieviele Ausgangspins gibt es?
const int Wartezeit = 1000;			// ms Zeit von Schalten bis Ausgang setzen.

unsigned long SchaltZeit[SchalterZahl];  // Array zum Speichern der Zeit, wann ein Taster gedrückt wurde
                                         // wenn Zeit = 0, ist Schalter aus.
void setup(){
  Serial.begin(9600);
  for(int i=0; i<SchalterZahl;i++) pinMode(SchalterPin[i], INPUT_PULLUP);  
  for(int i=0; i<Outzahl;i++) pinMode(Outpin[i], INPUT_PULLUP);
}

void loop(){
  // Schalter einlesen
  for(int i=0; i<SchalterZahl;i++){
    int pinstatus = digitalRead(SchalterPin[i]);
    if (SchaltZeit[i] == 0 && pinstatus == LOW){   // Schalter wurde umgelegt: Pin low UND noch keine Zeit
      SchaltZeit[i]=millis();  			   // Speichern des Zeitpunktes, an dem der Schalter umgelegt wurde
    }else if (pinstatus == HIGH){ 	// Schalter aus
      SchaltZeit[i] = 0;		// Zeit auf 0 setzen
    }    
  }// end for-Schleife Schalter lesen
  
  // Ausgänge setzen
  for(int i=0; i<Outzahl;i++){
    if (SchaltZeit[i] == 0) digitalWrite(Outpin[i],LOW);  // keine Zeit gespeichert => Ausgang aus
    else if (millis() > SchaltZeit[i] + Wartezeit) digitalWrite(Outpin[i],HIGH); // nach Wartezeit Ausgang ein
  }// end for-Schleife Ausgänge setzen
  
}// end loop