Управление отоплением электровоза ВЛ-10

evgta
Offline
Зарегистрирован: 02.09.2016

Сконструировал ЭТО. Вроде как работает,включает и выключает.

Надо правда разобраться с большой инерционностью системы а то разница между мах и мин температурой во время работы около 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);

}

evgta
Offline
Зарегистрирован: 02.09.2016
evgta
Offline
Зарегистрирован: 02.09.2016

переписал скетч

теперь недостигая 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);

}