diff --git a/drawers/src/main.cpp b/drawers/src/main.cpp index f7d1f15..32eddb7 100644 --- a/drawers/src/main.cpp +++ b/drawers/src/main.cpp @@ -1,23 +1,11 @@ #include - - ARCHIV – Arduino Mega (I2C-Slave) - Alle ehemaligen Puls-Signale jetzt rein logisch über I2C - ========================================================= */ - #include -// I2C const uint8_t I2C_ADDR = 0x10; -// I2C-Befehle (müssen zum Master-Code passen) -const uint8_t CMD_LED_LOCK_TOGGLE = 0x01; -const uint8_t CMD_ALLES_GESCHAFFT = 0x02; -const uint8_t CMD_AUSWAHLRAD_LINKS = 0x03; -const uint8_t CMD_AUSWAHLRAD_RECHTS = 0x04; - -/* ------------------------- - Hardware - ------------------------- */ +const uint8_t CMD_POWER_OFF = 0x01; +const uint8_t CMD_LIGHT_INDEX = 0x02; +const uint8_t CMD_DRAWER_INDEX = 0x03; struct Schublade { int schlossPin; @@ -35,22 +23,50 @@ Schublade schubladen[8] = { {10, 26} }; -/* ------------------------- - Zustände - ------------------------- */ +void turnAllLedsOf() { + for (int i = 0; i < 8; i++) { + digitalWrite(schubladen[i].ledPin, LOW); + } +} +void turnOnSingleLed(uint8_t indexOn) { + if (indexOn < 0 || indexOn >= 8) + return; + turnAllLedsOf(); + digitalWrite(schubladen[indexOn].ledPin, HIGH); +} -int currentIndex = 0; -bool ledsLocked = false; -bool schlossOffen = false; +const int LOCK_THRESHOLD = 750; +unsigned long lockTimer = 0; +bool unlocked = false; -/* ------------------------- - Schloss-Timer - ------------------------- */ +void openLock(uint8_t indexOn) { + unlocked = true; + lockTimer = millis(); + digitalWrite(schubladen[indexOn].schlossPin, HIGH); +} -const unsigned long SCHLOSS_DAUER = 750; -unsigned long schlossStart = 0; +void onI2CReceive(int len) { + while (Wire.available()) { + uint8_t cmd = Wire.read(); -/* ========================================================= */ + switch (cmd) { + + case CMD_POWER_OFF: + turnAllLedsOf(); + break; + + case CMD_LIGHT_INDEX: + uint8_t index = Wire.read(); + turnOnSingleLed(index); + break; + + case CMD_DRAWER_INDEX: + uint8_t index = Wire.read(); + openLock(index); + break; + } + } +} void setup() { Wire.begin(I2C_ADDR); @@ -62,82 +78,13 @@ void setup() { digitalWrite(schubladen[i].ledPin, LOW); digitalWrite(schubladen[i].schlossPin, LOW); } - - updateLEDs(); } -/* ========================================================= */ - void loop() { - handleSchlossTimeout(); -} - -/* ========================================================= - I2C-Callback - ========================================================= */ - -void onI2CReceive(int len) { - while (Wire.available()) { - uint8_t cmd = Wire.read(); - - switch (cmd) { - - case CMD_LED_LOCK_TOGGLE: - ledsLocked = !ledsLocked; - updateLEDs(); - break; - - case CMD_ALLES_GESCHAFFT: - openSchlossTimed(); - break; - - case CMD_AUSWAHLRAD_RECHTS: - if (!ledsLocked) { - currentIndex = (currentIndex + 1) % 8; - updateLEDs(); - } - break; - - case CMD_AUSWAHLRAD_LINKS: - if (!ledsLocked) { - currentIndex = (currentIndex + 7) % 8; - updateLEDs(); - } - break; - } - } -} - -/* ========================================================= - LED-Steuerung - ========================================================= */ - -void updateLEDs() { - for (int i = 0; i < 8; i++) - digitalWrite(schubladen[i].ledPin, LOW); - - if (!ledsLocked) - digitalWrite(schubladen[currentIndex].ledPin, HIGH); -} - -/* ========================================================= - SCHLOSS – zeitgesteuert - ========================================================= */ - -void openSchlossTimed() { - for (int i = 0; i < 8; i++) - digitalWrite(schubladen[i].schlossPin, LOW); - - digitalWrite(schubladen[currentIndex].schlossPin, HIGH); - schlossOffen = true; - schlossStart = millis(); -} - -void handleSchlossTimeout() { - if (schlossOffen && millis() - schlossStart >= SCHLOSS_DAUER) { - for (int i = 0; i < 8; i++) + if (unlocked && millis() - lockTimer >= LOCK_THRESHOLD) { + for (int i = 0; i < 8; i++) { digitalWrite(schubladen[i].schlossPin, LOW); - - schlossOffen = false; + } + unlocked = false; } } \ No newline at end of file