Simplify drawer archive

This commit is contained in:
C0d3v 2026-01-15 14:11:59 +01:00
parent a2945bad9a
commit 5080a004af

View File

@ -1,23 +1,11 @@
#include <Arduino.h> #include <Arduino.h>
ARCHIV Arduino Mega (I2C-Slave)
Alle ehemaligen Puls-Signale jetzt rein logisch über I2C
========================================================= */
#include <Wire.h> #include <Wire.h>
// I2C
const uint8_t I2C_ADDR = 0x10; const uint8_t I2C_ADDR = 0x10;
// I2C-Befehle (müssen zum Master-Code passen) const uint8_t CMD_POWER_OFF = 0x01;
const uint8_t CMD_LED_LOCK_TOGGLE = 0x01; const uint8_t CMD_LIGHT_INDEX = 0x02;
const uint8_t CMD_ALLES_GESCHAFFT = 0x02; const uint8_t CMD_DRAWER_INDEX = 0x03;
const uint8_t CMD_AUSWAHLRAD_LINKS = 0x03;
const uint8_t CMD_AUSWAHLRAD_RECHTS = 0x04;
/* -------------------------
Hardware
------------------------- */
struct Schublade { struct Schublade {
int schlossPin; int schlossPin;
@ -35,22 +23,50 @@ Schublade schubladen[8] = {
{10, 26} {10, 26}
}; };
/* ------------------------- void turnAllLedsOf() {
Zustände 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; const int LOCK_THRESHOLD = 750;
bool ledsLocked = false; unsigned long lockTimer = 0;
bool schlossOffen = false; bool unlocked = false;
/* ------------------------- void openLock(uint8_t indexOn) {
Schloss-Timer unlocked = true;
------------------------- */ lockTimer = millis();
digitalWrite(schubladen[indexOn].schlossPin, HIGH);
}
const unsigned long SCHLOSS_DAUER = 750; void onI2CReceive(int len) {
unsigned long schlossStart = 0; 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() { void setup() {
Wire.begin(I2C_ADDR); Wire.begin(I2C_ADDR);
@ -62,82 +78,13 @@ void setup() {
digitalWrite(schubladen[i].ledPin, LOW); digitalWrite(schubladen[i].ledPin, LOW);
digitalWrite(schubladen[i].schlossPin, LOW); digitalWrite(schubladen[i].schlossPin, LOW);
} }
updateLEDs();
} }
/* ========================================================= */
void loop() { void loop() {
handleSchlossTimeout(); if (unlocked && millis() - lockTimer >= LOCK_THRESHOLD) {
} for (int i = 0; i < 8; i++) {
/* =========================================================
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++)
digitalWrite(schubladen[i].schlossPin, LOW); digitalWrite(schubladen[i].schlossPin, LOW);
}
schlossOffen = false; unlocked = false;
} }
} }