亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

多区加热控制器

组件和用品

Arduino UNO
如果您需要控制超过 5 个区域(包括其余部分的额外区域),请使用 Mega你的房子没有地暖)
× 1
Keyes 8 通道 5Volt 继电器板
您需要一块带有 4 个继电器的电路板来控制 2 个楼层区域(1 个泵、1 个 CV、2 个阀门) ),每增加一个楼层区域就需要一个额外的继电器
× 1
Honeywell MT8-230-NC 小型线性热电执行器(230v AC )
这只是许多可用的执行器之一;每层单元组需要 1 个执行器(阀门)
× 1

关于这个项目

我建造这个设备是因为我的厨房在我的生活中用一个恒温器要么加热要么冷却。商用多区加热控制器(如 EvoHome)非常昂贵。该程序捕获了这些昂贵系统的智能,这些系统托管在一个简单的 Arduino Uno 板上。这完全解决了我的问题。

亮点/特点:

  • 您只需要配置固定和区域数量
  • 一个简单的 Arduino Uno 可以控制多达 5 个楼层单元区域
  • 有了 Arduino Mega,区域的数量几乎是无限的

提供的程序控制:

  • 落地泵
  • 将您的所有区域作为一个恒温器聚合到中央供暖系统
  • 用于打开/关闭区域的阀门
  • 看门狗定时器可确保稳定运行

允许每个区域单独加热:

  • 每个区域都有一个温控器来感知供暖需求
  • 每个区域一个继电器来控制一个或多个阀门来打开/关闭该区域的地板单元组
  • 可以将具有多个楼层单元组的房间视为一个加热区(将阀门与区域继电器平行布线)
  • 这不仅更方便,而且节省能源,而且房间也不会变得太热

控制地板单元泵:

  • 它基本上只在需要加热时运行泵。这已经为您每年节省 100-200 欧元的电力(与 24/7 运行相同的泵相比(80 瓦是每天 2kW 小时 =每天 0.50 欧元)
  • 至少每 36 小时启动一次地板泵,如果没有任何供暖需求,则持续 8 分钟(夏季)
  • 防止在没有先打开阀门的情况下运行泵;考虑到这些阀门需要3-5分钟

您也可以选择控制房屋的其余部分(没有地暖的房间):

  • 在这种情况下,您的散热器上通常会有恒温器旋钮;所以只有冷的房间才会暖和起来
  • 只需在您想要控制的房间内添加一个恒温器即可。将这些恒温器与 No_Zone 输入并联连接

最后说明:

并非所有区域都需要控制;只有变得温暖或过冷的区域(否则使用地板装置上的手动可调旋钮)

我明确决定不将设备连接到互联网:

  • 这会增加出现故障的风险(必须坚如磐石)
  • 您可以使用智能恒温器来控制您的房屋。这个控制器没有提供任何额外的远程适应

代码

  • ProjectCV.ino
  • 设备.h
ProjectCV.inoC/C++
/* * 适用于多个房间/区域的地板单元加热控制器 v1.0 * * 版权所有:Eric Kreuwels 的 GNU 通用公共许可证版本 3 (GPL-3.0),2017 * 致谢:Peter Kreuwels 定义所有用例需要考虑 * * 虽然这个设置已经在我的底层运行了整整一年,但我对代码中的任何错误不承担任何责任 * 它可以用作满足您自己需求的良好基础,并且应该使用前经过测试 * * 亮点/特点:* - 您只需要配置固定和区域数量 * - 一个简单的 Arduino Uno 可以控制多达 5 个楼层单元区域 * - 使用 Arduino Mega,区域数量几乎是无限的 * - 提供的程序控制: * - 地板单元泵 * - 将您的所有区域作为一个恒温器聚合到 CV 加热器 * - 用于打开/关闭区域的阀门 * - 允许每个区域单独加热; * - 每个区域一个温控器来感应加热请求 * - 每个区域一个继电器来控制一个或多个阀门来打开/关闭该区域的地板单元组 * - 一个房间有多个地板单元组可以被视为一个加热区域(将阀门与区域继电器平行连接)* - 这不仅更方便,而且节省能源,而且房间不再变得太热 * - 控制地板单元泵 * - 它基本上只在以下情况下运行泵需要加热。这已经为您每年节省了 100-200 欧元的电力,* 与 24/7 运行相同的泵相比(80 瓦是每天 2kW 小时 =每天 0.50 欧元)* - 每 36 小时至少激活一次地板泵,如果没有任何加热要求,则持续 8 分钟(夏季)* - 防止在未先打开阀门的情况下运行泵;考虑到这些阀门需要 3-5 分钟 * - 您也可以选择控制房屋的其余部分(没有地暖的房间)* - 在这里,您的散热器上通常会有恒温器旋钮;所以只有冷的房间才会升温 * - 只需在您想要控制的房间中添加一个恒温器。将这些恒温器与 No_Zone 输入并联连接 * - 最后说明: * - 并非所有区域都需要控制;只有通过地板单元上的手动调节旋钮变得温暖或过冷的区域 */#include  // 用于看门狗 // 警告:FAST_MODE 用于测试/评估/调试目的(循环运行速度提高 50 倍)// 将 FAST_MODE 与真正的落地式单元泵一起使用时要小心,因为关闭的阀门可能会损坏它// 阀门需要最少 3 分钟才能打开。在 FAST_MODE 中,程序在启动泵之前等待的时间不够长 // #define FAST_MODE // 执行速度提高 50 倍;考虑断开您真正的 CV/Pump!// 在正常操作中,每秒循环运行 10 次;所以 10 计数/秒(600 表示大约 1 分钟)#define VALVE_TIME 3000L // 5 分钟打开/关闭阀门(在安全地点;通常需要 3 到 5 分钟)#ifdef FAST_MODE#define PUMP_MAINTENANCE_TIME 108000L // 用于评估, 每 4 分钟激活一次落地泵维护运行(时间戳 3 小时)#else#define PUMP_MAINTENANCE_TIME 1300000L // 每 36 小时激活一次落地泵维护运行。需要保持泵工作#endif#define PUMP_ACTIVATION_TIME 5000L // 激活泵约 8 分钟(测试模式下 10 秒)#define COOLDOWN_TIME 18000L // 加热完成后,继续水循环 30 分钟(测试模式下 40 秒) mode) // 这可以进一步将热量散发到地板上(通常需要 15 到 30 分钟)#include "./Devices.h" // 阀门、泵、恒温器类(使用上面定义的常量)struct Zone { String name;阀门阀门;恒温器恒温器;};/////////////////////////////////////////// ///////// 配置块//根据需要配置/重新排序您的固定(这是我在Arduino Uno上的接线); // 注意:引脚 1 和 2 仍然可以自由添加一个额外的区域#define HEATER_PIN 4 // 输出到与加热系统的恒温器输入相连的继电器#define FU_PUMP_PIN 5 // 输出到继电器开关地板单元泵#define LIVING_VALVE 7 // 区域 1:输出到控制阀门的继电器#define KITCHEN_VALVE 6 // 区域 2:输出到控制阀门的继电器#define DINING_VALVE 3 // 区域3:输出到控制阀门的继电器#define LIVING_THERMO 8 // Zone 1;连接到生活中恒温器的输入#define KITCHEN_THERMO 9 // Zone 2;连接到厨房恒温器的输入#define DINING_THERMO 11 // Zone 3;连接到餐厅恒温器的输入#define NO_ZONE_THERMO 10 // 可选:没有地暖的房间中的恒温器#define HEATING_LED 12 // 加热时打开,冷却期间交替,空闲模式下关闭#define INDICATION_LED 13 // 交替打开板 LED 指示板运行;可以轻松移除以释放额外的 IO 引脚!!// 配置楼层单元区域/房间。每个区域/房间都有一个名称、阀门和恒温器:#define NR_ZONES 3Zone Zones[NR_ZONES] ={ {"Living Room", Valve(LIVING_VALVE, "Living Valve"), Thermostat(LIVING_THERMO, "Living Thermostat")}, { "厨房区域", 阀门(KITCHEN_VALVE, "厨房阀门"), 恒温器(KITCHEN_THERMO,"厨房恒温器")}, {"餐厅", 阀门(DINING_VALVE, "餐厅阀门"), 恒温器(DINING_THERMO, "餐厅恒温器") )}};// 结束配置块 /////////////////////////////////////// /////////// 一些固定设备:LED iLED(INDICATION_LED, "Indicator LED"); // 如果 IO 的 LED 用完 hLED(HEATING_LED, "Heating LED");Manipulator CV(HEATER_PIN, "CV Heater");Pump FUPump(FU_PUMP_PIN, "Floor Unit Pump");Thermostat ZonelessThermo(NO_ZONE_THERMO) , "Zoneless Thermostat"); // 对于房子的其余部分,与楼层单元无关 zonevoid printConfiguration() { Serial.println("------ Board Configuration:---------"); iLED.Print(); hLED.Print();简历.打印(); FUPump.Print(); ZonelessThermo.Print(); for(int i=0; i 0) { cooldownCount--;返回 checkCoolDownNeeded(); } bool checkCoolDownNeeded() { return (cooldownCount> 0); } void Print() { switch(_State) { case idle:Serial.print("idle");休息;案例:Serial.print("on");休息;案例冷却: Serial.print("cooldown");休息; } }};// 全局状态机State CVState;void setup() { // 初始化Serial.begin(115200);打印时间戳(); Serial.print(":");#ifdef FAST_MODE Serial.println("CV 区域控制器在测试模式下启动!\n" " - 电路板时间运行速度大约快 50 倍\n" " - 泵维护周期每 3 小时运行一次,而不是一次每 36 小时");#else Serial.println("CV Zone Controller 启动。时间戳 (dd:hh:mm:ss)");#endif Serial.println(" - 时间戳格式 (dd:hh:mm:ss)");打印配置(); wdt_enable(WDTO_1S); //看门狗:一秒后重置板子,如果没有收到“拍狗”}void loop() {#ifdef FAST_MODE delay(2); // 快了 50 倍,所以为了调试目的,分钟变成了大约几秒;所以每次冷却或空闲的计数都是 0.002 秒#else delay(100); // 正常操作:每秒循环约 10 次;所以冷却或空闲的每个计数都是 0.1 秒#endif // 使用 LED 指示灯显示电路板处于活动状态 iLED.Alternate(); // 每个 loop() 泵和阀门需要更新一次管理 FUPump.Update(); for (int i=0; i 保持此状态 if (FloorPumpingAllowed()) { FUPump.On(); } else { FUPump.Off(); } } else if ( CVState.checkCoolDownNeeded() ) { // 继续进入冷却状态以保持泵运行一段时间 CVState(State::cooldown); } else { // 跳过地板单位的冷却时间,回到空闲状态 CVState(State::idle); }}void coolDownProcessing() { hLED.Alternate(); if (HeatingRequested()) { // 当其中一个恒温器关闭时返回真 CVState(State::on); } else { if ( CVState.whileCoolDownNeeded() ) { if (FloorPumpingAllowed()) { FUPump.On(); } else { FUPump.Off(); } } else { CVState(State::idle); } }}void idleProcessing() { if (HeatingRequested()) { // 当其中一个恒温器关闭时返回真 CVState(State::on); } else { // 在空闲期间,此检查将每 36 小时激活地板单元泵 8 分钟以使其保持可操作状态 if ( FUPump.doMaintenanceRun()) { if (FUPump.IsOff()) { if ( allValvesOpen() ==false ) { // 开始只打开一次 printTimeStamp(); Serial.println(":开始地板单元泵的每日循环;打开阀门:"); allValvesOn(); } if (FloorPumpingAllowed()) { // 激活阀门后大约需要 5 分钟(测试模式下 6 秒) printTimeStamp(); Serial.println(":启动地板单元泵的每日循环;启动泵"); FUPump.On(); } } } else if (FUPump.IsOn()) { // 不需要维护。因此,如果仍在运行 printTimeStamp(),请停止泵; Serial.println(":停止地板单元泵的每日循环;停止泵并关闭阀门"); FUPump.Off(); allValvesOff(); } }}/////////////////////////////////////////////// ///////////////////// 状态处理程序使用的辅助方法//////////////////// ///////////////////void allValvesOff() { for (int i=0; i 
Devices.hC/C++
// IO 设备的辅助类extern void printTimeStamp(); // 在主 ino 文件中定义 // IODevice:所有 IO 设备的基类;需要 specializationclass IODevice { //vars protected:bool _IsOn; int_Pin;字符串_名称; //constructor public:IODevice(int pin, String name) { _IsOn =false; _Pin =引脚; _姓名=姓名; } //方法 virtual bool IsOn() =0; // abstract virtual bool IsOff() { // 默认为所有 return !IsOn(); } void DebugPrint() { printTimeStamp(); Serial.print(":");打印(); } void Print() { Serial.print(_Name); Serial.print(" on pin("); Serial.print(_Pin); if (_IsOn) Serial.println(") =On");否则 Serial.println(") =Off"); }};// 恒温器:读取一个数字输入,添加一些树状抑制类 Thermostat :public IODevice { //vars private:int _Counter; // 用于防止读取中断切换(dender) //构造函数 public:Thermostat(int pin, String name) :IODevice(pin, name) { _Counter =0; pinMode(_Pin, INPUT_PULLUP); } //methods virtual bool IsOn() { if (digitalRead(_Pin) ==HIGH &&_IsOn ==true) // 打开触点同时打开 { if( _Counter++> 5) // 仅在 5 次相同读出后动作 { _IsOn =假;调试打印(); _计数器 =0; } } else if (digitalRead(_Pin) ==LOW &&_IsOn ==false) // 关闭时闭合触点 { if( _Counter++> 5) // 只有在 5 次相同的读出后才起作用 { _IsOn =true;调试打印(); _计数器 =0; } } else { _Counter =0;返回 _IsOn; }};// Manipulator:数字输出类上最基本的工作设备 Manipulator :public IODevice{ //vars private://constructor public:Manipulator(int pin, String name) :IODevice(pin, name) { pinMode( _引脚,输出);数字写入(_Pin,高); } //方法 void On() { if (_IsOn ==false) { _IsOn =true;数字写入(_Pin,低);开关(); } } void Off() { if (_IsOn ==true) { _IsOn =false;数字写入(_Pin,高);开关(); } } virtual void onSwitch() { // 触发子类;更改开/关状态 DebugPrint(); } virtual bool IsOn() { return _IsOn; }};// 阀门:控制数字输出上的恒温阀。 // 这些阀门反应缓慢(3-5 分钟),因此该类添加了这种转换感知// loop() 必须调用Update() 来跟踪阀门是否完全打开或关闭class Valve :public Manipulator{ private:long transitionCount; //构造函数 public:Valve(int pin, String name) :Manipulator(pin, name) { transitionCount =0; } bool ValveIsOpen() { return (IsOn() &&(transitionCount>=VALVE_TIME)); // 至少 5 分钟处于开启状态 } // 在草图循环()中每次通过执行一次!!! void Update() { if (IsOn()) { if (transitionCount  0) transitionCount--; } }};// 泵:泵需要每周激活几次才能保持运转。 // loop() 必须调用 Update() 来跟踪何时需要维护激活class Pump :public Manipulator{ // 阀门反应缓慢(3-5 分钟)所以这个类添加了这个转换意识 private:long counter; bool doMaintenance; //构造函数 public:Pump(int pin, String name) :Manipulator(pin, name) { counter =0; doMaintenance =false; } bool doMaintenanceRun() { return doMaintenance; } virtual void onSwitch() { // 改变开/关状态 Manipulator::onSwitch();计数器 =0; } // 每次循环都运行这个方法 void Update() { if (IsOn()) { if (counter  250) #else if (counter++> 5) #endif { / / 切换 LED 计数器=0;如果(IsOn())关闭();否则打开(); } }};

示意图

外围设备(泵、阀门、恒温器、LED)的详细接线 多个“级联”控制器接线示例。每个楼层单元一个控制器 串行监视器的一些真实日志以了解其功能。时间戳显示例如打开阀门和实际启动落地泵之间有 5 分钟的延迟。 logexample_fTczkAa0tf.txtInspirational

制造工艺

  1. PWM 功率控制器
  2. 太阳能供暖系统
  3. 监控我的中央供暖锅炉
  4. 维护洗地机
  5. Web 操作的 DMX 控制器
  6. 视频游戏任务自动化设备
  7. Arduino 游戏控制器
  8. Unopad - 带有 Ableton 的 Arduino MIDI 控制器
  9. 真空荧光显示控制器
  10. 将您的中央供暖系统连接到 Arduino
  11. 由 Alexa 激活的 Arduino 家庭控制器
  12. AV 机柜风扇控制器