Hallo zusammen,
bin absoluter Anfänger und versuche mich gerade an einer Teilerschaltung.
Ich automatisiere mein Heim mit "Homematic" eine Bastellösung von ELV.
Um Energie und Wasserzähler zu dokumentieren (CCU-Historian) müssen diese in die Haussteuerung eingebunden werden.
Leider ist die CPU der Homematic sehr langsam und die Zählimpulse der S0-Schnittstelles sowie Der Ovalradzähler für Öl
und die Wasserzähler liefern ein sehr genaues und somit leider auch hochfrequentes Signal.
Das Teilen des EIngangssingnal und entprellen ist kein Problem.
Aber der Arduino mini Pro hat ja noch so viele E/A's frei also hat er noch ein Display bekommen.
Funktioniert alles wunderbar.
Mit Display kann man ja noch mit einem Menü auch noch die Verbrauchwerte Hoch bzw. den Tankinhalt runterzählen lassen.
Da dieser Tank von Zeit zu Zeit schon mal befüllt wird, muss die Variable (Float) neu beschrieben werden.
Das Teil ist im Keller, eine autake Lösung wäre schön...habe ein kleines 12 Tasten Keyboard (Analog) angeschlossen und es funktioniert auch, allerdings
finde ich keine Lösung wie ich die Variable "Oelstand" neu schreiben kann. Hat jemand von euch ein anpassbares Script?
Hänge da ein wenig in der Luft.
Schön wäre es auch wenn ich diese Zähler in einen nichtflüchtigen Speicher schreiben könnte (Stromausfall), hab nur gelesen, das die Lebensdauer (Schreibzyklen) sehr begrenzt ist von EEPROMS.
Gibt es jemanden hier der etwas Erfahrung mit Homematic hat und weiß wie ich die Variablen in die Systemvariablen der CCU schreiben könnte?
Wie gesagt bin noch Anfänger und suche in allen Richtungen. Den deutschen bereich hier im Forum hab ich schon durch und konnte noch nicht die passende Antwort finden.
Gruß
Hallo,
hab nach einigen Nächten eine Lösung für mein Problem gefunden.
Alle Anfänger die vieleicht ähnlich wie ich lange suchen und nichts finden, versucht dies:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int analogPin = 3; // Anschluss des Keypad über Analog In
int threshold = 3; // Genauigkeit beim Einlesen des Keypads
int debounceTime = 30; // Entprellzeit beim Keypad
int lastValue = 0; // letzter Wert (keypad)
char oldkey = 0; // wird zur abfrage eines flankenwechsels benötigt
String Key = 0; // Zeichenkette des Keypads
int start = 0; // Start/Stop variable zur Wertübernahme (Bool)
float Oelstand = 0; // Füllstand Heizöl
#define KEY_NOT_PRESSED '_' // Wird benötigt, wenn keine Taste gedrückt wird
#define KEY_1 '1' // Definiert die Rückgabewerte der Tasten
#define KEY_2 '2'
#define KEY_3 '3'
#define KEY_4 '4'
#define KEY_5 '5'
#define KEY_6 '6'
#define KEY_7 '7'
#define KEY_8 '8'
#define KEY_9 '9'
#define KEY_0 '0'
#define KEY_STAR '*'
#define KEY_HASH '#'
void setup() {
lcd.begin(8, 2); // Zeichen pro Zeile und Zeilenanzahl des LCD's festlegen
}
void loop(){
//--------------------------------------------------------------Keypad einlesen
char key = KEY_NOT_PRESSED;
byte aValue = analogRead(analogPin);
if((aValue > 0)&&(millis() - lastValue >= debounceTime)){
if((aValue > (135 - threshold)) && (aValue < (135 + threshold))) key = KEY_1; //hier die Widerstandswerte des Keypads eintragen!
if((aValue > (79 - threshold)) && (aValue < (79 + threshold))) key = KEY_2;
if((aValue > (15 - threshold)) && (aValue < (15 + threshold))) key = KEY_3;
if((aValue > (149 - threshold)) && (aValue < (149 + threshold))) key = KEY_4;
if((aValue > (94 - threshold)) && (aValue < (94 + threshold))) key = KEY_5;
if((aValue > (32 - threshold)) && (aValue < (32 + threshold))) key = KEY_6;
if((aValue > (162 - threshold)) && (aValue < (162 + threshold))) key = KEY_7;
if((aValue > (108 - threshold)) && (aValue < (108 + threshold))) key = KEY_8;
if((aValue > (48 - threshold)) && (aValue < (48 + threshold))) key = KEY_9;
if((aValue > (175 - threshold)) && (aValue < (175 + threshold))) key = KEY_STAR;
if((aValue > (122 - threshold)) && (aValue < (122 + threshold))) key = KEY_0;
if((aValue > (64 - threshold)) && (aValue < (64 + threshold))) key = KEY_HASH;
lastValue = millis();
}
if((key != oldkey) && (key == '#')){start++;} // Startvariable setzen
if(start == 2){start = 0;} // Stopvariable setzen
if((key != oldkey) && (start == 1) && (key != '_') && (key != '#')){ // Übernahme des Char in einen String
Key+= key;
}
oldkey = key; // alten Wert abspeichern für pos. Flanke
if(key == '*'){ // mit * zurücksetzen
Key = 0;
}
if((start == 1) && (key = '#')){ // Abfragen der Startvariablen
Oelstand = Key.toInt(); // String in Float wandeln
Oelstand = Oelstand/100; // 2 Nachkommastellen schreiben
}
//------------------------------------------------------------- Ausgabe Display
lcd.clear(); // Lösche Displayinhalt
lcd.print(Key);
lcd.print(start);
lcd.setCursor(0,1); // Wechsel in die 2. Zeile
lcd.print(key); // Schreibe Daten in die 2. Zeile
lcd.print(Oelstand);
delay(30);
}
Läßt sich sicher eleganter lösen, aber bei mir funktionierts. Das Zauberwort heißt: ".toInt"
Der Code ist lange nicht fertig, aber ich bin einen großen Schritt weiter...
Gruß