Mischerregelung mit Ethernetanschluß und LCD

Es gibt 10 Antworten in diesem Thema, welches 7.567 mal aufgerufen wurde. Der letzte Beitrag () ist von Mattes.

  • Hallo zusammen,
    jetzt möchte ich dem Forum auch mal was zurückgeben. Habe mir eine Arduino-Mischersteuerung mit Ethernetanschluß und LCD gebastelt, am Arduino hängen eine Relaiskarte für die Mischerschaltung und das Ethernet-Shield.


    Es werden 9 Temperatursensoren Dallas DS18S20 ausgelesen und verglichen. Es kann eine maximale/minimale Vorlauftemperatur bei einer definierten Min-/Max Aussentemperatur eingegeben werden.


    Als Sicherheit ist ein Vergleich der Ist-temperatur mit der o.g. min/max. Solltemperatur eingebaut.


    Um ein wildes hin- und hersteuern zu vermeiden, ist ein Vergleich der Vorlauftemperatur mit dem Wert aus dem letzten Durchlauf eingebaut.


    Weiters ist die Steuerung von zwei Pumpen zum Umpumpen von einer Solaranlage in den Puffer 1 und 2 geplant und in der derzeitigen Version auskommentiert und vorr. auch noch nicht funktionsfähig bzw. stimmig. Wird aber demnächst angegangen und getestet.


    Erstellt wurde das ganze auf Version 0.22 unter Lubuntu 11.10. Das war die einzige Version, mit der ich alles lauffähig hinbekommen habe, speziell mit der Library von http://www.bastelitis.de.


    Das mal in Kürze, ihr könnt das verwenden, wenn ihr wollt, ohne Gewähr meinerseits für irgendwas.


    Freut mich, wenn ich weiterhelfen kann,


    viele Grüße
    Norbert


    Ich bekomm die Datei nicht hochgeladen, mal den Chef fragen....

    HVS25E
    2000 Liter Puffer
    Friwa mit FWR21 und PWT 3,6 m²
    LC, Belimo, Kulisse vom Sven
    Mischersteuerung Arduino
    Große Brennkammer vom Sven

  • Hallo,
    ich habe Angst, dass das zu unübersichtlich wird. Ich hab die Datei mal auf meiner Seite hochgeladen.


    KLICK


    Wer möchte, kann die sich hier runterladen. Für Vorschläge und Verbesserungen bin ich natürlich jederzeit offen.
    Vielleicht kann der eine oder andere was damit anfangen.


    Viele Grüße
    Norbert

    HVS25E
    2000 Liter Puffer
    Friwa mit FWR21 und PWT 3,6 m²
    LC, Belimo, Kulisse vom Sven
    Mischersteuerung Arduino
    Große Brennkammer vom Sven

  • [code type=diff]//Pins für Relais etc. definieren


    int mischer_1_zu = 3; // Signal für Mischer Vorlauf zu
    int mischer_1_auf = 6; // Signal für Mischer Vorlauf auf
    int solar_pumpe_1 = 7; // Pumpe von Rotex an Puffer 1
    int solar_pumpe_2 = 8; // Pumpe von Rotex an Puffer 2
    int micro = 4; // Mikroschalter von Heizungsmischer[/code]


    Da wir in C++ programmieren würde ich das als const. deklarieren. Oder wenn du aus der C Schule kommst als Definition. Nicht aber als Variable. Gleiches gilt für die Floats(!) weiter unten.


    [code type=diff]delay(1000); // Verzögerung für das Auslesen der Temperatursensoren
    ds18s20.update();
    //----- Temperaturfühler auslesen--------//


    delay(5000);[/code]


    Hier hast du deine Zykluszeit schonmal auf mindestens 6 Sekunden erhöht :D. Ist nicht so wahnsinnig doll und würde ich nicht als guten Programmierstil auffassen.
    Ich würde empfehlen die Libs Dallas und onewire zu verwenden.
    Und die Temperaturen nur all x Sekunden zu lesen bzw. immer nur dann zu lesen wenn sie gerade gebraucht werden.

  • das mit dem constrain ist schon mal ein guter Anfang. Aber es ist so, dass auch die maximalen Werte die Anlage auf Dauer in einen kritischen Zustand führen könnten.
    Deswegen übermittelt mein Lösung immer einen letzten gültigen Wert. Und wenn nach x Sekunden kein neuer gültiger Wert übergeben wurde dann liefere ich einen Festwert zurück, der definitiv sicher ist.

  • Hallo norbert.


    das sieht schon recht gut aus - schön das du dich da durchquälst ;)


    Verbessern / hinweisen würde ich nur auf folgende punkte:


    1. grundsätzlich würde ich dir empfehlen die verschieden aufgaben in funktionen zu gruppieren.
    dadurch wird der code viel übersichtlicher.


    2. variabelnamen sollten selbsterklärend sein


    3. Daten typen. float benötigt mehr speicher als int.
    Überleg dir, ob du wirklich immer float benötigst oder ob es auch mit int geht.


    4. Delay hält den controller komplett an.
    du hast schon etwas mit milisekunden (warten1) benutzt,
    Damit könntest du alle paar milisekunden eine funktion aufrufen, die sensorwerte abfragt, oder lcd ausgabe macht oder relais ein/aus schaltet.


    5. falls du die serielle ausgabe nicht brauchst, kannst du sie auskommentieren.
    ich benutze sie nur bei der entwicklung.


    6. Überleg dir, was du alles programmtechnisch machen
    musst, wenn ein sensor ausfällt. (alarm? oder notregelung?)

  • [code type=diff]/* ##### safeTemperature #####
    created by Simon Bauer 2012
    rev. 0 first issue
    Open points:
    new method for time based check
    variables min/max may be declared as const type.
    new name for class. Can be used for all kind of values.
    */



    #include <Arduino.h>
    #include <safeTemperature.h>



    float safeTemperature::temperature(const float &recentTemperature)
    //
    {
    if (recentTemperature < mymaxTemperature && recentTemperature > mymintemperature | abs(recentTemperature - lastValidTemperature) < mymaximumDeltaTemperature)
    {
    lastValidTemperature = recentTemperature;
    i = 0;
    return recentTemperature;
    }
    else if (i == 3) // after 4 attempts it is going to fall back to the manual value. Dependence to time is also possible here.
    {
    return myfallbackTemperature;
    }
    else
    {
    i++;
    return lastValidTemperature;
    }
    }


    safeTemperature::safeTemperature (int minTemperature, int maxTemperature, int maximumDeltaTemperature, int fallbackTemperature)
    : mymintemperature(minTemperature), mymaxTemperature(maxTemperature), mymaximumDeltaTemperature(maximumDeltaTemperature), myfallbackTemperature(fallbackTemperature), lastValidTemperature(fallbackTemperature)
    {

    }


    safeTemperature::~safeTemperature()
    {

    }[/code]


    So sieht das bei mir aus. Der Wert fällt raus wenn min/max überschritten oder wenn Gradient zu groß.
    Nach vier ungültigen Durchläufen wirft die Methode den Festwert raus.


    Wenn gewünscht gibts den Header auch dazu.

  • Hallo zusammen,


    danke für die vielen Tipps. Mal schauen, wie und ob ich die alle eingebaut bekomme. Mein "Problem" ist, dass ich überhaupt nicht aus der Programmierung komme (gelernter Kaufmann), und das ganze eigentlich nur mal als Versucherl gemacht habe, ob ich sowas auch hinbekomme. Da werd ich mich wohl noch ein bisserl mit C/C++ beschäftigen müssen, damit da auch ein sauberes Programm rauskommt.


    Zum Thema Sicherheit: Dafür hatte ich eigentlich den Constrain eingebaut, und als Maximalwert die maximale Vorlauftemperatur (im Beispiel auf 40 Grad) hergenommen. D.h. sollte ein Sensor ausfallen bzw. nicht gelesen werden, so liefert er den Wert von 85 Grad. Sollten bei den relevanten Sensoren (Aussentemperatur bzw. aktuelle Vorlauftemperatur) Werte von 85 Grad ankommen, wird im Falle AT = 85 Grad sowieso eine absolut niedrige Vorlauftemperatur errechnet, was zur Folge hat, dass der Mischer zufährt, ebenso bei der gemessenen Vorlauftemperatur.


    Bin ich hier auf dem Holzweg, oder was sollte zusätzlich noch berücksichtigt werden? Ich hatte noch ins Auge gefasst, ein Anlegetemperaturfühler am VL-Heizkreis zu installieren, der im Falle eines Falles den Mischer unabhängig von der Arduinosteuerung zufährt, hab das aber noch nicht gemacht.


    Gruß
    Norbert

    HVS25E
    2000 Liter Puffer
    Friwa mit FWR21 und PWT 3,6 m²
    LC, Belimo, Kulisse vom Sven
    Mischersteuerung Arduino
    Große Brennkammer vom Sven


  • Weil ich grad dabei bin meine Warnings zu neutralisieren:
    Hier sind zwei "Fehler" drin. Der Gnu Compiler macht das zwar richtig aber dennoch nicht schön. In der ersten Abfrage müßte es heißen:
    (recentTemperature < mymaxTemperature && recentTemperature > mymintemperature) || abs(recentTemperature - lastValidTemperature) < mymaximumDeltaTemperature)


    Und das Oder muss boolean sein und nicht binär.


  • also das mit der temperatur =85° ist so eine sache, im winter ist das nicht so toll, wenn dir der mischer zufährt.
    da du schon ethernet hast, würde ich in diesem fall die sache anders angehen.


    ich ignoriere falsche sensoren werte. ist ein sensorwert ungültig kommt vom sensor -127° und ich benutze den letzten gültigen wert.
    das mit constrain kannte ich nicht - ich vergleiche den wert (-127) und kann so z.b. später ne mail oder sms senden.

  • Bei mir ist der programmablauf für den heizkreismischer folgender:
    ich ermittel die aussentemp. welche ich von einem referenzwert subtrahiere.


    der referenzwert ist (bei 0° aussen) 50° (45 würden denke ich auch gehen).


    mit den 50° schaffen es alle wohnungen auf max. 22° raumtemp.


    liefert der aussensensor nun +10°, ergibt das 50 - 10 = 40°.
    bei -10 sind das dann 50 - -10 = 60°


    der berechnete wert ist das vorlaufsoll.
    nun wird versucht den vorlauf +- 2° genau auf den vorlaufsollwert zu regeln.
    dazu fährt der mischet ca 3 sek. auf oder zu und pausiert danach für 10 sek.


    Nachtabsenkung, von 22:30 - 5:25 wird der vorlaufsollwert um 30° reduziert.
    von 5:35 bis 5:45 nur noch um 23° usw. bis um 6:30 keine absenkung mehr vorhanden ist.


    funktioniert via rtc modul.
    ungültige werte werden wie bereits geschrieben ignoriert.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!