Forum: Mikrocontroller und Digitale Elektronik Heizungssteuerung mit 25 TempSensoren, 14 Ventilen und 6 Pumpen


von Max M. (Firma: Herr) (maxtox)


Angehängte Dateien:

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!

von no_1 (Gast)


Lesenswert?

nicht mit einem arduino ...

cu

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Soll das so eine Art Verknüpfungstabelle werden ?

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

Jain....

Soll der Übersicht dienen... Wollte draus ARRAY bauen :-)

von Gaast (Gast)


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.

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

Habe paar megas da liegen...

Genau die Verarbeitung macht mir Probleme...

von Karl H. (kbuchegg)


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?

: Bearbeitet durch User
von Dennis H. (c-logic) Benutzerseite


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)?

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

Ok... Schaue ich mir gleich an...

von Max M. (Firma: Herr) (maxtox)


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...

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Klaus R. (klara)


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.

von Swisser (Gast)


Lesenswert?

Arsuino ist super :)

Wie werden die ventile gesteuert? Auf/Zu?

Die pumpen sind wohl von den heizungsgruppen?

von Karl H. (kbuchegg)


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.

von Max M. (Firma: Herr) (maxtox)


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?

von Dieter F. (Gast)


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 ...

von Max M. (Firma: Herr) (maxtox)


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

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

Swisser schrieb:
> Arsuino ist super :)
>
> Wie werden die ventile gesteuert? Auf/Zu?
>
> Die pumpen sind wohl von den heizungsgruppen?

Ventile li/re
Heizungspumpen

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

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?

von Klaus R. (klara)


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

von Max M. (Firma: Herr) (maxtox)


Lesenswert?

Da muss wohl noch Hausaufgaben machen...

von Dieter F. (Gast)


Lesenswert?

Max M. schrieb:
> Da muss wohl noch Hausaufgaben machen...

Ja, sehe ich auch so ... :-)

von me (Gast)


Lesenswert?

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.

von Max M. (Firma: Herr) (maxtox)


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.
Bin ich such der Meinung

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Max M. (Firma: Herr) (maxtox)


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

von Hubert G. (hubertg)


Lesenswert?

Schon überlegt wie du die 25 Sensoren abfragst?

von Wolfgang (Gast)


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.

von Georg (Gast)


Lesenswert?

Wolfgang schrieb:
> Mir wird noch
> gar nicht klar, wie die Messwerte der 25 Sensoren in die Entscheidung
> für die Steuerung der Ventile/Pumpen eingehen

Fuzzy-Logik? Expertensystem? Allerdings, bei einem Arduino müsste man 
wohl alles zu Fuss programmieren.

Georg

von Hubert G. (hubertg)


Lesenswert?

Wolfgang schrieb:
> Das Abfragen der Sensoren wird schon irgendwie klappen.

Die Frage habe ich gestellt, da der Mega2560 mit 16 ADC-Eingänge das 
Maximum ist das ich kenne. Es wird da noch einen Hardwareerweiterung 
notwendig sein.

von F. F. (foldi)


Lesenswert?

Hubert G. schrieb:
> Es wird da noch einen Hardwareerweiterung
> notwendig sein.

Wieso das denn?
DS18B20. Damit kann er seine ganze Stadt an einen Pin hängen und mit 
Arduino braucht er nicht mal groß was programmieren, ist alles schon 
fertig vorhanden.

von Walter S. (avatar)


Lesenswert?

F. F. schrieb:
> DS18B20. Damit kann er seine ganze Stadt an einen Pin hängen

du übertreibst ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.