Simplify drawer archive
This commit is contained in:
parent
a2945bad9a
commit
5080a004af
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user