This repository has been archived on 2024-01-26. You can view files and clone it, but cannot push or open issues or pull requests.
hackerspace-status-arduino/status/status.ino

96 lines
2.4 KiB
Arduino
Raw Normal View History

2014-01-27 21:37:49 +00:00
/*
* es gibt folgende Zustände:
* 0 - Aus
* 1 - An, aber auf dem weg zu aus
* 2 - An
*/
#define STATE_OFF 0
#define STATE_HALF 1
#define STATE_ON 2
/*
* Zeit wie lange in einem Zustände verharrt werden soll
* bis zum nächsten umgeschaltet wird in Millisekunden.
* TIME_HALF - Zeitspanne von Zustand 2 bis Wechsel zu Zustand 1
* TIME_OFF - Zeitspanne von Zustand 2 bis Wechsel zu Zustand 0
*/
#define TIME_HALF 5400000 // 1,5h
#define TIME_OFF 7200000 // 2h
// für Variablen Überlauf in calcStateTime
#define MAX_LONG 4294967295
// Ein-/Ausgänge Bezeichnen
const int BTN_ON = 2; // Einschalter
2015-09-01 15:41:24 +00:00
#define INTERRUPT_NAME_BTN_ON 0
2014-01-27 21:37:49 +00:00
const int BTN_OFF = 3; // Ausschalter
2015-09-01 15:41:24 +00:00
#define INTERRUPT_NAME_BTN_OFF 1
2014-02-10 21:15:43 +00:00
const int LED_G = 9; // grüne LED
2014-01-27 21:37:49 +00:00
const int LED_Y = 8; // gelbe LED
2014-02-10 21:15:43 +00:00
const int LED_R = 7; // rote LED
2014-01-27 21:37:49 +00:00
// hier wird der aktuelle Zustand gespeichert
2015-09-01 15:41:24 +00:00
volatile byte state = STATE_OFF;
2014-01-27 21:37:49 +00:00
// hier wird der Beginn des aktuellen Zustand gespeichert in Millisekunden nach Uptime.
2015-09-01 15:41:24 +00:00
volatile unsigned long stateBegan;
2014-01-27 21:37:49 +00:00
// wird einmalig beim Start des Arduinos ausgeführt
void setup() {
pinMode(LED_G, OUTPUT);
pinMode(LED_Y, OUTPUT);
pinMode(LED_R, OUTPUT);
Serial.begin(9600);
2015-09-01 15:41:24 +00:00
attachInterrupt(INTERRUPT_NAME_BTN_ON, buttonOnPressed, RISING);
attachInterrupt(INTERRUPT_NAME_BTN_OFF, buttonOffPressed, RISING);
2014-01-27 21:37:49 +00:00
}
// bildet den aktuellen Zustand auf die LEDs ab
void setStateOnLeds() {
digitalWrite(LED_R, (state == STATE_OFF));
digitalWrite(LED_Y, (state == STATE_HALF));
digitalWrite(LED_G, (state == STATE_ON));
}
unsigned long calcStateTime() {
// Variablen überlauf von millis erkennen
if (millis() - stateBegan >= 0) {
return millis() - stateBegan;
} else {
return millis() + (MAX_LONG - stateBegan);
}
}
// wird nach dem Starten dauerhaft ausgeführt
void loop() {
2015-09-01 15:41:24 +00:00
setStateOnLeds();
2014-01-27 21:37:49 +00:00
// Auswertung des aktuellen Zustandes
// ggf Zustand wechseln
if (state == STATE_ON) {
if (calcStateTime() >= TIME_HALF) {
state = STATE_HALF;
setStateOnLeds();
}
} else if (state == STATE_HALF && calcStateTime() >= TIME_OFF) {
state = STATE_OFF;
setStateOnLeds();
}
// aktuellen Zustand auf die Serielle Verbindung schreiben
2015-07-14 21:53:49 +00:00
if (state == STATE_ON || state == STATE_HALF) {
Serial.print("1");
} else {
Serial.print("0");
}
delay(10);
2014-01-27 21:37:49 +00:00
}
2015-09-01 15:41:24 +00:00
void buttonOnPressed() {
2015-09-24 11:49:22 +00:00
state = STATE_ON;
2015-09-01 15:41:24 +00:00
stateBegan = millis();
2014-01-27 21:37:49 +00:00
}
2015-09-01 15:41:24 +00:00
void buttonOffPressed() {
state = STATE_OFF;
2014-01-27 21:37:49 +00:00
}