Управление отоплением электровоза ВЛ-10
- Войдите на сайт для отправки комментариев
Сконструировал ЭТО. Вроде как работает,включает и выключает.
Надо правда разобраться с большой инерционностью системы а то разница между мах и мин температурой во время работы около 5 градусов что некомфортно, поэтому надо будет чтобы заранее происходило выключение(вкл) отопления, но если температура недостигнет заданной и начнет падать до установленного порога надо снова будет включить отопление и уже дать либо вторую ступень выключения, либо уже дожидаться заданной температуры и выключать печки.
видео работы https://drive.google.com/file/d/0B7zPXIoEu3OhbHNYem83QUVvaXc/view?usp=sharing
файлы SketchUp фото и прошивки https://drive.google.com/drive/folders/0B7zPXIoEu3OhcU5QMnBkTGxrbEU?usp=sharing
// терморегулятор для кабаины электровоза ВЛ-10 #include <OneWire.h> #include <Stepper.h> OneWire ds(4); // пин на ds18b20 int temp1=50; int Temp = 50; int but = 2; //пин 2 кнопка int led = 3; // пин 3 светодиод int ztemp = 21; int ftemp = 1; unsigned int i; int indicator = 0; int vper=3; const int IN1 = 8; //пины шаговика const int IN2 = 10; const int IN3 = 9; const int IN4 = 11; const int stepsPerRevolution = 2800; // шагов за один оборот Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4); void setup() { myStepper.setSpeed(5); // скорость 5 об/минуту pinMode(led, OUTPUT); digitalWrite(led, LOW); pinMode(but, INPUT); digitalWrite(but, HIGH); delay (1000); flash(); // показывает что устройство включилось } //----------------------------------------------------------------------------------------------------------- void loop() { temp(); // функция измерегия температуры ds18b20 if (temp1>ztemp){otkl();} // если температура выше заданной то к функции шаговика на вращение отключения if (temp1<=ztemp){vkl();} // если температура ниже заданной то к функции шаговика на вращение включения if (vper==0){digitalWrite(led, HIGH); } // если нагрев то светодиод включен if (vper==1){digitalWrite(led,LOW); } // и наоборот for (int i=0; i <=300; i++) // цикл задающий время между измерениями температуры и работой шаговика { if (digitalRead(but)==LOW){button();} // опрос кнопки if (indicator==1){flash();} // если нажималась кнопка то переход к указанию заданной температуры delay (50); } } //----------------------------------------------------------------------------------------------------------------------------------------------- void button() // этой фунцией задаем требуемую температуру { ztemp=ztemp+1; if (ztemp>30){ztemp=21;} indicator=1; while(1){if(digitalRead(but)==HIGH){break;}} // цикл блокировки зажатой клавиши delay(30); } //----------------------------------------------------------------------------------------------------------------------------------------------- void flash() // цикл моргания светодиода показывающий установленную температуру регулирования ( 1 блинк 21 градус, 2 блинка 22 и т.д до 30) { ftemp=ztemp-20; for (int i=1; i <= ftemp; i++) {digitalWrite(led, HIGH); delay (50); if (digitalRead(but)==LOW){button();} /// да, мне было лень писать без делей и делать цикл delay (50); if (digitalRead(but)==LOW){button();} delay (50); if (digitalRead(but)==LOW){button();} delay (50); if (digitalRead(but)==LOW){button();} delay (50); if (digitalRead(but)==LOW){button();} delay (50); if (digitalRead(but)==LOW){button();} delay (50); if (digitalRead(but)==LOW){button();} digitalWrite(led,LOW); delay (50); if (digitalRead(but)==LOW){button();} delay (50); if (digitalRead(but)==LOW){button();} delay (50); if (digitalRead(but)==LOW){button();} delay (50); if (digitalRead(but)==LOW){button();} delay (50); if (digitalRead(but)==LOW){button();} delay (50); if (digitalRead(but)==LOW){button();} delay (50); if (digitalRead(but)==LOW){button();} } indicator=0; } //-------------------------------------------------------------------------------------------------------------------------------------------------- void temp() // функция измерегия температуры ds18b20 { byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); delay(500); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); int Temp = (data[1] << 8) + data[0]; Temp = Temp >> 4; temp1=Temp; temp1=temp1-3; } //------------------------------------------------------------------------------------------------------------------------------------------------------------------ void otkl() { if (vper==0){myStepper.step(stepsPerRevolution);} //вкючение или блокировка повторного включения шаговика если до уже выполнялась эта функция vper=1; digitalWrite(8,LOW); // отключает пины из режима удержания digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); } //--------------------------------------------------------------------------------------------------------------------------------------------------------------- void vkl() { if (vper==1){myStepper.step(-stepsPerRevolution); } //вкючение или блокировка повторного включения шаговика если до уже выполнялась эта функция vper=0; digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); }
в качестве привода используется этот шаговик https://ru.aliexpress.com/item/5V-Stepper-Motor-28BYJ-48-With-Drive-Test-Module-Board-ULN2003-5-Line-4-Phase/32608569300.html?spm=2114.13010608.0.0.gVHfYG&detailNewVersion=&categoryId=100007155
переписал скетч
теперь недостигая 2-х градусов до заданной температуры печки отключаются, и идет дальнейший контроль температуры, если температура от измерения к измерению нарастает то отопители не включаются, а если температура начинает спадать то печки включаются, при превышении заданной температуры отопители полностью отключаются и программа не реагирует на спад температуры до тех пор пока температура не понизится до установленного значения.