산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

다구역 난방 컨트롤러

구성품 및 소모품

Arduino UNO
5개 이상의 영역을 제어해야 하는 경우 메가를 사용하십시오(나머지 영역을 위한 추가 영역 포함 바닥 난방이 없는 집)
× 1
Keyes 8 채널 5Volt 릴레이 보드
2개의 바닥 구역(펌프 1개, CV 1개, 밸브 2개)을 제어하려면 릴레이 4개가 있는 보드가 필요합니다. ), 추가 바닥 구역마다 하나의 추가 릴레이가 필요합니다.
× 1
Honeywell MT8-230-NC 소형 선형 열전 액추에이터(230v AC )
이것은 사용 가능한 많은 액추에이터 중 하나일 뿐입니다. 층 단위 그룹당 1개의 액추에이터(밸브)가 필요합니다.
× 1

이 프로젝트 정보

내 부엌이 내 생활에 하나의 온도 조절기로 따뜻하거나 차갑기 때문에 이 장치를 만들었습니다. EvoHome과 같은 상업용 다중 구역 난방 컨트롤러는 매우 비쌉니다. 이 프로그램은 간단한 Arduino Uno 보드에서 호스팅되는 이러한 값비싼 시스템의 인텔리전스를 캡처합니다. 이로써 내 문제가 완전히 해결되었습니다.

하이라이트/특징:

<울>
  • 피닝 및 영역 수만 구성하면 됩니다.
  • <울>
  • 간단한 Arduino Uno는 최대 5개의 플로어 유닛 구역을 제어할 수 있습니다.
  • <울>
  • Arduino Mega를 사용하면 영역의 수는 거의 무제한입니다.
  • 제공된 프로그램 제어:

    <울>
  • 플로어 유닛 펌프
  • <울>
  • 중앙 히터에 대한 하나의 온도 조절기로 모든 구역을 집계합니다.
  • <울>
  • 영역을 열고 닫는 데 사용되는 밸브
  • <울>
  • 완벽한 작동을 보장하는 Watch Dog 타이머
  • 구역별 개별 난방 가능:

    <울>
  • 난방 요청을 감지하는 온도 조절 장치
  • <울>
  • 영역당 하나 이상의 밸브를 제어하는 ​​릴레이가 해당 영역의 플로어 유닛 그룹을 열고 닫습니다.
  • <울>
  • 여러 층 단위 그룹이 있는 방은 하나의 난방 구역으로 간주될 수 있습니다(밸브를 구역 릴레이에 평행하게 배선)
  • <울>
  • 더 편리할 뿐만 아니라 에너지를 절약하고 방이 더 이상 따뜻해지지 않습니다.
  • 플로어 유닛 펌프 제어:

    <울>
  • 기본적으로 난방이 필요할 때만 펌프를 작동시킵니다. 이를 통해 이미 연간 100-200유로의 전기를 절약할 수 있습니다(같은 펌프를 연중무휴 24시간 가동하는 것과 비교)(80와트는 하루 2kW 시간 =하루 0.50유로)
  • <울>
  • 난방 요청이 없으면 8분 동안 36시간마다 1회 이상 플로어 유닛 펌프 작동(여름)
  • <울>
  • 밸브를 먼저 열지 않고 펌프를 작동시키는 것을 방지합니다. 이러한 밸브에는 3-5분이 소요된다는 점을 고려하면
  • 선택적으로 집의 나머지 부분(바닥 난방이 없는 방)도 제어할 수 있습니다.

    <울>
  • 여기에는 일반적으로 라디에이터에 온도 조절기 손잡이가 있습니다. 추운 방만 데워지도록
  • <울>
  • 제어하려는 방에 온도 조절기를 추가하기만 하면 됩니다. 이 온도 조절기를 No_Zone 입력에 병렬로 연결하십시오.
  • 최종 메모:

    모든 영역을 제어할 필요는 없습니다. 따뜻해지거나 너무 차갑게 유지되는 구역만 (그렇지 않으면 플로어 유닛의 수동 조절 노브를 사용하십시오)

    기기를 인터넷에 연결하지 않기로 명시적으로 결정했습니다.

    <울>
  • 오작동의 위험이 증가합니다(단단한 상태여야 함)
  • <울>
  • 스마트 온도 조절기를 사용하여 집을 제어할 수 있습니다. 이 컨트롤러는 원격 조정을 위한 추가 기능을 제공하지 않습니다.
  • <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • ProjectCV.ino
  • 기기.h
  • ProjectCV.inoC/C++
    /* * 여러 방/구역 v1.0을 위한 플로어 유닛 난방 컨트롤러 * * 저작권:Eric Kreuwels의 GNU General Public License 버전 3(GPL-3.0), 2017 * 크레딧:모든 사용 사례를 정의한 Peter Kreuwels 고려해야 할 사항 * * 이 설정은 이미 제 1층에서 1년 이상 실행되었지만 코드의 오류에 대해 책임을 지지 않습니다. * * 하이라이트/특징:* - 피닝 및 구역 수만 구성하면 됩니다. * - 간단한 Arduino Uno는 최대 5개의 플로어 유닛 구역을 제어할 수 있습니다. * - Arduino Mega를 사용하면 구역 수가 거의 무제한입니다. * - 제공된 프로그램 제어:* - 플로어 유닛 펌프 * - CV 히터에 대한 하나의 온도 조절기로 모든 구역을 집계합니다. * - 구역을 열거나 닫는 밸브 * - 구역별로 개별 난방을 허용합니다. * - 구역별로 난방 요청을 감지하는 온도 조절 장치 * - 구역당 하나 이상의 밸브를 제어하여 해당 구역의 층 단위 그룹을 열거나 닫는 릴레이 * - 여러 층 단위 그룹이 있는 방은 하나의 난방으로 간주될 수 있음 Zone (밸브를 Zone Relay에 평행하게 배선) * - 이것은 더 편리할 뿐만 아니라 에너지를 절약할 뿐만 아니라 더 이상 방이 너무 더워지지 않습니다. * - Floor Unit Pump를 제어합니다. * - 기본적으로 다음과 같은 경우에만 펌프를 작동시킵니다. 난방에 필요합니다. 이렇게 하면 이미 연간 100-200유로의 전기를 절약할 수 있습니다. * 동일한 펌프를 연중무휴 24시간 가동하는 것과 비교하면(80와트는 하루 2kW 시간 =하루 0.50유로) * - 최소 36시간마다 플로어 유닛 펌프를 활성화합니다. 난방 요청이 없으면 8분 동안(하절기) * - 밸브를 먼저 열지 않고 펌프를 작동시키는 것을 방지합니다. 이 밸브에는 3-5분이 필요하다는 점을 고려하면 * - 선택적으로 집안의 나머지 부분(바닥 난방이 없는 방)도 제어할 수 있습니다. * - 일반적으로 라디에이터에 온도 조절 손잡이가 있습니다. 그래서 추운 방만 가열됩니다 * - 제어하려는 방에 온도 조절기를 추가하기만 하면 됩니다. 이 온도 조절기를 No_Zone 입력에 병렬로 연결합니다. * - 최종 참고 사항:* - 모든 영역을 제어할 필요는 없습니다. * 플로어 유닛의 수동 조정 노브로 따뜻해지거나 너무 차갑게 유지되는 구역만 */#include  // for Watchdog// 경고:FAST_MODE는 테스트/평가/디버그 목적( 루프가 50배 더 ​​빠르게 실행됨)// 실제 플로어 유닛 펌프와 함께 FAST_MODE를 사용하면 밸브가 닫히면 손상될 수 있으므로 주의하세요.// 밸브를 여는 데 최소 3분이 필요합니다. FAST_MODE에서 프로그램은 펌프를 시작하기 전에 충분히 오래 기다리지 않습니다. // #define FAST_MODE // 50배 더 ​​빠른 실행; 실제 CV/Pump를 연결 해제하는 것을 고려하십시오!// 정상 작동에서 루프 실행은 초당 10번 실행됩니다. so 10 counts/second(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; 밸브 밸브; 온도 조절기 온도 조절기;};//////////////////////////////////////////////// ///////// CONFIGURATION BLOCK // 원하는 대로 피닝을 구성/재정렬합니다(이것은 Arduino Uno의 배선입니다). // 참고:핀 1과 2는 여전히 추가 영역을 추가할 수 있습니다.#define HEATER_PIN 4 // 난방 시스템의 온도 조절기 입력과 연결된 릴레이로의 출력#define FU_PUMP_PIN 5 // 스위치를 전환하는 릴레이로의 출력 플로어 유닛 Pump#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 // 구역 3; 식당의 온도 조절기에 연결된 입력#define NO_ZONE_THERMO 10 // 선택 사항:바닥 난방이 없는 방의 온도 조절기#define HEATING_LED 12 // 난방 시 켜짐, 냉각 중에는 교대로, 유휴 모드에서는 꺼짐#define INDICATION_LED 13 // 교대로 켜짐 보드 실행을 나타내는 보드 LED; 추가 IO 핀을 확보하기 위해 쉽게 제거할 수 있습니다!!// 플로어 유닛 구역/룸을 구성합니다. 각 구역/방은 이름, 밸브 및 온도 조절기를 소유합니다.#define NR_ZONES 3Zone Zones[NR_ZONES] ={ {"거실", 밸브(LIVING_VALVE, "거실 밸브"), 온도 조절기(LIVING_THERMO, "거실 온도 조절기")}, { "주방 구역", 밸브(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 , "영역 없는 온도 조절기"); // 나머지 집의 경우 바닥 단위와 관련 없음 zonevoid printConfiguration() { Serial.println("------ Board Configuration:---------"); iLED.Print(); hLED.Print(); CV.인쇄(); FUPump.Print(); ZonelessThermo.Print(); for(int i=0; i 0) { cooldownCount--; } return checkCoolDownNeeded(); } 부울 checkCoolDownNeeded() { 반환(쿨다운카운트> 0); } 무효 Print() { switch(_State) { 유휴 상태인 경우:Serial.print("유휴"); 부서지다; 경우:Serial.print("on"); 부서지다; 케이스 쿨다운:Serial.print("쿨다운"); 부서지다; } }};// 전역 상태 machineState CVState;void setup() { // 초기화 Serial.begin(115200); 프린트타임스탬프(); Serial.print(":");#ifdef FAST_MODE Serial.println("CV 영역 컨트롤러가 테스트 모드에서 시작되었습니다!\n" " - 보드 시간이 약 50배 더 ​​빠르게 실행됩니다.\n" " - 펌프 유지 관리 주기가 한 번 대신 3시간마다 실행됩니다. 36시간당");#else Serial.println("CV 영역 컨트롤러가 시작되었습니다. 타임스탬프(dd:hh:mm:ss)");#endif Serial.println(" - 타임스탬프 형식(dd:hh:mm:봄 여름 시즌)"); 인쇄 구성(); wdt_enable(WDTO_1S); // Watchdog:"pat dog"가 수신되지 않은 경우 1초 후 보드 재설정}void loop() {#ifdef FAST_MODE delay(2); // 50배 더 ​​빨라서 디버깅 목적으로 분은 대략 초가 됩니다. 따라서 쿨다운 또는 유휴 상태의 모든 카운트는 0.002초#else delay(100)입니다. // 정상 작동:초당 약 10회 반복합니다. 따라서 쿨다운 또는 유휴 상태에 대한 모든 카운트는 0.1초입니다.#endif // 표시 LED를 사용하여 보드가 활성 상태임을 표시합니다. iLED.Alternate(); // 루프()당 한 번 펌프와 밸브는 관리를 업데이트해야 합니다. 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); }}쿨다운프로세싱() { hLED.Alternate(); if (HeatingRequested()) { // 온도 조절 장치 중 하나가 닫히면 true를 반환합니다. CVState(State::on); } else { if ( CVState.whileCoolDownNeeded() ) { if (FloorPumpingAllowed()) { FUPump.On(); } else { FUPump.Off(); } } else { CVState(상태::유휴); } }}void idleProcessing() { if (HeatingRequested()) { // 온도 조절기 중 하나가 닫히면 true를 반환합니다. 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(); 모든 밸브오프(); }}}////////////////////////////////////////////////// /////////////////////// 상태 핸들러에서 사용하는 도우미 메서드//////////////////// /////////////////////void allValvesOff() { for (int i=0; i 
    Devices.hC/C++
    // IO 장치용 도우미 클래스extern void printTimeStamp(); // 메인 ino 파일에 정의됨 // IODevice:모든 IO 장치에 대한 기본 클래스; 전문화가 필요합니다. IODevice { //vars protected:bool _IsOn; 정수 _핀; 문자열 _이름; // 생성자 공개:IODevice(int 핀, 문자열 이름) { _IsOn =false; _핀 =핀; _이름=이름; } // 메서드 가상 bool IsOn() =0; // 추상 가상 bool IsOff() { // 모든 반환의 기본값 return !IsOn(); } 무효 DebugPrint() { printTimeStamp(); Serial.print(":"); 인쇄(); } 무효 Print() { Serial.print(_Name); Serial.print(" on pin("); Serial.print(_Pin); if (_IsOn) Serial.println(") =On"); else Serial.println(") =꺼짐"); }};// Thermostat:일부 dender 억제 클래스를 추가하는 디지털 입력을 읽습니다. Thermostat:public IODevice { //vars private:int _Counter; // 중간 스위칭(dender) 읽기를 방지하는 데 사용 // 생성자 public:Thermostat(int pin, String name) :IODevice(pin, name) { _Counter =0; 핀모드(_핀, INPUT_PULLUP); { _IsOn =거짓; 디버그 인쇄(); _카운터 =0; } } else if (digitalRead(_Pin) ==LOW &&_IsOn ==false) // 꺼져 있는 동안 접점 닫기 { if( _Counter++> 5) // 동일한 읽기를 5번 반복한 후에만 작동 { _IsOn =true; 디버그 인쇄(); _카운터 =0; } } 그렇지 않으면 { _카운터 =0; } 반환 _IsOn; }};// Manipulator:디지털 출력 클래스에서 가장 기본적인 작동 장치 Manipulator :public IODevice{ //vars private://constructor public:Manipulator(int pin, String name) :IODevice(pin, name) { pinMode( _핀, 출력); 디지털 쓰기(_핀, 높음); } // 메서드 무효 On() { if (_IsOn ==false) { _IsOn =true; 디지털 쓰기(_핀, 낮음); 온스위치(); } } 무효 Off() { if (_IsOn ==true) { _IsOn =false; 디지털 쓰기(_핀, 높음); 온스위치(); } } virtual void onSwitch() { // 자식 클래스에 대한 트리거; 켜짐/꺼짐 상태 변경 DebugPrint(); } 가상 부울 IsOn() { 반환 _IsOn; }};// 밸브:디지털 출력에서 ​​온도 조절 밸브를 제어합니다. // 이 밸브는 느리게(3-5분) 반응하므로 이 클래스는 이 전환 인식을 추가합니다. // 루프()는 밸브가 완전히 열려 있거나 닫혀 있는지 추적하기 위해 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분 } // 스케치 루프()에서 패스당 한 번 실행 !!! 무효 Update() { if (IsOn()) { if (transitionCount  0) transitionCount--; } }};// 펌프:펌프를 계속 작동시키려면 일주일에 여러 번 펌프를 활성화해야 합니다. // 유지보수 활성화가 필요할 때 추적하기 위해 루프()는 Update()를 호출해야 합니다.class Pump :public Manipulator{ // 밸브는 느리게 반응하므로(3-5분) 이 클래스는 이 전환 인식을 추가합니다. private:long counter; bool doMaintenance; // 생성자 public:Pump(int pin, String name) :Manipulator(pin, name) { counter =0; 유지 관리 =거짓; } 부울 doMaintenanceRun() { 반환 doMaintenance; } virtual void onSwitch() { // 켜짐/꺼짐 상태 변경 Manipulator::onSwitch(); 카운터 =0; } // loop()의 모든 패스에서 이 메서드를 실행합니다. void Update() { if (IsOn()) { if (counter  250) #else if (counter++> 5) #endif { / / 토글 LED 카운터=0; if (IsOn()) Off(); 그렇지 않으면 On(); } }};

    회로도

    주변 장치(펌프, 밸브, 온도 조절 장치, LED)의 세부 배선 여러 '계단식' 컨트롤러 배선의 예. 플로어 유닛당 컨트롤러 1개 기능을 이해하기 위한 직렬 모니터의 실제 로깅. 타임스탬프는 예를 들어 밸브를 열고 실제로 플로어 유닛 펌프를 시작하는 데 5분의 지연이 있습니다. logexample_fTczkAa0tf.txt영감

    제조공정

    1. PWM 전원 컨트롤러
    2. 태양열 난방 시스템
    3. 내 중앙 난방 보일러 모니터링
    4. 바닥 수세미 관리
    5. 웹 운영 DMX 컨트롤러
    6. 비디오 게임 작업 자동화 장치
    7. Arduino 게임 컨트롤러
    8. Unopad - Ableton이 포함된 Arduino MIDI 컨트롤러
    9. 진공 형광 디스플레이 컨트롤러
    10. Arduino에 중앙 난방 연결