Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Contrôleur de chauffage multizone

Composants et fournitures

Arduino UNO
Utilisez un Mega si vous devez contrôler plus de 5 zones (y compris la zone supplémentaire pour le reste de votre maison sans chauffage au sol)
× 1
Carte relais Keyes 8 canaux 5 Volts
Vous avez besoin d'une carte avec 4 relais pour contrôler 2 zones au sol (1 pompe, 1 CV, 2 vannes ), Un relais supplémentaire est nécessaire pour chaque zone d'étage supplémentaire
× 1
Petit actionneur thermoélectrique linéaire Honeywell MT8-230-NC (230 V CA )
Ceci n'est qu'un des nombreux actionneurs disponibles ; Vous avez besoin de 1 actionneur (vanne) par étage Groupe d'unités
× 1

À propos de ce projet

J'ai construit cet appareil parce que ma cuisine était soit pour chauffer, soit pour refroidir avec un seul thermostat dans mon salon. Les contrôleurs de chauffage multizones commerciaux (comme EvoHome) sont très chers. Ce programme capture l'intelligence de ces systèmes coûteux, hébergés sur une simple carte Arduino Uno. Cela a complètement résolu mon problème.

Points forts/Caractéristiques :

  • Vous n'avez qu'à configurer l'épinglage et le nombre de zones
  • Un simple Arduino Uno peut contrôler jusqu'à 5 zones d'unité au sol
  • Avec un Arduino Mega, le nombre de zones est presque illimité

Les contrôles de programme fournis :

  • La pompe de l'unité au sol
  • Agrége toutes vos zones en un seul thermostat pour le chauffage central
  • Valves utilisées pour ouvrir/fermer des zones
  • Une minuterie Watch Dog pour assurer un fonctionnement à toute épreuve

Permet un chauffage individuel par zone :

  • Par zone un Thermostat pour détecter la demande de chauffage
  • Par zone un relais pour contrôler une ou plusieurs vannes pour ouvrir/fermer les groupes d'unités au sol de cette zone
  • Une pièce avec plusieurs groupes d'unités d'étage peut être considérée comme une seule zone de chauffage (câbler les vannes parallèlement au relais de zone)
  • Ceci est non seulement plus pratique, mais économise de l'énergie et les pièces ne deviennent plus trop chaudes

Contrôle la pompe de l'unité au sol :

  • En gros, il ne fait fonctionner la pompe qu'en cas de besoin pour le chauffage. Cela vous permet déjà d'économiser 100 à 200 euros d'électricité par an (par rapport à faire fonctionner la même pompe 24h/24 et 7j/7 (80 watts équivaut à 2 kWh par jour =0,50 euro par jour)
  • Active la pompe de l'unité au sol au moins une fois toutes les 36 heures, pendant 8 minutes s'il n'y a pas eu de demande de chauffage (Été)
  • Empêche de faire fonctionner la pompe sans ouvrir les vannes au préalable ; Compte tenu de ces vannes besoin de 3 à 5 minutes

En option, vous pouvez également contrôler le reste de votre maison (pièces sans chauffage au sol) :

  • Ici, vous aurez généralement des boutons de thermostat sur vos radiateurs ; donc seules les pièces froides se réchaufferont
  • Ajoutez simplement un thermostat dans la ou les pièces que vous souhaitez contrôler. Câbler ces thermostats en parallèle sur l'entrée No_Zone

Remarques finales :

Toutes les zones n'ont pas besoin d'être contrôlées; uniquement les zones qui deviennent soit trop chaudes soit trop froides (sinon utiliser les boutons de réglage manuel sur le meuble bas)

J'ai explicitement décidé de ne pas connecter l'appareil à Internet :

  • Cela augmenterait le risque de dysfonctionnement (doit être solide comme un roc)
  • Vous pouvez utiliser des thermostats intelligents pour contrôler votre maison. Ce contrôleur n'offre rien de plus pour s'adapter à distance

Code

  • ProjectCV.ino
  • Appareils.h
ProjectCV.inoC/C++
/* * Régulateur de chauffage d'unité au sol pour plusieurs pièces/zones v1.0 * * Copyright :la licence publique générale GNU version 3 (GPL-3.0) par Eric Kreuwels, 2017 * Crédits :Peter Kreuwels pour avoir défini tous les cas d'utilisation qui devait être pris en compte * * Bien que cette configuration fonctionne déjà depuis plus d'un an pour mon rez-de-chaussée, je ne suis pas responsable d'une erreur dans le code * Elle peut être utilisée comme une bonne base pour vos propres besoins, et devrait être testé avant utilisation * * Points forts/Caractéristiques :* - Vous n'avez qu'à configurer l'épinglage et le nombre de zones * - Un simple Arduino Uno peut contrôler jusqu'à 5 zones d'unité au sol * - Avec un Arduino Mega, le nombre de zones est presque illimité * - Le programme fourni contrôle :* - la pompe de l'unité au sol * - Agrége toutes vos zones en un seul thermostat pour le réchauffeur CV * - Les vannes pour ouvrir/fermer les zones * - Permet un chauffage individuel par zone ; * - Par zone a Thermostat pour détecter la demande de chauffage * - Par zone a Relais pour contrôler une ou plusieurs vannes pour ouvrir/fermer les groupes d'unités au sol de cette zone * - Une pièce avec plusieurs groupes d'unités au sol peut être considérée comme un seul chauffage Zone (Câblez les vannes parallèlement au relais de zone) * - Ceci est non seulement plus pratique, mais permet d'économiser de l'énergie et les pièces ne deviennent plus trop chaudes * - Contrôle la pompe de l'unité au sol * - Elle ne fait fonctionner la pompe que lorsque nécessaire au chauffage. Cela vous permet déjà d'économiser 100 à 200 euros d'électricité par an, * par rapport au fonctionnement de la même pompe 24h/24 et 7j/7 (80 watts équivaut à 2 kWh par jour =0,50 euro par jour) * - Active la pompe de l'unité au sol au moins une fois toutes les 36 heures, pendant 8 minutes s'il n'y a pas eu de demande de chauffage (Eté) * - Empêche de faire fonctionner la pompe sans ouvrir les vannes au préalable; En tenant compte de ces vannes, il faut 3 à 5 minutes * - En option, vous pouvez également contrôler le reste de votre maison (pièces sans chauffage par le sol) * - Ici, vous aurez généralement des boutons de thermostat sur vos radiateurs ; ainsi seules les pièces froides se réchaufferont * - Il suffit d'ajouter un thermostat dans la ou les pièces que vous souhaitez contrôler. Câblez ces thermostats en parallèle à l'entrée No_Zone * - Remarques finales :* - Toutes les zones n'ont pas besoin d'être contrôlées; seules les zones qui deviennent soit trop chaudes soit trop froides avec * les boutons à réglage manuel sur l'unité au sol */#include // pour Watchdog// AVERTISSEMENT :FAST_MODE est à des fins de test/évaluation/débogage ( la boucle s'exécute 50 fois plus vite)// Soyez prudent en utilisant FAST_MODE avec une vraie pompe au sol car elle peut être endommagée avec des vannes fermées// Les vannes ont besoin d'au moins 3 minutes pour s'ouvrir. Dans FAST_MODE le programme n'attend pas assez longtemps avant de démarrer la pompe // #define FAST_MODE // exécution 50 fois plus rapide ; pensez à déconnecter votre vrai CV/Pompe ! // En fonctionnement normal, la boucle s'exécute 10 fois par seconde ; donc 10 comptes/seconde (600 représente environ 1 minute)#define VALVE_TIME 3000L // 5 minutes pour ouvrir/fermer une vanne (sur le site sécurisé; prend généralement 3 à 5 minutes)#ifdef FAST_MODE#define PUMP_MAINTENANCE_TIME 108000L // Pour évaluation , active l'exécution de maintenance de la pompe de l'unité au sol une fois toutes les 4 minutes (horodatage 3 heures)#else#define PUMP_MAINTENANCE_TIME 1300000L // Active l'exécution de la maintenance de la pompe de l'unité au sol une fois toutes les 36 heures. Nécessaire pour maintenir la pompe en marche#endif#define PUMP_ACTIVATION_TIME 5000L // Active la pompe pendant environ 8 minutes (10 secondes en mode test)#define COOLDOWN_TIME 18000L // Lorsque le chauffage est terminé, continuez la circulation de l'eau pendant 30 minutes supplémentaires (40 secondes en test mode) // Cela permet une dissipation supplémentaire de la chaleur dans le sol (prend généralement 15 à 30 minutes)#include "./Devices.h" // vannes, pompes, classes de thermostats (utilisez les constantes définies ci-dessus) struct Zone { Nom de chaîne; Vanne de soupape ; Thermostat thermostat;};/////////////////////////////////////////// ///////// BLOC DE CONFIGURATION // Configurez/réorganisez votre épingle comme vous le souhaitez (C'est mon câblage sur un Arduino Uno); // Remarque :les broches 1 et 2 sont toujours libres d'ajouter une zone supplémentaire#define HEATER_PIN 4 // sortie vers un relais qui est câblé avec l'entrée thermostat de votre système de chauffage#define FU_PUMP_PIN 5 // sortie vers un relais qui commute le Floor Unit Pump#define LIVING_VALVE 7 // Zone 1 :sortie vers un relais qui contrôle la ou les vannes#define KITCHEN_VALVE 6 // Zone 2 :sortie vers un relais qui contrôle la ou les vannes#define DINING_VALVE 3 // Zone 3:sortie vers un relais qui contrôle la (les) vanne(s)#define LIVING_THERMO 8 // Zone 1 ; entrée câblée au thermostat du living#define KITCHEN_THERMO 9 // Zone 2; entrée câblée au thermostat de la cuisine#define DINING_THERMO 11 // Zone 3; entrée câblée au thermostat de la salle à manger#define NO_ZONE_THERMO 10 // En option :thermostats dans les pièces sans chauffage par le sol#define HEATING_LED 12 // Allumé pendant le chauffage, Alterne pendant le refroidissement, est Éteint en mode veille#define INDICATION_LED 13 // Alterne l'allumage LED de la carte pour indiquer les courses de la carte ; peut être facilement retiré pour libérer une broche IO supplémentaire !! // Configurez les zones/pièces de l'unité au sol. Chaque zone/pièce possède un nom, une vanne et un thermostat :#define NR_ZONES 3Zone Zones[NR_ZONES] ={ {"Living Room", Valve(LIVING_VALVE, "Living Valve"), Thermostat(LIVING_THERMO, "Living Thermostat")}, { "Espace cuisine", Vanne(KITCHEN_VALVE,"Vanne de cuisine"), Thermostat(KITCHEN_THERMO,"Thermostat de cuisine")}, {"Salle à manger", Vanne(DINING_VALVE, "Vanne de salle à manger"), Thermostat(DINING_THERMO, "Thermostat de salle à manger" )}};// FIN DU BLOC DE CONFIGURATION /////////////////////////////////////// /////////// Quelques appareils fixes :LED iLED(INDICATION_LED, "Indicateur LED"); // peut être supprimé si vous manquez de IO'sLED hLED(HEATING_LED, "Heating LED");Manipulator CV(HEATER_PIN, "CV Heater");Pump FUPump(FU_PUMP_PIN, "Floor Unit Pump");Thermostat ZonelessThermo(NO_ZONE_THERMO , "Thermostat sans zone"); // Pour le reste de la maison, non lié à l'unité d'étage zonevoid printConfiguration() { Serial.println("------ Board Configuration:---------"); iLED.Print(); hLED.Print(); CV.Imprimer(); FUPump.Print(); ZonelessThermo.Print(); for(int i=0; i 0) { cooldownCount--; } return checkCoolDownNeeded(); } bool checkCoolDownNeeded() { return (cooldownCount> 0); } void Print() { switch(_State) { case idle :Serial.print("idle"); Pause; cas sur :Serial.print("on"); Pause; délai de récupération de la casse :Serial.print("cooldown"); Pause; } }};// L'état global machineState CVState;void setup() { // initialisations Serial.begin(115200); printTimeStamp(); Serial.print(":");#ifdef FAST_MODE Serial.println("Le contrôleur de zone CV a démarré en mode test !\n" " - Le temps de la carte est environ 50 fois plus rapide\n" " - Le cycle de maintenance de la pompe s'exécute toutes les 3 heures au lieu d'une fois par 36 heures");#else Serial.println("Le contrôleur de zone CV a démarré. Horodatages (dd:hh:mm:ss)");#endif Serial.println(" - Format d'horodatage (dd:hh:mm :ss)"); printConfiguration(); wdt_enable(WDTO_1S); // Chien de garde :réinitialiser la carte après une seconde, si aucun "tapoter le chien" n'a été reçu}boucle vide() {#ifdef FAST_MODE delay(2) ; // 50 fois plus rapide pour que les minutes deviennent approximativement des secondes à des fins de débogage ; donc chaque compte de temps de recharge ou d'inactivité est de 0,002 seconde#else delay(100); // Fonctionnement normal :boucle environ 10 fois par seconde ; donc chaque compte de temps de recharge ou d'inactivité est de 0,1 seconde#endif // Utilisez la LED d'indication pour montrer que la carte est active iLED.Alternate(); // une fois par boucle(), la pompe et les vannes doivent s'adapter à leur administration FUPump.Update(); for (int i=0; i rester dans cet état si (FloorPumpingAllowed()) { FUPump.On(); } else { FUPump.Off(); } } else if ( CVState.checkCoolDownNeeded() ) { // Continue dans l'état de refroidissement pour que la pompe continue de fonctionner pendant un certain temps CVState(State::cooldown); } else { // ignore le temps de recharge pour l'unité d'étage, retourne au ralenti CVState(State::idle); }}void coolDownProcessing() { hLED.Alternate(); if (HeatingRequested()) { // renvoie vrai lorsque l'un des thermostats est fermé CVState(State::on); } else { if ( CVState.whileCoolDownNeeded() ) { if (FloorPumpingAllowed()) { FUPump.On(); } else { FUPump.Off(); } } else { CVState(State::idle); } }}void idleProcessing() { if (HeatingRequested()) { // renvoie true lorsque l'un des thermostats est fermé CVState(State::on); } else { // Pendant la période d'inactivité, cette vérification activera la pompe de l'unité au sol pendant 8 minutes toutes les 36 heures pour qu'elle reste opérationnelle if ( FUPump.doMaintenanceRun()) { if (FUPump.IsOff()) { if ( allValvesOpen() ==false ) { // commencer à ouvrir une seule fois printTimeStamp(); Serial.println(" : Démarrer le cycle quotidien de la pompe au sol ; vannes ouvertes : " ); allValvesOn(); } if (FloorPumpingAllowed()) { // cela prend environ 5 minutes après l'activation des vannes (6 secondes en mode test) printTimeStamp(); Serial.println(" : Démarrer le cycle quotidien de la pompe au sol ; démarrer la pompe " ); FUPump.On(); } } } else if (FUPump.IsOn()) { // aucune maintenance nécessaire. Arrêtez donc la pompe si vous exécutez toujours printTimeStamp(); Serial.println(" : Arrêter le cycle quotidien de la pompe au sol ; arrêter la pompe et fermer les vannes" ); FUPump.Off(); allValvesOff(); } }}///////////////////////////////////////////// ////////////////////// Méthodes d'assistance utilisées par les gestionnaires d'État/////////////////// ////////////////////void allValvesOff() { for (int i=0; i
Devices.hC/C++
// Classes d'assistance pour les périphériques IOextern void printTimeStamp(); // défini dans le fichier ino principal// IODevice :classe de base pour tous les périphériques IO ; a besoin de specializationclass IODevice { //vars protected:bool _IsOn; int _Pin ; Chaîne _Name ; //constructeur public :IODevice(int pin, nom de chaîne) { _IsOn =false ; _Pin =broche ; _Nom=nom ; } //méthodes bool virtuel IsOn() =0; // bool virtuel abstrait IsOff() { // valeur par défaut pour tous return !IsOn(); } void DebugPrint() { printTimeStamp(); Serial.print(":"); Imprimer(); } void Print() { Serial.print(_Name); Serial.print(" on pin("); Serial.print(_Pin); if (_IsOn) Serial.println(") =On"); else Serial.println(") =Off"); }};// Thermostat :lit une entrée numérique en ajoutant une classe de surpression de deder Thermostat :public IODevice { //vars private:int _Counter; // utilisé pour empêcher la lecture de la commutation interrompue (dender) // constructeur public :Thermostat(int pin, String name) :IODevice(pin, name) { _Counter =0; pinMode(_Pin, INPUT_PULLUP); } //méthodes bool virtuel IsOn() { if (digitalRead(_Pin) ==HIGH &&_IsOn ==true) // ouvrir le contact alors qu'il est allumé { if( _Counter++> 5) // agir seulement après 5 fois la même lecture { _IsOn =faux ; DebugPrint(); _Compteur =0 ; } } else if (digitalRead(_Pin) ==LOW &&_IsOn ==false) // contact fermé alors qu'il est éteint { if( _Counter++> 5) // n'agit qu'après 5 fois la même lecture { _IsOn =true; DebugPrint(); _Compteur =0 ; } } else { _Counter =0; } return _IsOn; }} ;// Manipulateur :le périphérique de travail le plus basique sur une classe de sortie numérique Manipulateur :public IODevice{ //vars private ://constructor public :Manipulator(int pin, String name) :IODevice(pin, name) { pinMode( _Pin, SORTIE); digitalWrite(_Pin, HAUT); } //méthodes void On() { if (_IsOn ==false) { _IsOn =true; digitalWrite(_Pin, LOW); onSwitch(); } } void Off() { if (_IsOn ==true) { _IsOn =false; digitalWrite(_Pin, HAUT); onSwitch(); } } virtual void onSwitch() { // déclencheur pour les clauses enfants ; changement d'état marche/arrêt DebugPrint(); } bool virtuel IsOn() { return _IsOn; }};// Valve :contrôle les valves thermostatiques sur une sortie numérique. // Ces valves réagissent lentement (3-5 minutes) donc cette classe ajoute cette prise de conscience de transition // loop() doit appeler Update() pour savoir si la valve est complètement ouverte ou ferméeclass Valve :public Manipulator{ private:long transitionCount; //constructor public:Valve(int pin, String name) :Manipulator(pin, name) { transitionCount =0; } bool ValveIsOpen() { return (IsOn() &&(transitionCount>=VALVE_TIME)); // au moins 5 minutes dans l'état activé } // Exécuter une fois par passe dans la boucle de croquis () !!! void Update() { if (IsOn()) { if (transitionCount  0) transitionCount--; } }} ;// Pompe :une pompe doit être activée plusieurs fois par semaine pour les faire fonctionner. // loop() doit appeler Update() pour savoir quand une activation de maintenance est nécessaireclass Pump :public Manipulator{ // les vannes réagissent lentement (3-5 minutes) donc cette classe ajoute cette conscience de transition private:long counter; bool faireMaintenance; //constructor public:Pump(int pin, String name) :Manipulator(pin, name) { counter =0; doMaintenance =false; } bool doMaintenanceRun() { return doMaintenance; } virtual void onSwitch() { // changement d'état on/off Manipulator::onSwitch(); compteur =0 ; } // exécute cette méthode à chaque passage dans la boucle() void Update() { if (IsOn()) { if (counter  250) #else if (counter++> 5) #endif { / / basculer le compteur LED=0; if (IsOn()) Off(); else Activé(); } }} ;

Schémas

Câblage détaillé des périphériques (pompe, vannes, thermostats, LED) Exemple de câblage de plusieurs contrôleurs « en cascade ». Un contrôleur par unité d'étage Une vraie journalisation du Serial Monitor pour comprendre la fonctionnalité. Les horodatages affichent par ex. un délai de 5 minutes entre l'ouverture des vannes et le démarrage effectif de la pompe de l'unité au sol. logexample_fTczkAa0tf.txtInspirationnel

Processus de fabrication

  1. Contrôleur d'alimentation PWM
  2. Système de chauffage solaire
  3. Surveillance de ma chaudière de chauffage central
  4. Entretien d'un laveur de sol
  5. Contrôleur DMX Web
  6. Périphérique d'automatisation des tâches de jeux vidéo
  7. Contrôleur de jeu Arduino
  8. Unopad - Contrôleur MIDI Arduino avec Ableton
  9. Contrôleur d'affichage fluorescent à vide