Wohl wahr!
Und dennoch kann man die Schleife in eine Funktion auslagern, wenn man alle Pins eines PinArrays "anfassen" möchte
Hier mal ein tieferer Blick in meiner Wühlkiste, denn ein klein wenig hatte ich irgendwann mal vorbereitet:
using PinMode = decltype(INPUT);
using PinValue = decltype(LOW);
// initialisiert alle Pins in dem Array mit Mode
template<size_t N> void pinMode(const byte (&pins)[N], const PinMode mode)
{
for(const byte &pin : pins)
pinMode(pin, mode);
}
// schreibt value in alle Pins
template<size_t N> void digitalWrite(const byte (&pins)[N], const PinValue value)
{
for(const byte &pin : pins)
digitalWrite(pin, value);
}
// testet ob irgendeiner der Pins High oder Low ist
template<size_t N> bool digitalIsAny(const byte (&pins)[N], const PinValue value)
{
for(const byte &pin : pins)
if(value == digitalRead(pin))
return true;
return false;
}
// zaehlt alle High oder Low
template<size_t N> size_t digitalCount(const byte (&pins)[N], const int &value)
{
size_t result = 0;
for(const byte &pin : pins)
result += value == digitalRead(pin);
return result;
}
template<unsigned i, unsigned j> struct Inputs
{
union
{
struct
{
byte limitSwitch[i];
byte limitSensor[j];
};
byte all[i + j];
};
};
constexpr Inputs<8, 8> inputs{{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17}};
//const byte outputs[] {18,19,20};
constexpr byte outputs[] {18, 19, 20};
void setup()
{
Serial.begin(9600);
pinMode(inputs.all, INPUT_PULLUP); //alle inputs konfigurieren
// pinMode(inputs.all,INPUT); //alle inputs konfigurieren
pinMode(outputs, OUTPUT); // alle outputs konfigurieren
digitalWrite(outputs, LOW); // alle outputs vorbesetzen
// bool merker = digitalRead(inputs.limitSwitch[3]); // einzelnen Pin lesen
// bool merker = digitalRead(inputs.all[11]); // einzelnen Pin lesen
}
void loop()
{
Serial.println(" -----loop-------.");
Serial.println(" ------digitalIsAny von inputs.all------.");
if(digitalIsAny(inputs.all, LOW)) Serial.println("Mindestens 1 Pin ist Low");
else Serial.println("kein Pin ist Low");
Serial.println(" ------digitalIsAny von inputs.limitSwitch------.");
if(digitalIsAny(inputs.limitSwitch, HIGH)) Serial.println("Mindestens 1 Pin ist High");
else Serial.println("kein Pin ist High");
Serial.println(" ------digitalcount------.");
Serial.print("Es sind ");
Serial.print(digitalCount(inputs.all, HIGH));
Serial.println(" Pins High.");
Serial.println();
delay(1000); // provisorisch
}
Wobei, ich glaube, dass auch dieses an einer echten Lösung vorbei geht.
Bisher sehe ich nur einen Teil einer Idee...
Kann also nur zeigen "was geht"
Solange das Gesamtproblem, welches gelöst werden soll, geheim ist, solange wirds auch keine echte/angemessene Lösung geben.
PS:
Das Programm wirft übrigens eine Warnung, wenn man den Compiler ganz pedantisch einstellt:
warning: ISO C++ prohibits anonymous structs [-Wpedantic]
43 | {
| ^
Das ist solange kein Drama, wie man den GCC nutzt. Und das dürfte in allen Arduino Programmen, egal für welchen µC, der Fall sein.