// Bibliotheken
#include <Adafruit_NeoPixel.h>
// SerialPrint als Debug
#define DEBUG 1
#if DEBUG == 1
#define debug(x) Serial.print(x)
#define debugg(x, y) Serial.print(x, y)
#define debugln(x) Serial.println(x)
#define debuggln(x, y) Serial.println(x, y)
#else
#define debug(x)
#define debugg(x, y)
#define debugln(x)
#define debugg(x, y)
#endif
// Ultraschall-Sensor
#define US_TRIG 23
#define US_ECHO 22
// NeoPixel-Ringe
#define LED_KITCH_DIN 32 // Pin Küchen-Ring
#define LED_TANK_DIN 17 // Pin Tank-Ring
#define LED_AnzahlLED 16 // LEDs je Ring
// LED-Farben 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
byte RGB_r [16] = { 0, 32, 64, 96, 128, 159, 191, 223, 255, 255, 255, 255, 255, 255, 255, 255};
byte RGB_g [16] = { 255, 255, 255, 255, 255, 255, 255, 255, 223, 191, 159, 128, 96, 64, 32, 0};
byte RGB_b [16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
/* Variablen und Berechnung der Farben --> dann muss man keine Arrays berechnen & erstellen
byte RGB_LEDdeltaLED = 255 / LED_AnzahlLED * 2; // Änderung des Farbwerts (rot, gelb, blau) zwischen 2 LEDs
byte rot, gelb, blau, diff; // Farb-Variablen
*/
Adafruit_NeoPixel LED_KITCH (LED_AnzahlLED, LED_KITCH_DIN, NEO_RGB);
Adafruit_NeoPixel LED_TANK (LED_AnzahlLED, LED_TANK_DIN, NEO_RGB);
// Buttons
#define BTN_KITCH 26 // Button Küche
#define BTN_WALL 27 // Button Tank
// Variablen
int Tank_Laenge = 98; // Tanklänge in cm
int Tank_Breite = 22; // Tankbreite in cm
int Tank_Hoehe = 300; // Tankhöhe in cm
int MessgrenzeSensor = 2; // Korekturwert in cm, um auf 100% Füllung bei Erreichen der Messgrenze zu kommen = minimaler Messwert Sensor
float Tankkapazitaet = (Tank_Laenge*Tank_Breite*Tank_Hoehe) / 1000; // Maximale Tankkapazität in Liter
float FuellstandLiter, FuellstandProzent;
byte FuellstandLED = 0; // Anzahl zu leuchtender LEDs in Abhängigkeit der Tankfüllung
byte LED_KITCH_OnOff = 0; // Flag für Ausschalt-Animation LED_KITCH
byte LED_TANK_blink = 0; // Flag für Überlaufwarnung
// Timer
unsigned long CurrentMillis;
unsigned long LED_KITCH_FadeOutStart; // Startzeit zum ausfaden der Küchen-LEDs
long LED_KITCH_FadeOutDelay = 1500; // Delay bis Küchen-LEDs ausfaden in Millisekunden
// Timer - Variablen für Überlaufwarnung ohne delay -- > FUNKTIONIERT GRAD NICHT
unsigned long LED_TANK_PrevMill = 0; // Timer für Überlaufwarnung
void setup() {
Serial.begin(115200);
debugln("Habe die Ehre!");
pinMode (US_TRIG, OUTPUT);
pinMode (US_ECHO, INPUT);
LED_KITCH.begin();
LED_KITCH.setBrightness(255);
LED_TANK.begin();
LED_TANK.setBrightness(255);
pinMode (BTN_KITCH, INPUT);
pinMode (BTN_WALL, INPUT);
}
void FuellstandsMessung() {
digitalWrite(US_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(US_TRIG, LOW);
float Distanz = (pulseIn(US_ECHO, HIGH) / 58);
float Wasserstand = Tank_Hoehe - Distanz + MessgrenzeSensor; // + MessgrenzeSensor, um auf 100 % Füllung (2cm unter Sensor = Überlaufreserve) zu kommen
FuellstandLiter = (Tank_Laenge * Tank_Breite * Wasserstand) / 1000; // Füllstand in Liter berechnen
FuellstandProzent = FuellstandLiter / Tankkapazitaet * 100; // Füllstand in % berechnen
FuellstandLED = map(FuellstandProzent, 0, 100, 1, 16); // Anzahl zu leuchtende LEDs ermitteln
}
void Datenausgabe() {
debug("Füllstand: ");
debug(FuellstandLiter);
debug(" Liter bzw. ");
debug(FuellstandProzent);
debugln("%.");
}
/*
void Ueberlaufwarnung(long LED_TANK_BlinkIntervall) {
if (CurrentMillis - LED_TANK_PrevMill < LED_TANK_BlinkIntervall) {
LED_TANK.setBrightness(0);
LED_TANK.show();
//delay(20);
} else {
// LEDs leuchten lassen
LED_TANK.setBrightness(255);
LED_TANK.clear();
for (byte i = 0; i < FuellstandLED; i++) {
LED_TANK.setPixelColor(i, RGB_r[i], RGB_g[i], RGB_b[i]);
}
LED_TANK.show();
// Timer aktualisieren
LED_TANK_PrevMill = CurrentMillis;
//delay(20);
}
}
*/
void Ueberlaufwarnung(int LED_TANK_BlinkIntervall) {
if (LED_TANK_blink == 0) {
// LEDs leuchten lassen
LED_TANK.setBrightness(255);
LED_TANK.clear();
for (byte i = 0; i < FuellstandLED; i++) {
LED_TANK.setPixelColor(i, RGB_r[i], RGB_g[i], RGB_b[i]);
}
LED_TANK.show();
// Flag umstellen
LED_TANK_blink = 1;
delay(LED_TANK_BlinkIntervall);
} else {
LED_TANK.clear();
LED_TANK.show();
// Flag umstellen
LED_TANK_blink = 0;
delay(LED_TANK_BlinkIntervall);
}
}
void loop() {
CurrentMillis = millis();
////////// Button Küche ist an (= Hahn offen)
if (digitalRead(BTN_KITCH) == HIGH) {
debugln("Küchenbutton an");
FuellstandsMessung();
Datenausgabe();
// LEDs leuchten lassen
LED_KITCH.setBrightness(255);
LED_KITCH.clear();
for (byte i = 0; i < FuellstandLED; i++) {
LED_KITCH.setPixelColor(i, RGB_r[i], RGB_g[i], RGB_b[i]);
/*
/////////////////FARBE BERECHNEN
if (i < LED_AnzahlLED / 2) {
rot = i * RGB_LEDdeltaLED;
gelb = 255;
} else {
rot = 255;
diff = i - LED_AnzahlLED / 2 + 1;
gelb = 255 - diff * RGB_LEDdeltaLED;
}
blau = 0;
LED_KITCH.setPixelColor(i, rot, gelb, blau);
/////////////////ENDE FARBE BERECHNEN
*/
}
LED_KITCH.show();
// Flag für FadeOutAnimation & Startzeit für FadeOutDelay setzen
LED_KITCH_OnOff = 1;
LED_KITCH_FadeOutStart = CurrentMillis;
}
////////// Button Küche war an, ist jetzt aus (= Hahn zu) & Delay ist abgelaufen --> Füllstandsanzeige ausfaden lassen
if (LED_KITCH_OnOff == 1 && digitalRead(BTN_KITCH) == LOW && CurrentMillis - LED_KITCH_FadeOutStart >= LED_KITCH_FadeOutDelay) {
// LEDs ausfaden
for (byte B = 255; B > 0; B--) {
LED_KITCH.setBrightness(B);
LED_KITCH.show();
delay(1);
}
// Brightness & Flag zurücksetzen
LED_KITCH.setBrightness(255);
LED_KITCH_OnOff = 0;
}
////////// Button Tank ist an (= Tankdeckel offen)
if (digitalRead(BTN_WALL) == HIGH) {
debugln("Tankbutton an");
FuellstandsMessung();
Datenausgabe();
// LEDs leuchten & ggf. blinken lassen
switch (int(FuellstandProzent)) {
case 0 ... 84:
// LEDs leuchten lassen
LED_TANK.setBrightness(255);
LED_TANK.clear();
for (byte i = 0; i < FuellstandLED; i++) {
LED_TANK.setPixelColor(i, RGB_r[i], RGB_g[i], RGB_b[i]);
}
LED_TANK.show();
break;
case 85 ... 89:
Ueberlaufwarnung(300); // BlinkIntervall in Millisekunden
break;
case 90 ... 94:
Ueberlaufwarnung(215); // BlinkIntervall in Millisekunden
break;
case 95 ... 99:
Ueberlaufwarnung(150); // BlinkIntervall in Millisekunden
break;
case 100 ... 999:
Ueberlaufwarnung(75); // BlinkIntervall in Millisekunden
break;
}
} else { // Button Tank ist aus (= Tankdeckel zu)
LED_TANK.clear();
LED_TANK.show();
}
}