constexpr byte ANZAHL_NOCKEN {2};
constexpr byte ANZAHL_NOCKEN_LEDS {3};
enum Leds : byte {ledDown, ledOk, ledUp};
enum Nocken : byte {nocke1, nocke2};
struct Nocke {
const unsigned int untererGrenzwert;
const unsigned int obererGrenzwert;
const byte readPin;
const byte ledPin[ANZAHL_NOCKEN_LEDS];
};
struct Nocke nocken[ANZAHL_NOCKEN] {
{
235, 276, 12, {2, 3, 4}
}, // Init Struktur Nocke 1 mit unterer-, oberer Grenzwert, zugehörige Lese- und Led Pins
{696, 737, 13, {5, 6, 7}} // Init Struktur Nocke 2 mit unterer-, oberer Grenzwert, zugehörige Lese- und Led Pins
//{werte Nocke 3},
//{werte Nocke 4}
};
// Durch Ändern der Werte ANZAHL_NOCKEN, enum Nocken und der initialisierung der
// struct Nocke können beliebig viele Nocken und leds hinzugefügt werden ohne dass
// am folgenden Quellcode etwas geändert werden muss.
constexpr byte potiPin = A0; //Eingang vom Poti
// Vorwärtdeklaration Funktion(en)
void testNocke(unsigned int, struct Nocke&);
void setup() {
Serial.begin(9600); //Ausgabe im Monitor
// pinMode für INPUT und OUTPUT Pins setzen
for (auto &nocke : nocken) {
pinMode(nocke.readPin, INPUT);
for (byte i = 0; i < ANZAHL_NOCKEN_LEDS; ++i) {
pinMode(nocke.ledPin[i], OUTPUT);
}
}
}
void loop() {
static unsigned int alterWert {1025};
// Potiwert einlesen
unsigned int potiWert = analogRead(potiPin);
if (potiWert != alterWert) {
alterWert = potiWert;
Serial.print(potiWert); Serial.print(", ");
Serial.print((5.0 / 1023) * potiWert, 3); Serial.println(" V");
for (auto &nocke : nocken) { testNocke(potiWert, nocke); }
} else {
// LED OK schalten, wenn sich der Status der Nocke ändert ohne dass
// der Poti Wert sich verändert hat.
for (auto &nocke : nocken) {
if ( (!digitalRead(nocke.readPin) && digitalRead(nocke.ledPin[ledOk])) ||
(digitalRead(nocke.readPin) && !digitalRead(nocke.ledPin[ledOk])) ) {
testNocke(potiWert, nocke);
}
} // for
} //if
}
void testNocke(unsigned int wert, struct Nocke& nk) {
// Erst mal alle LEDs auf LOW setzten
digitalWrite(nk.ledPin[ledDown], LOW);
digitalWrite(nk.ledPin[ledOk], LOW);
digitalWrite(nk.ledPin[ledUp], LOW);
// Nun nur noch die relevante LED auf HIGH setzen (spart 3 digitalWrite Operationen)
if (digitalRead(nk.readPin) == HIGH && (wert >= nk.untererGrenzwert && wert <= nk.obererGrenzwert)) {
digitalWrite(nk.ledPin[ledOk], HIGH);
}
else if (wert < nk.untererGrenzwert) {
digitalWrite(nk.ledPin[ledDown], HIGH);
} else if (wert > nk.obererGrenzwert) {
digitalWrite(nk.ledPin[ledUp], HIGH);
}
}