Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Multi-zone verwarmingsregelaar

Componenten en benodigdheden

Arduino UNO
Gebruik een Mega als je meer dan 5 zones moet besturen (inclusief de extra zone voor de rest van uw huis zonder vloerverwarming)
× 1
Sleutels 8-kanaals 5Volt relaiskaart
Je hebt een bord met 4 relais nodig om 2 vloerzones te regelen (1 pomp, 1 CV, 2 kleppen ), Er is één extra relais nodig voor elke extra verdiepingszone
× 1
Honeywell MT8-230-NC Kleine lineaire thermo-elektrische actuator (230v AC )
Dit is slechts een van de vele mogelijke actuatoren die beschikbaar zijn; Je hebt 1 aandrijving (ventiel) per verdieping nodig Unitgroep
× 1

Over dit project

Ik heb dit apparaat gebouwd omdat mijn keuken te warm of te koud was met een enkele thermostaat in mijn woonkamer. Commerciële Multi-Zone Verwarmingsregelaars (zoals EvoHome) zijn erg duur. Dit programma legt de intelligentie van deze dure systemen vast, gehost op een eenvoudig Arduino Uno-bord. Dit heeft mijn probleem volledig opgelost.

Hoogtepunten/kenmerken:

  • U hoeft alleen de pinning en het aantal zones te configureren
  • Een eenvoudige Arduino Uno kan tot 5 zones van de vloereenheid besturen
  • Met een Arduino Mega is het aantal zones bijna onbeperkt

De meegeleverde programmabedieningen:

  • De pomp van de vloerunit
  • Verenigt al uw zones als slechts één thermostaat voor de centrale verwarming
  • Kleppen gebruikt om zones te openen/sluiten
  • Een Watch Dog-timer om een ​​solide werking te garanderen

Staat individuele verwarming per zone toe:

  • Per zone een thermostaat om de verwarmingsvraag te detecteren
  • Per zone een relais om een ​​of meer kleppen te besturen om de groepen van de vloerunits van die zone te openen/sluiten
  • Een ruimte met meerdere groepen etage-units kan worden beschouwd als één verwarmingszone (bedraad de kleppen parallel aan het zonerelais)
  • Dit is niet alleen handiger, maar bespaart ook energie en kamers worden niet meer te warm

Regelt de pomp van de vloerunit:

  • Het laat de pomp in principe alleen draaien als dat nodig is voor verwarming. Dit bespaart u al 100-200 Euro elektriciteit per jaar (vergeleken met dezelfde pomp 24/7 draaien (80 Watt is 2kW uur per dag =0,50 Euro per dag)
  • Activeert de pomp van de vloerunit minstens één keer per 36 uur, gedurende 8 minuten als er geen verwarmingsverzoek was (zomer)
  • Voorkomt dat de pomp draait zonder eerst de kleppen te openen; Rekening houdend met deze kleppen hebben 3-5 minuten nodig

Optioneel kunt u ook de rest van uw huis (kamers zonder vloerverwarming) regelen:

  • Hier heb je meestal thermostaatknoppen op je radiatoren; dus alleen de kamers die koud zijn zullen opwarmen
  • Voeg gewoon een thermostaat toe aan de kamer(s) die je wilt bedienen. Sluit deze thermostaten parallel aan op de No_Zone-ingang

Laatste opmerkingen:

Niet alle zones hoeven aangestuurd te worden; alleen de zones die te warm of te koud worden (gebruik anders de handmatig verstelbare knoppen op de onderkast)

Ik heb expliciet besloten om het apparaat niet met internet te verbinden:

  • Het zou het risico op slecht functioneren vergroten (moet ijzersterk zijn)
  • Je kunt slimme thermostaten gebruiken om je huis te bedienen. Deze controller biedt niets extra's om op afstand aan te passen

Code

  • ProjectCV.ino
  • Apparaten.h
ProjectCV.inoC/C++
/* * Vloerverwarmingsregelaar voor meerdere kamers/zones v1.0 * * Copyright:de GNU General Public License versie 3 (GPL-3.0) door Eric Kreuwels, 2017 * Credits:Peter Kreuwels voor het definiëren van alle use-cases dat moest worden overwogen * * Hoewel deze setup al meer dan een volledig jaar draait voor mijn begane grond, ben ik niet aansprakelijk voor fouten in de code * Het kan worden gebruikt als een goede basis voor uw eigen behoeften, en zou moeten worden getest voor gebruik * * Hoogtepunten/kenmerken:* - U hoeft alleen de pinning en het aantal zones te configureren * - Een eenvoudige Arduino Uno kan tot 5 Floor Unit-zones bedienen * - Met een Arduino Mega is het aantal zones bijna onbeperkt * - De meegeleverde programmabesturingen:* - de pomp van de vloerunit * - Voegt al uw zones samen als één thermostaat aan de CV-verwarmer * - Kleppen om zones te openen/sluiten * - Maakt individuele verwarming per zone mogelijk; * - Per zone een Thermostaat om de vraag naar verwarming te detecteren * - Per zone a Relais om een ​​of meer kleppen aan te sturen om de Verdiepingsgroepen van die zone te openen/sluiten * - Een ruimte met meerdere groepen van vloertoestellen kan als één verwarming worden beschouwd Zone (Bedraad de kleppen parallel aan het zonerelais) * - Dit is niet alleen handiger, maar bespaart ook energie en kamers worden niet meer te warm * - Regelt de pomp van de vloerunit * - Het laat de pomp in principe alleen draaien wanneer nodig voor verwarming. Dit bespaart u al 100-200 Euro elektriciteit per jaar, * in vergelijking met het 24/7 draaien van dezelfde pomp (80 Watt is 2kW Uur per dag =0,50 Euro per dag) * - Activeert de pomp van de vloerunit minimaal één keer per 36 uur, gedurende 8 minuten als er geen verwarmingsverzoek is (zomer) * - Voorkomt dat de pomp draait zonder eerst de kleppen te openen; Rekening houdend met deze kranen duurt 3-5 minuten * - Optioneel kunt u ook de rest van uw huis (kamers zonder vloerverwarming) bedienen * - Hier heeft u meestal thermostaatknoppen op uw radiatoren; dus alleen de kamers die koud zijn zullen opwarmen * - Voeg gewoon een thermostaat toe in de kamer(s) die je wilt regelen. Sluit deze thermostaten parallel aan op de No_Zone-ingang * - Laatste opmerkingen:* - Niet alle zones hoeven te worden geregeld; alleen de zones die ofwel te warm worden ofwel te koud blijven met * handmatig afgestelde knoppen op de vloerunit */#include  // for Watchdog// WAARSCHUWING:FAST_MODE is voor test-/evaluatie-/debug-doeleinden ( lus loopt 50x sneller)// Wees voorzichtig bij het gebruik van FAST_MODE met een echte pomp voor vloerunits, aangezien deze beschadigd kan raken met gesloten kleppen// Kleppen hebben minimaal 3 minuten nodig om te openen. In FAST_MODE wacht het programma niet lang genoeg voordat de pomp wordt gestart// #define FAST_MODE // 50 keer snellere uitvoering; overweeg om uw echte CV/Pomp los te koppelen!// Bij normaal bedrijf loopt de lus 10 keer per seconde; dus 10 tellen/seconde (600 staat voor ongeveer 1 minuut)#define VALVE_TIME 3000L // 5 minuten om een ​​klep te openen/sluiten (op de veilige plaats; duurt meestal 3 tot 5 minuten)#ifdef FAST_MODE#define PUMP_MAINTENANCE_TIME 108000L // Voor evaluatie , activeert de onderhoudsbeurt van de pomp van de vloerunit eenmaal per 4 minuten (tijdstempel 3 uur)#else#define PUMP_MAINTENANCE_TIME 1300000L // Activeert de onderhoudsbeurt van de pomp van de vloerunit eenmaal per 36 uur. Nodig om de pomp te laten werken#endif#define PUMP_ACTIVATION_TIME 5000L // Activeert de pomp gedurende ca. 8 minuten (10 seconden in testmodus)#define COOLDOWN_TIME 18000L // Als de verwarming klaar is, zet u de watercirculatie nog 30 minuten voort (40 seconden in testmodus) mode) // Hierdoor kan de warmte verder naar de vloer worden afgevoerd (duurt doorgaans 15 tot 30 minuten)#inclusief "./Devices.h" // kleppen, pompen, thermostaatklassen (gebruik de constanten die hierboven zijn gedefinieerd)struct Zone { Stringnaam; Ventiel ventiel; Thermostaat thermostaat;};///////////////////////////////////////////// ///////// CONFIGURATIEBLOK // Configureer / herschik uw pinning zoals u wilt (dit is mijn bedrading op een Arduino Uno); // Opmerking:pinnen 1 en 2 zijn nog steeds vrij om een ​​extra zone toe te voegen#define HEATER_PIN 4 // uitgang naar een relais dat is aangesloten op de thermostaatingang van uw verwarmingssysteem#define FU_PUMP_PIN 5 // uitgang naar een relais dat de Pomp vloerunit#define LIVING_VALVE 7 // Zone 1:uitgang naar een relais dat de klep(pen) bestuurt#define KITCHEN_VALVE 6 // Zone 2:uitgang naar een relais dat de klep(pen) bestuurt#define DINING_VALVE 3 // Zone 3:uitgang naar een relais dat de klep(pen) bestuurt #define LIVING_THERMO 8 // Zone 1; ingang bedraad naar de thermostaat in de woonkamer#define KITCHEN_THERMO 9 // Zone 2; ingang bedraad naar de thermostaat in de keuken#define DINING_THERMO 11 // Zone 3; ingang bedraad naar de thermostaat in de eetkamer#define NO_ZONE_THERMO 10 // Optioneel:thermostaten in kamers zonder vloerverwarming#define HEATING_LED 12 // Aan bij verwarming, Wisselend tijdens afkoelen, is Uit in ruststand#define INDICATION_LED 13 // Wisselt de aan board-LED om boardruns aan te geven; kan eenvoudig worden verwijderd om een ​​extra IO-pin vrij te maken!!// Configureer de Zones/kamers van de Floor Unit. Elke zone/kamer heeft een naam, klep en thermostaat:#define NR_ZONES 3Zone Zones[NR_ZONES] ={ {"Living Room", Valve(LIVING_VALVE, "Living Valve"), Thermostat(LIVING_THERMO, "Living Thermostat")}, { "Keukengebied", Klep(KITCHEN_VALVE,"Keukenklep"), Thermostaat(KITCHEN_THERMO,"Keukenthermostaat")}, {"Eetkamer", Klep(DINING_VALVE, "Eetkamerklep"), Thermostaat(DINING_THERMO, "Eetkamerthermostaat" )}};// EINDE CONFIGURATIEBLOK ///////////////////////////////////////// /////////// Sommige vaste apparaten:LED iLED (INDICATION_LED, "Indicator LED"); // kan worden verwijderd als de IO'sLED hLED (HEATING_LED, "Heating LED"); Manipulator CV (HEATER_PIN, "CV Heater"); Pump FUPump (FU_PUMP_PIN, "Floor Unit Pump"); Thermostaat ZonelessThermo (NO_ZONE_THERMO) op is , "Zoneloze thermostaat"); // Voor de rest van het huis, geen verband met de vloereenheid zonevoid printConfiguration() { Serial.println("------ Board Configuration:---------"); iLED.Print(); hLED.Print(); CV.Afdrukken(); FUPump.Print(); ZonelozeThermo.Print(); for(int i=0; i 0) { cooldownCount--; } retourneer checkCoolDownNeeded(); } bool checkCoolDownNeeded() { return (cooldownCount> 0); } void Print() { switch(_State) { case idle:Serial.print("idle"); pauze; geval aan:Serial.print("aan"); pauze; case cooldown:Serial.print("cooldown"); pauze; } }};// The global state machineState CVState;void setup() {// initialisaties Serial.begin(115200); printTimeStamp(); Serial.print(":");#ifdef FAST_MODE Serial.println("CV Zone Controller gestart in TestMode!\n" " - Board-tijd loopt ongeveer 50 keer sneller\n" " - Pomponderhoudscyclus wordt altijd 3 uur uitgevoerd in plaats van eenmaal per 36 uur");#else Serial.println("CV Zone Controller gestart. Tijdstempels (dd:uu:mm:ss)");#endif Serial.println(" - Tijdstempelformaat (dd:uu:mm:ss)"); printConfiguration(); wdt_enable(WDTO_1S); // Waakhond:reset bord na één seconde, als er geen "aai de hond" is ontvangen} ongeldige lus () {#ifdef FAST_MODE vertraging (2); // 50 keer sneller, dus minuten worden ruwweg seconden voor foutopsporingsdoeleinden; dus elke telling voor cooldown of inactiviteit is 0,002 seconde #else delay(100); // Normale werking:lussen ongeveer 10 keer per seconde; dus elke telling voor afkoeling of inactiviteit is 0,1 seconde#endif // Gebruik indicatie-LED om aan te geven dat het bord in leven is iLED.Alternate(); // eenmaal per lus() moeten de pomp en kleppen hun administratie FUPump.Update(); for (int i=0; i blijf in deze toestand if (FloorPumpingAllowed()) { FUPump.On(); } else { FUPump.Off(); } } else if ( CVState.checkCoolDownNeeded () ) { // Ga door in afkoelstatus om de pomp een tijdje te laten draaien CVState (State::cooldown); } else { // skip cooldown voor vloereenheid, ga terug naar inactief CVState (State::idle); }}void coolDownProcessing() { hLED.Alternate(); if (HeatingRequested()) { // geeft true terug wanneer een van de thermostaten gesloten is CVState(State::on); } else { if ( CVState.whileCoolDownNeeded() ) {if (FloorPumpingAllowed()) { FUPump.On(); } else { FUPump.Off(); } } else { CVState(State::idle); } }}void idleProcessing() { if (HeatingRequested()) { // geeft true terug wanneer een van de thermostaten gesloten is CVState(State::on); } else { // Tijdens inactiviteit activeert deze controle de pomp van de vloerunit gedurende 8 minuten per 36 uur om ze operationeel te houden if ( FUPump.doMaintenanceRun()) { if (FUPump.IsOff()) { if ( allValvesOpen() ==false ) { // begin maar één keer te openen printTimeStamp(); Serial.println(":Start dagelijkse cyclus voor vloerunitpomp; open kleppen:"); allVallvesOn(); } if (FloorPumpingAllowed()) { // dit duurt ongeveer 5 minuten na het activeren van de kleppen (6 seconden in testmodus) printTimeStamp(); Serial.println(":Start de dagelijkse cyclus voor de pomp van de vloerunit; start de pomp "); FUPump.Aan(); } } } else if (FUPump.IsOn()) { // geen onderhoud nodig. Dus stop de pomp als printTimeStamp() nog steeds actief is; Serial.println(":Stop de dagelijkse cyclus voor de pomp van de vloerunit; stop de pomp en sluit de kleppen"); FUPpomp.Uit(); allVallvesOff(); } }}/////////////////////////////////////////////// /////////////////////// Hulpmethoden gebruikt door de staatsbehandelaars//////////////////// /////////////////////void allValvesOff() { for (int i=0; i 
Apparaten.hC/C++
// Helperklassen voor IO devicesextern void printTimeStamp(); // gedefinieerd in hoofd ino-bestand// IODevice:basisklasse voor alle IO-apparaten; heeft specialisatieklasse IODevice nodig { //vars protected:bool _IsOn; int _Pin; Tekenreeks _Naam; // constructor public:IODevice (int pin, String naam) { _IsOn =false; _Pin =pin; _Naam=naam; } // methoden virtuele bool IsOn () =0; // abstracte virtuele bool IsOff() {// standaard voor alle return !IsOn(); } void DebugPrint() { printTimeStamp(); Serieel.print(":"); Afdrukken(); } void Print() { Serial.print(_Name); Serial.print(" op pin("); Serial.print(_Pin); if (_IsOn) Serial.println(") =Aan"); else Serial.println(") =Uit"); }};// Thermostaat:leest een digitale ingang en voegt wat dender-onderdrukkingsklasse toe Thermostaat:openbaar IODevice {//vars privé:int _Counter; // gebruikt om het lezen van onderbroken schakelen (dender) te voorkomen // constructor public:Thermostat (int pin, String name) :IODevice (pin, name) { _Counter =0; pinMode(_Pin, INPUT_PULLUP); } // methoden virtual bool IsOn() {if (digitalRead(_Pin) ==HIGH &&_IsOn ==true) // open contact terwijl aan { if(_Counter++> 5) // handel pas na 5 keer dezelfde uitlezing { _IsOn =onwaar; DebugPrint(); _Teller =0; } } else if (digitalRead(_Pin) ==LAAG &&_IsOn ==false) // contact gesloten terwijl uit {if( _Counter++> 5) // pas handelen na 5 keer dezelfde uitlezing { _IsOn =true; DebugPrint(); _Teller =0; } } else { _Teller =0; } terugkeer _IsOn; }};// Manipulator:het meest elementaire werkende apparaat op een digitale outputklasse Manipulator:public IODevice { //vars private://constructor public:Manipulator (int pin, String name) :IODevice (pin, name) { pinMode ( _Pin, UITGANG); digitalWrite(_Pin, HOOG); } // methoden void On () { if (_IsOn ==false) { _IsOn =true; digitalWrite(_Pin, LAAG); onSwitch(); } } void Off() { if (_IsOn ==true) { _IsOn =false; digitalWrite(_Pin, HOOG); onSwitch(); } } virtual void onSwitch() { // trigger voor onderliggende claases; verandering in aan/uit-status DebugPrint(); } virtuele bool IsOn() { return _IsOn; }};// Klep:regelt themostatische kleppen op een digitale uitgang. // Deze kleppen reageren traag (3-5 minuten) dus deze klasse voegt dit overgangsbewustzijn toe// loop() moet Update() aanroepen om bij te houden of de klep volledig open of gesloten is. Valve :public Manipulator{ private:long transitionCount; // constructor public:Valve (int-pin, String-naam):Manipulator (pin, naam) {transitionCount =0; } bool ValveIsOpen() { return (IsOn() &&(transitionCount>=VALVE_TIME)); // ten minste 5 minuten in staat } // Eén keer per keer uitvoeren in de schetsloop() !!! void Update () {if (IsOn()) {if (transitionCount  0) transitionCount--; } }};// Pomp:een pomp moet meerdere keren per week worden geactiveerd om ze draaiende te houden. // loop() moet Update() aanroepen om bij te houden wanneer een onderhoudsactivering nodig is class Pump :public Manipulator{ // kleppen reageren langzaam (3-5 minuten) dus deze class voegt dit transitiebewustzijn toe private:long counter; bool doOnderhoud; // constructor public:Pump (int-pin, String-naam):Manipulator (pin, naam) {counter =0; doMaintenance =onwaar; } bool doMaintenanceRun() { return doMaintenance; } virtual void onSwitch() { // verandering in aan/uit status Manipulator::onSwitch(); teller =0; } // voer deze methode elke keer uit in loop () void Update () { if (IsOn ()) { if (counter  250) #else if (counter++> 5) #endif { / / schakel LED-teller =0; if (IsOn()) Uit(); anders Aan(); } }};

Schema's

Gedetailleerde bedrading van randapparatuur (pomp, kleppen, thermostaten, LED's) Voorbeeld van bedrading van meerdere 'gecascadeerde' controllers. Eén controller per verdiepingseenheid Enkele echte logging van de seriële monitor om de functionaliteit te begrijpen. De tijdstempels tonen b.v. een vertraging van 5 minuten tussen het openen van de kleppen en het daadwerkelijk starten van de pomp van de vloerunit. logexample_fTczkAa0tf.txtInspirerend

Productieproces

  1. PWM-vermogenscontroller
  2. Zonne-verwarmingssysteem
  3. Mijn cv-ketel bewaken
  4. Een vloerschrobmachine onderhouden
  5. Web-gestuurde DMX-controller
  6. Automatiseringsapparaat voor videogametaken
  7. Arduino-gamecontroller
  8. Unopad - Arduino MIDI-controller met Ableton
  9. Vacuüm TL-beeldschermcontroller
  10. Sluit uw centrale verwarming aan op Arduino
  11. Arduino Home Controller geactiveerd door Alexa