Управление отоплением электровоза ВЛ-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-х градусов до заданной температуры печки отключаются, и идет дальнейший контроль температуры, если температура от измерения к измерению нарастает то отопители не включаются, а если температура начинает спадать то печки включаются, при превышении заданной температуры отопители полностью отключаются и программа не реагирует на спад температуры до тех пор пока температура не понизится до установленного значения.
#include <OneWire.h> #include <DallasTemperature.h> #include <Stepper.h> #define ONE_WIRE_BUS 4 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); int led = 3; // пин 3 светодиод int temp1 = 500; int ztemp = 200; // температура регулирования в диапазоне 21-30 градусов int dtemp = 20; // разница между макс и мин теапер long zader = 30000; // время между измерениями int x = 0; int y = 0; int z = 0; long f = 0; long h = 0; int vper=1; int but = 2; int ftemp = 1; 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(void) { //Serial.begin(9600); sensors.begin(); myStepper.setSpeed(5); // скорость 5 об/минуту pinMode(led, OUTPUT); digitalWrite(led, LOW); pinMode(but, INPUT); digitalWrite(but, HIGH); button1(); vkl(); } //======================================================================================================= void loop(void) { y=temp1; temp(); //Serial.println(temp1); //Serial.println(y); //Serial.println(ztemp); //Serial.println("====="); if (temp1>=ztemp-dtemp){x=0;} if (temp1>=ztemp){x=0; z=0;} else {z=1;} if (z==1 && temp1<=y ){x=1;} if (temp1>=ztemp){x=0;} if (x==1){vkl();} else{otkl();} if (digitalRead(but)==LOW){button1();} f=millis(); while(millis()<f+zader) { if (digitalRead(but)==LOW){button1();} } } //-------------------------------------------------------------------------------------------------------------------------------------------------- void button1() { digitalWrite(led, LOW); delay(300); while(1){if(digitalRead(but)==HIGH){break;}} // цикл блокировки зажатой клавиши ztemp=ztemp+10; if (ztemp>350){ztemp=210;} //delay(700); ftemp=ztemp-200; ftemp=ftemp/10; for (int i=1; i <= ftemp; i++) { digitalWrite(led, HIGH); h=millis(); while(millis()<h+50) { if (digitalRead(but)==LOW){goto end1;} } digitalWrite(led, LOW); h=millis(); while(millis()<h+300) { if (digitalRead(but)==LOW){goto end1;} } } end1: if (vper=1){digitalWrite(led, HIGH);} if (digitalRead(but)==LOW){button1();} } //-------------------------------------------------------------------------------------------------------------------------------------------------- void temp() // функция измерегия температуры ds18b20 { sensors.requestTemperatures(); temp1=sensors.getTempCByIndex(0)*10; } //------------------------------------------------------------------------------------------------------------------------------------------------------------------ void otkl() { if (vper==0){ digitalWrite(led, LOW); myStepper.step(stepsPerRevolution);} //вкючение или блокировка повторного включения шаговика если до уже выполнялась эта функция vper=1; digitalWrite(8,LOW); // отключает пины из режима удержания digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); } //--------------------------------------------------------------------------------------------------------------------------------------------------------------- void vkl() { if (vper==1){ digitalWrite(led, HIGH); myStepper.step(-stepsPerRevolution);} //вкючение или блокировка повторного включения шаговика если до уже выполнялась эта функция vper=0; digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); }