Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Mehrzonen-Heizungsregler

Komponenten und Verbrauchsmaterialien

Arduino UNO
Verwenden Sie einen Mega, wenn Sie mehr als 5 Zonen steuern müssen (einschließlich der zusätzlichen Zone für den Rest von Ihr Haus ohne Fußbodenheizung)
× 1
Keyes 8-Kanal-5-Volt-Relaisplatine
Sie benötigen eine Platine mit 4 Relais, um 2 Etagenzonen zu steuern (1 Pumpe, 1 CV, 2 Ventile) ), Für jede zusätzliche Etagenzone wird ein zusätzliches Relais benötigt
× 1
Honeywell MT8-230-NC kleiner thermoelektrischer Linearantrieb (230 V AC )
Dies ist nur einer von vielen möglichen verfügbaren Aktuatoren; Sie benötigen 1 Stellantrieb (Ventil) pro Etagengerätegruppe
× 1

Über dieses Projekt

Ich habe dieses Gerät gebaut, weil meine Küche mit einem einzigen Thermostat in meinem Wohnzimmer entweder zu warm oder zu kalt war. Kommerzielle Mehrzonen-Heizungsregler (wie EvoHome) sind sehr teuer. Dieses Programm erfasst die Intelligenz dieser teuren Systeme, die auf einem einfachen Arduino Uno-Board gehostet werden. Dies hat mein Problem vollständig gelöst.

Höhepunkte/Funktionen:

  • Sie müssen nur das Anheften und die Anzahl der Zonen konfigurieren
  • Ein einfacher Arduino Uno kann bis zu 5 Zonen der Bodeneinheit steuern
  • Mit einem Arduino Mega ist die Anzahl der Zonen nahezu unbegrenzt

Die mitgelieferten Programmsteuerungen:

  • Die Standpumpe
  • Gruppiert alle Ihre Zonen als nur ein Thermostat mit der Zentralheizung
  • Ventile zum Öffnen/Schließen von Zonen
  • Ein Watch Dog-Timer für einen grundsoliden Betrieb

Ermöglicht individuelles Heizen pro Zone:

  • Pro Zone ein Thermostat, um die Heizanforderung zu erkennen
  • Pro Zone ein Relais zum Steuern eines oder mehrerer Ventile zum Öffnen/Schließen der Bodeneinheiten-Gruppen dieser Zone
  • Ein Raum mit mehreren Bodengerätegruppen kann als eine Heizzone betrachtet werden (Verdrahten Sie die Ventile parallel zum Zonenrelais)
  • Das ist nicht nur bequemer, sondern spart auch Energie und Räume werden nicht mehr zu warm

Steuert die Pumpe der Standeinheit:

  • Im Grunde läuft die Pumpe nur dann, wenn sie zum Heizen benötigt wird. Dadurch sparen Sie bereits 100-200 Euro Strom pro Jahr (im Vergleich zu einem 24/7 Betrieb derselben Pumpe (80 Watt sind 2kW Stunde pro Tag =0,50 Euro pro Tag)
  • Aktiviert die Standpumpe mindestens einmal alle 36 Stunden, für 8 Minuten, wenn keine Heizanforderung bestand (Sommer)
  • Verhindert, dass die Pumpe läuft, ohne zuerst die Ventile zu öffnen; Unter Berücksichtigung dieser Ventile benötigen Sie 3-5 Minuten

Optional können Sie auch den Rest Ihres Hauses (Räume ohne Fußbodenheizung) steuern:

  • Hier haben Sie normalerweise Thermostatknöpfe an Ihren Heizkörpern; also heizen nur die kalten räume
  • Fügen Sie einfach einen Thermostat in den Räumen hinzu, die Sie steuern möchten. Verdrahten Sie diese Thermostate parallel zum Eingang No_Zone

Abschließende Anmerkungen:

Nicht alle Zonen müssen kontrolliert werden; nur die Zonen, die entweder zu warm werden oder zu kalt bleiben (sonst die manuell einstellbaren Knöpfe am Unterschrank verwenden)

Ich habe mich ausdrücklich entschieden, das Gerät nicht mit dem Internet zu verbinden:

  • Es würde das Risiko von Fehlfunktionen erhöhen (muss felsenfest sein)
  • Sie können Ihr Haus mit intelligenten Thermostaten steuern. Dieser Controller bietet nichts zusätzliches, um es aus der Ferne anzupassen

Code

  • ProjectCV.ino
  • Geräte.h
ProjectCV.inoC/C++
/* * Fußbodenheizungsregler für mehrere Räume/Zonen v1.0 * * Copyright:the GNU General Public License Version 3 (GPL-3.0) von Eric Kreuwels, 2017 * Credits:Peter Kreuwels für die Definition aller Anwendungsfälle das war zu beachten * * Obwohl dieses Setup für mein Erdgeschoss bereits über ein ganzes Jahr läuft, übernehme ich keine Haftung für Fehler im Code * Es kann als gute Grundlage für die eigenen Bedürfnisse verwendet werden und sollte es sein vor der Verwendung getestet * * Highlights/Features:* - Sie müssen nur das Pinning und die Anzahl der Zonen konfigurieren * - Ein einfacher Arduino Uno kann bis zu 5 Floor Unit-Zonen steuern * - Mit einem Arduino Mega ist die Anzahl der Zonen nahezu unbegrenzt * - Das mitgelieferte Programm steuert:* - die Pumpe des Bodengeräts * - Aggregation aller Ihrer Zonen als nur ein Thermostat zum CV-Heizgerät * - Ventile zum Öffnen/Schließen der Zonen * - Ermöglicht individuelles Heizen pro Zone; * - Pro Zone ein Thermostat zum Erfassen der Heizanforderung * - Pro Zone ein Relais zum Steuern eines oder mehrerer Ventile zum Öffnen/Schließen der Bodengerätegruppen dieser Zone * - Ein Raum mit mehreren Bodengerätegruppen kann als eine Heizung betrachtet werden Zone (Verdrahten Sie die Ventile parallel zum Zonenrelais) * - Das ist nicht nur bequemer, sondern spart auch Energie und Räume werden nicht mehr zu warm * - Steuert die Pumpe der Standeinheit * - Sie läuft die Pumpe im Grunde nur dann, wenn zum Heizen benötigt. Dadurch sparen Sie bereits 100-200 Euro Strom pro Jahr, * im Vergleich zum Betrieb der gleichen Pumpe rund um die Uhr (80 Watt sind 2kW Stunde pro Tag =0,50 Euro pro Tag) * - Aktiviert die Standpumpe mindestens alle 36 Stunden, für 8 Minuten, wenn keine Heizanforderung vorliegt (Sommer) * - Verhindert, dass die Pumpe läuft, ohne die Ventile zuerst zu öffnen; Unter Berücksichtigung dieser Ventile benötigen Sie 3-5 Minuten * - Optional können Sie auch den Rest Ihres Hauses (Räume ohne Fußbodenheizung) steuern * - Hier haben Sie normalerweise Thermostatknöpfe an Ihren Heizkörpern; damit nur die kalten Räume aufheizen * - Fügen Sie einfach einen Thermostat in den Räumen hinzu, die Sie steuern möchten. Verdrahten Sie diese Thermostate parallel zum Eingang No_Zone * - Abschließende Hinweise:* - Es müssen nicht alle Zonen gesteuert werden; nur die Zonen, die entweder zu warm werden oder zu kalt bleiben mit * manuell eingestellten Knöpfen an der Bodeneinheit */#include  // für Watchdog// WARNUNG:FAST_MODE ist für Test-/Evaluierungs-/Debugzwecke ( loop läuft 50x schneller) // Seien Sie vorsichtig, wenn Sie FAST_MODE mit einer echten Standpumpe verwenden, da diese bei geschlossenen Ventilen beschädigt werden kann // Ventile benötigen mindestens 3 Minuten zum Öffnen. Im FAST_MODE wartet das Programm nicht lange genug bevor es die Pumpe startet // #define FAST_MODE // 50 mal schnellere Ausführung; Ziehen Sie in Erwägung, Ihre echte CV/Pumpe zu trennen! // Im Normalbetrieb läuft die Schleife 10 Mal pro Sekunde; also 10 Counts/Sekunde (600 entspricht ca. 1 Minute)#define VALVE_TIME 3000L // 5 Minuten zum Öffnen/Schließen eines Ventils (auf der sicheren Seite; dauert normalerweise 3 bis 5 Minuten)#ifdef FAST_MODE#define PUMP_MAINTENANCE_TIME 108000L // Zur Auswertung , aktiviert den Wartungslauf der Bodeneinheitspumpe einmal alle 4 Minuten (Zeitstempel 3 Stunden)#else#define PUMP_MAINTENANCE_TIME 1300000L // Aktiviert den Wartungslauf der Bodeneinheitspumpe einmal alle 36 Stunden. Wird benötigt, um die Pumpe am Laufen zu halten#endif#define PUMP_ACTIVATION_TIME 5000L // Aktiviert die Pumpe für ca. 8 Minuten (10 Sekunden im Testmodus)#define COOLDOWN_TIME 18000L // Wenn das Heizen beendet ist, Wasserzirkulation für weitere 30 Minuten fortsetzen (40 Sekunden im Test .) mode) // Dies ermöglicht eine weitere Ableitung der Wärme in den Boden (dauert normalerweise 15 bis 30 Minuten)#include "./Devices.h" // Ventile, Pumpen, Thermostatklassen (verwenden Sie die oben definierten Konstanten)struct Zone { String name; Ventilventil; Thermostat Thermostat;};/////////////////////////////////////////// ///////// KONFIGURATIONSBLOCK // Konfigurieren / neu anordnen Sie Ihre Pinning, wie Sie möchten (Dies meine Verkabelung auf einem Arduino Uno); // Hinweis:Pins 1 und 2 sind noch frei, um eine zusätzliche Zone hinzuzufügen#define HEATER_PIN 4 // Ausgang zu einem Relais, das mit dem Thermostateingang Ihres Heizsystems verdrahtet ist#define FU_PUMP_PIN 5 // Ausgang zu einem Relais, das die . schaltet Standgerätpumpe#define LIVING_VALVE 7 // Zone 1:Ausgang an ein Relais, das die Ventile steuert#define KITCHEN_VALVE 6 // Zone 2:Ausgang an ein Relais, das die Ventile steuert#define DINING_VALVE 3 // Zone 3:Ausgabe an ein Relais, das die Ventile steuert#define LIVING_THERMO 8 // Zone 1; Eingang verdrahtet mit dem Thermostat im Living#define KITCHEN_THERMO 9 // Zone 2; Eingang zum Thermostat in der Küche verdrahtet#define DINING_THERMO 11 // Zone 3; Eingang mit dem Thermostat im Speisesaal verdrahtet#define NO_ZONE_THERMO 10 // Optional:Thermostate in Räumen ohne Fußbodenheizung#define HEATING_LED 12 // An beim Heizen, Abwechselnd beim Abkühlen, ist Aus im Ruhezustand#define INDICATION_LED 13 // Abwechselnd an Platinen-LED zur Anzeige von Platinenläufen; kann leicht entfernt werden, um einen zusätzlichen IO-Pin freizugeben!! // Konfigurieren Sie die Zonen/Räume der Bodeneinheit. Jede Zone/jeder Raum besitzt einen Namen, ein Ventil und einen Thermostat:#define NR_ZONES 3Zone Zones[NR_ZONES] ={ {"Wohnzimmer", Valve(LIVING_VALVE, "Living Valve"), Thermostat(LIVING_THERMO, "Living Thermostat")}, { "Küchenbereich", Ventil(KITCHEN_VALVE,"Küchenventil"), Thermostat(KITCHEN_THERMO,"Küchenthermostat")}, {"Esszimmer", Ventil(DINING_VALVE, "Esszimmerventil"), Thermostat(DINING_THERMO, "Esszimmerthermostat" )}};// KONFIGURATIONSBLOCK ENDE //////////////////////////////////////// /////////// Einige feste Geräte:LED iLED(INDICATION_LED, "Anzeige LED"); // kann entfernt werden, wenn die IOs ausgehenLED hLED(HEATING_LED, "Heating LED");Manipulator CV(HEATER_PIN, "CV Heater");Pumpe FUPump(FU_PUMP_PIN, "Floor Unit Pump");Thermostat ZonelessThermo(NO_ZONE_THERMO , "Zonenloser Thermostat"); // Für den Rest des Hauses, kein Bezug zur Bodeneinheit zonevoid printConfiguration() { Serial.println("------ Board Configuration:---------"); iLED.Print(); hLED.Print(); Lebenslauf.Druck(); FUPump.Print(); ZonelessThermo.Print(); for(int i=0; i 0) { cooldownCount--; } checkCoolDownNeeded() zurückgeben; } bool checkCoolDownNeeded () { zurück (cooldownCount> 0); aufrechtzuerhalten. Void Print () { switch (_State) { Fall im Leerlauf:Serial.print ( "idle"); brechen; Fall ein:Serial.print ("ein"); brechen; Fallabklingzeit:Serial.print ("Abkühlung"); brechen; } }}; // Die globale ZustandsmaschineState CVState;void setup () { // Initialisierungen Serial.begin (115200); printTimeStamp(); Serial.print(":");#ifdef FAST_MODE Serial.println("CV Zone Controller im Testmodus gestartet!\n" " - Boardzeit läuft ca. 50 mal schneller\n" " - Pumpenwartungszyklus läuft alle 3 Stunden statt einmal pro 36 Stunden");#else Serial.println("CV Zone Controller gestartet. Zeitstempel (dd:hh:mm:ss)");#endif Serial.println(" - Zeitstempelformat (dd:hh:mm:ss)"); printConfiguration(); wdt_enable(WDTO_1S); // Watchdog:Board nach einer Sekunde zurücksetzen, wenn kein "pat the dog" empfangen wurde}void loop() {#ifdef FAST_MODE delay(2); // 50-mal schneller, sodass aus Minuten für Debugging-Zwecke ungefähr Sekunden werden; jeder Zähler für Cooldown oder Idle ist also 0,002 Sekunden#else delay(100); // Normalbetrieb:Schleift ca. 10 Mal pro Sekunde; also jeder Zähler für Abkühlen oder Leerlauf ist 0,1 Sekunden#endif // Verwenden Sie die Anzeige-LED, um anzuzeigen, dass das Board am Leben ist iLED.Alternate(); // einmal pro Schleife () müssen die Pumpe und die Ventile ihre Verwaltung aktualisieren FUPump.Update (); for (int i=0; i in diesem Zustand bleiben if (FloorPumpingAllowed()) { FUPump.On(); aufrechtzuerhalten. Sonst { FUPump.Off(); } } else if ( CVState.checkCoolDownNeeded() ) { // Im Abkühlzustand fortfahren, um die Pumpe eine Weile am Laufen zu halten CVState(State::cooldown); } else { // Cooldown für Bodeneinheit überspringen, zurück zum Leerlauf CVState(State::idle); }}void coolDownProcessing() { hLED.Alternate(); if (HeatingRequested()) {// gibt true zurück, wenn einer der Thermostate geschlossen ist CVState(State::on); } else { if (CVState.whileCoolDownNeeded()) { if (FloorPumpingAllowed()) { FUPump.On(); aufrechtzuerhalten. Sonst { FUPump.Off(); } } else { CVState(State::idle); } }}void emptyProcessing() { if (HeatingRequested()) { // gibt true zurück, wenn einer der Thermostate geschlossen ist CVState(State::on); } else { // Während der Leerlaufzeit aktiviert diese Prüfung die Standgerätepumpe für 8 Minuten alle 36 Stunden, um sie betriebsbereit zu halten if ( FUPump.doMaintenanceRun()) { if (FUPump.IsOff()) { if ( allValvesOpen() ==false ) { // Öffnen nur einmal starten printTimeStamp(); Serial.println(:Täglichen Zyklus für Standpumpe starten; Ventile öffnen:"); allVentileOn(); } if (FloorPumpingAllowed()) {// dies dauert ca. 5 Minuten nach dem Aktivieren der Ventile (6 Sekunden im Testmodus) printTimeStamp(); Serial.println (:Täglichen Zyklus für Standpumpe starten; Pumpe starten "); FUPump.On(); } } } else if (FUPump.IsOn()) { // keine Wartung erforderlich. Stoppen Sie also die Pumpe, wenn printTimeStamp() noch läuft; Serial.println (:Stoppen Sie den täglichen Zyklus für die Pumpe der Standeinheit; stoppen Sie die Pumpe und schließen Sie die Ventile"); FUPump.Off(); allValvesOff(); } }}///////////////////////////////////////////// /////////////////////// Hilfsmethoden, die von den State-Handlern verwendet werden //////////////////// /////////////////////void allValvesOff() { for (int i=0; i 
Geräte.hC/C++
// Hilfsklassen für IO-Geräteextern void printTimeStamp(); // in der Haupt-Ino-Datei definiert// IODevice:Basisklasse für alle IO-Geräte; benötigt Spezialisierungsklasse IODevice { //vars protected:bool _IsOn; int _Pin; Zeichenfolge _Name; // Konstruktor öffentlich:IODevice (int pin, String name) { _IsOn =false; _Pin =Stift; _Name=Name; } //Methoden virtual bool IsOn() =0; // abstrakte virtuelle bool IsOff() { // Standard für alle return !IsOn(); aufrechtzuerhalten. Void DebugPrint () { printTimeStamp (); Serial.print (:"); Drucken(); aufrechtzuerhalten. Void Print () {Serial.print (_Name); Serial.print (" auf Pin ("); Serial.print (_Pin); if (_IsOn) Serial.println (") =On"); sonst Serial.println (") =Aus"); }}; // Thermostat:liest einen digitalen Eingang und fügt eine Dender-Unterdrückungsklasse hinzu Thermostat:public IODevice { //vars private:int _Counter; // verwendet, um das Lesen von unterbrochenem Schalten (Dender) zu verhindern // Konstruktor öffentlich:Thermostat (int pin, String name):IODevice (pin, name) {_Counter =0; pinMode(_Pin, INPUT_PULLUP); aufrechtzuerhalten. _IsOn =falsch; DebugPrint(); _Zähler =0; aufrechtzuerhalten. aufrechtzuerhalten. Sonst if (digitalRead (_Pin) ==LOW &&_IsOn ==false) // geschlossener Kontakt im ausgeschalteten Zustand { if ( _Counter++> 5) // erst nach 5-maligem gleichem Auslesen handeln { _IsOn =true; DebugPrint(); _Zähler =0; }} sonst {_Counter =0; } return _IsOn; }}; // Manipulator:das grundlegendste Arbeitsgerät einer digitalen Ausgabeklasse Manipulator:public IODevice{ //vars private://constructor public:Manipulator(int pin, String name) :IODevice(pin, name) { pinMode( _Pin, AUSGANG); digitalWrite (_Pin, HIGH); } //Methoden void On() { if (_IsOn ==false) { _IsOn =true; digitalWrite (_Pin, LOW); onSwitch(); aufrechtzuerhalten.}} void Off() { if (_IsOn ==true) {_IsOn =false; digitalWrite (_Pin, HIGH); onSwitch(); } } virtual void onSwitch () {// Trigger für untergeordnete Klassen; Wechsel im Ein/Aus-Zustand DebugPrint(); } virtual bool IsOn () { return _IsOn; }};// Valve:steuert die Thermostatventile an einem digitalen Ausgang. // Diese Ventile reagieren langsam (3-5 Minuten), daher fügt diese Klasse diese Transition-Awareness hinzu // loop() muss Update() aufrufen, um zu verfolgen, ob das Ventil vollständig geöffnet oder geschlossen istclass Valve :public Manipulator{ private:long transitionCount; // Konstruktor öffentlich:Valve (int pin, String name):Manipulator (pin, name) { TransitionCount =0; } bool ValveIsOpen() { return (IsOn() &&(transitionCount>=VALVE_TIME)); // mindestens 5 Minuten im eingeschalteten Zustand } // Einmal pro Durchgang in der Sketch-Schleife ausführen() !!! void Update() { if (IsOn()) { if (transitionCount  0) ÜbergangsZähler--; } }}; // Pumpe:Eine Pumpe muss mehrmals pro Woche aktiviert werden, um sie am Laufen zu halten. // loop() muss Update() aufrufen, um zu verfolgen, wenn eine Wartungsaktivierung erforderlich istclass Pump :public Manipulator{ // Ventile reagieren langsam (3-5 Minuten), damit diese Klasse diese Transition Awareness hinzufügt private:long counter; bool doMaintenance; // Konstruktor öffentlich:Pump (int pin, String name):Manipulator (pin, name) { counter =0; doMaintenance =false; } bool doMaintenanceRun() { return doMaintenance; } virtual void onSwitch () {// Änderung des Ein-/Aus-Zustands Manipulator::onSwitch (); Zähler =0; } // diese Methode bei jedem Durchlauf in loop() ausführen void Update() { if (IsOn()) { if (counter  250) #else if (counter++> 5) #endif {/ / LED-Zähler umschalten=0; if (IsOn()) Off(); sonst Ein(); } }};

Schaltpläne

Detaillierte Verdrahtung der Periferen (Pumpe, Ventile, Thermostate, LEDs) Beispiel für die Verdrahtung mehrerer 'kaskadierter' Steuerungen. Ein Controller pro Bodengerät Einige echte Protokollierung des Serial Monitors, um die Funktionsweise zu verstehen. Die Zeitstempel zeigen z.B. eine Verzögerung von 5 Minuten zwischen dem Öffnen der Ventile und dem tatsächlichen Starten der Standpumpe. logexample_fTczkAa0tf.txtInspirierend

Herstellungsprozess

  1. PWM Power Controller
  2. Solarheizung
  3. Überwachung meines Zentralheizungskessels
  4. Wartung einer Bodenreinigungsmaschine
  5. Webbetriebener DMX-Controller
  6. Gerät zur Automatisierung von Videospielaufgaben
  7. Arduino-Gamecontroller
  8. Unopad - Arduino MIDI-Controller mit Ableton
  9. Vakuum-Fluoreszenz-Display-Controller
  10. Verbinden Sie Ihre Zentralheizung mit Arduino