Heizungssteuerung mit 25 TempSensoren, 14 Ventilen und 6 Pumpen

OP (Firma: Herr) #4329945
Lesenswert?

Hallo Jungs und Mädels,

bin beim aufsetzen eines arduino scetches für die Heizungssteuerung.

Mir fehlt aber der Anfang, deswegen hier die BITTE UM HILFE.

Es müssen nach abfrage der 25 Sensoren mehrere ventile (14 Stück) und 
mehrere Motoren (6 Stück) sicher gesteuert werden und die Daten 
Graphisch ausgegeben werden und gespeichert werden..

habe schon mit ->If else<- angefangen,
die verschachtelungen sind aber zu unübersichtlich und es sind ja rein 
rechnerisch 14² Schaltvarianten der ventile möglich (Natürlich schließen 
sich viele aus)
dann habe ich mit ->SWITCH - Case<- waren aber auch zu unübersichtlich

jetzt wollte ich mit array etc. probieren... ABER

bevor ich wieder zeit verliere, wollte ich die EUCH-EXPERTEN fragen, wie 
ih diese Aufgabe lösen würdet.

Danke im Voraus!
Angehängte Dateien:
Gast #4329997
Lesenswert?

Aus deine Tabelle kannst du ganz einfach nach dem EVA-Prinzip die 
Programmstruktur aufbau.

E = Eingabe (Eingänge) = Sensoren

V = Verarbeitung = Auswertung bzgl. der einzelnen Messstellen

A = Ausgabe = Ansprechen der Aktoren (Ventile, Pumpen)

In dieser Reihenfolge könnte der Ablauf in der Main-Loop stattfinden. Da 
es sich nur um eine Temperaturerfassung an einer Heizung und nicht in 
einer Heizung handelt muss du nicht mit Temperatursprüngen oder 
sonstigen spontanen zu erfassenden Größen rechnen. D.h. ein Arduino 
sollte die Aufgabe generell schaffen, wenn er genug Speicher und I/O's 
hat. => Mega256 oder Due.
#4330001
Lesenswert?

Max M. schrieb:

> bevor ich wieder zeit verliere, wollte ich die EUCH-EXPERTEN fragen, wie
> ih diese Aufgabe lösen würdet.

Nur mal angenommen, ich interpretiere deine Grafik richtig.

Für mich sieht das so aus, als ob es einfacher wäre, die Sache von den 
Ventilen her aufzuziehen.
Ventil 1 muss auf 1 geschaltet werden, genau dann wenn .....

Diese ganzen Wenn-Teile lassen (zusammen mit der zugehörigen Aktion) 
sich wieder in einer ähnlichen Grafik bzw. Tabelle darstellen.
Von dieser Grafik nehme ich mir eine Zeile her und beschreibe ihn mit 
einer struct. Die ganze Tabelle ist dann ein Array aus derartigen 
structs.

Und dann schreib ich mir noch eine Funktion, die sich ein Element der 
Tabelle (also 1 Zeile) vornimmt, die entsprechende Auswertung macht und 
die Ventile entsprechend schaltet. Die Funktion wird dann reihum auf 
jede Tabellenzeile angewendet.

Der Rest ist dann 'nur' noch, die relevanten Daten in diese Tabelle 
einzutragen


PS: aus dem Abschnitt 'Temperatur' werde ich nicht schlau. Wie ist der 
zu interpretieren? Dort wo eine Schattierung drinnen ist wird der 
Temperaturwert überwacht, ob er über oder unter einer Vorgabe ist?
Persönliche Seite #4330006
Lesenswert?

Gaast schrieb:
> hat. => Mega256 oder Due.
Wie groß soll das Programm denn werden ? Ah ich vergaß - Arduino.



Wie haste du denn vor die Werte zu Verknüpfen ?
Kann man das in Gruppen aufteilen ?

Satz Sensoren + (Satz Ventile + Satz Pumpen)
Ventile und Pumpen dürften ja theoretisch voneinander direkt abhängen.

Wie behandelst du die Gewichtung zwischen Temperatur vom Sensor und dem 
Aktor (Ventil + Pumpenmotor)?
OP (Firma: Herr) #4330011
Lesenswert?

Dennis H. schrieb:
> Gaast schrieb:
>> hat. => Mega256 oder Due.
> Wie groß soll das Programm denn werden ? Ah ich vergaß - Arduino.
>
>
>
> Wie haste du denn vor die Werte zu Verknüpfen ?
> Kann man das in Gruppen aufteilen ?
>
> Satz Sensoren + (Satz Ventile + Satz Pumpen)
> Ventile und Pumpen dürften ja theoretisch voneinander direkt abhängen.
>
> Wie behandelst du die Gewichtung zwischen Temperatur vom Sensor und dem
> Aktor (Ventil + Pumpenmotor)?

Die Gruppen habe ich versucht unter LOAD UNLOAD etc.  Zusammen zu 
fassen...
#4330013
Lesenswert?

Karl H. schrieb:

> Und dann schreib ich mir noch eine Funktion, die sich ein Element der
> Tabelle (also 1 Zeile) vornimmt, die entsprechende Auswertung macht und
> die Ventile entsprechend schaltet. Die Funktion wird dann reihum auf
> jede Tabellenzeile angewendet.

Innerhalb der Loop ist die Reihenfolge dann
1
void loop()
2
{
3
  alle sensoren abfragen
4

5
  ventilstellungen anhand der Logik-Tabelle ermitteln
6

7
  notwendige Pumpen anhand der Ventilstellungen und/oder Temperaturwerten
8
  ermitteln
9
  (kann man ebenfalls mit einer Tabelle erschlagen)
10

11
  Ventile schalten
12

13
  Pumpen schalten
14
}

ein paar variablen braucht man da natürlich, aber nichts davon ist 
wirklich wild. Ein bisschen Hirnschmalz sollte man noch in Hysteresen 
stecken, damit es an Umschaltpunkten nicht zu Ventilflattern kommt.
#4330016
Lesenswert?

Max M. schrieb:
> Soll der Übersicht dienen... Wollte draus ARRAY bauen :-)

Arrays sind immer gut. Ich habe bei mir die Temperaturwerte im 1 
Minutenraster aufgelöst. Die Ventile werden im 10 Minutenraster 
gesteuert.

> Es müssen nach abfrage der 25 Sensoren mehrere ventile (14 Stück) und
> mehrere Motoren (6 Stück) sicher gesteuert werden und die Daten
> Graphisch ausgegeben werden und gespeichert werden..

Die Sensoren würde ich alle in einer Schleife abfragen. Nach 10 Minuten 
steuerst Du dann die Ventile einmal an. Beim Ansteuern der Ventile wird 
dann Soll- und Ist-Wert der Temperaturen verarbeitet. Bei einer 
Fussbodenheizung ist es sinnvoll bis zu 2 Stunden Vorlauf zu berechnen. 
Dies mache ich mit einer linearen Regressionsanalyse, hört sich schlimm 
an, ist es aber nicht.

Bei mir läuft noch mehr ab. Ich überwache u.a. auch den Stromverbrauch, 
bzw. die PV-Anlage. Es ist sinnvoll dafür eigene Threads einzusetzen. 
Man sollte auch versuchen objektorientiert zu arbeiten. Gut, dies dürfte 
für den Anfang etwas zu weit gehen. Beim Umsetzen der ersten Schritte 
wird man schon auf genügend Herausforderungen stossen.

mfg Klaus.
#4330045
Lesenswert?

Karl H. schrieb:

> Ventil 1 muss auf 1 geschaltet werden, genau dann wenn .....

Wobei mir gerade auffällt, dass in deiner Ventiltabelle sehr viele 1-er 
stehen.
Da würde ich doch pragmatisch so vorgehen, dass ich eine Ventilstellung 
von 1 als default vorsehe, die ich also in meiner Logiktabelle gar nicht 
erfassen muss. Dort sind nur die Beziehungen vermerkt, die ein anderes 
Ergebnis als 1 erbringen müssen. D.h. bei jedem Durchgang zur Ermittlung 
der notwendigen Ventilposition wird jedes Ventil erst mal als in der 
Stellung 1 notwendig angenommen und nur wenn sich aus der Tabelle eine 
andere notwendige Stellung ergibt, wird diese übernommen.

Das vereinfacht dann auch die Ventil-Abhängigkeits Tabelle. Da bleiben 
dann nur noch recht wenige Zeilen übrig.
OP (Firma: Herr) #4330075
Lesenswert?

>
>   ventilstellungen anhand der Logik-Tabelle ermitteln
>
>   notwendige Pumpen anhand der Ventilstellungen und/oder
> Temperaturwerten
>   ermitteln
>   (kann man ebenfalls mit einer Tabelle erschlagen)
>
>   Ventile schalten
>
>   Pumpen schalten
> wirklich wild. Ein bisschen Hirnschmalz sollte man noch in Hysteresen
> stecken, damit es an Umschaltpunkten nicht zu Ventilflattern kommt.


Sorry für die Nachfrage... Hast du ein Beispiel zum Tabellen einbinden? 
Oder meinst du Array beim Setup anlegen?
Gast #4330076
Lesenswert?

Max M. schrieb:
> habe schon mit ->If else<- angefangen,

Freitag?

Sinnig wäre es erstmal die Spezifikation (was soll aufgrund welcher 
Eingangs-Parameter geschehen) zu erstellen.

In einem 2. Schritt kann man sich dann Gedanken über Programm-Konstrukte 
machen.

Scheint mir aber eher trollig zu sein ...
OP (Firma: Herr) #4330077
Lesenswert?

Karl H. schrieb:
> Karl H. schrieb:
>
>> Ventil 1 muss auf 1 geschaltet werden, genau dann wenn .....
>
> Wobei mir gerade auffällt, dass in deiner Ventiltabelle sehr viele 1-er
> stehen.
> Da würde ich doch pragmatisch so vorgehen, dass ich eine Ventilstellung
> von 1 als default vorsehe, die ich also in meiner Logiktabelle gar nicht
> erfassen muss. Dort sind nur die Beziehungen vermerkt, die ein anderes ue


Schaue ich mal an
#4330123
Lesenswert?

Max M. schrieb:
> Klaus R. schrieb:
>> Max M. schrieb:
>>> Soll der Übersicht dienen... Wollte draus ARRAY bauen :-)
>>
>> Arrays sind immer gut. Ich habe bei mir die Temperaturwerte im 1
>>ast.
>
> Hast du ein Code als Gerüst zum teilen?

Damit wirst Du nichts anfangen können. Generell ist es aber so. Beim 
Start des Programms werden Arrays aus der Datenbank gefüllt die 
Sollwerte beinhalten. Neben Arrays arbeite ich auch mit HashTables.

Der erste wichtige Schritt war das Einführen der Zeitraster. Soll- und 
Ist-Werte werden bei den Temperaturprofilen immer auf ein Minutenraster 
zurückgeführt. Für 24 Stunden kommst Du da auf 1440 Elemente. Die 
Ventile werden im 10 Minutenraster gesteuert. Dafür werden die 
Temperatur-Sollwerte zusammengefasst und in 144 Elemente Arrays 
abgelegt.

Diese Vorgehensweise stammt noch aus den Zeiten der C-Control-II, die 
nicht allzuviel Speicher bot. Später, als dies keine Rolle mehr spielte, 
wurden so Datenbankzugriffe reduziert und es war performanter.

Diese Arrays werden zum Tageswechsel aktualisiert, aber auch bei 
Änderungen der Sollwerte in der Datenbank.

mfg klaus
#4330536
Lesenswert?

Max M. schrieb im Be
>
> Sorry für die Nachfrage... Hast du ein Beispiel zum Tabellen einbinden?
> Oder meinst du Array beim Setup anlegen?

Array initialisieren halt. So wie man das eben macht, wenn man seine 
Programmiersprache wenigstens ein bischen kann.

DeinProblem ist doch programmiertechnisch simpel. Die Schwierigkeit 
liegt in der Organisation.

Aber ich seh schon. Wir bewegen uns wieder auf dem Level "Ichwill zwar 
aber eigentlich kann ich nix". Und ueber die Jahre hab ich die Lust da 
drauf verloren.
#4330538
Lesenswert?

me schrieb:
> no_1 schrieb:
>> nicht mit einem arduino ...
>>
>> cu
>
> Quatschkopp
>
> Mindestens der mit dem 32-bit ARM Prozessor, 512kB Flash und 96kB Ram
> langweilt sich dabei doch zu Tode.

Auch jeder andere Arduino langweilt sich dabei zu Tode.
Das ist alles nur eine Frage der Programmorganisation. Ob das 16 Ventile 
sind oder 80, 6 Pumpen oder 40, spielt für das Programm keine grosse 
Rolle. Das erstellen der Abhängigkeitstabelle, welche die Logik 
beschreibt wird aufwändiger und fehlerträchtiger. Aber für das Programm 
ist das ziemlich wurscht. Das arbeitet einfach nur die Logik ab, wonach 
welches Ventil aufgrund welches benötigten Heizkreises wie zu schalten 
ist. Machr man das ordentlich, dann ist das sogar immer der gleiche 
Code, egal wieviele Ventile und Pumpen vorhanden sind.
Aber mit ein paar if-else ist es natürlich nicht getan.
OP (Firma: Herr) #4330647
Lesenswert?

>
> Aber ich seh schon. Wir bewegen uns wieder auf dem Level "Ichwill zwar
> aber eigentlich kann ich nix". Und ueber die Jahre hab ich die Lust da
> drauf verloren.

Deswegen bin ich auch hier... Um von euch zu lernen! Ich denke wollen 
und durchhalten ist jetzt wichtig um das Projekt fertig zu bekommen und 
um mit anderen zu teilen...

Danke für deine ehrliche Meinung
Gast #4331524
Lesenswert?

Hubert G. schrieb:
> Schon überlegt wie du die 25 Sensoren abfragst?

Das Abfragen der Sensoren wird schon irgendwie klappen. Mir wird noch 
gar nicht klar, wie die Messwerte der 25 Sensoren in die Entscheidung 
für die Steuerung der Ventile/Pumpen eingehen. Irgendwie muss es da 
einen Algorithmus geben, der beschreibt, wie Werte von mehreren 
Temperatursensoren - von Berücksichtigung von Zeitverläufen wollen wir 
erstmal gar nicht sprechen - in eine Ja/Nein Entscheidung für die 
Ventile/Pumpen-Logik eingehen. Sofern ich das bisher verstanden haben, 
handelt es sich doch um Schaltventile und Pumpe Ein/Aus.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren