управление электрокотлом и насосом отопления

vovanagavana
Offline
Зарегистрирован: 29.03.2015

Ребята помогите имею электрокотел и термоконтроллер в комнате который управляет котлом методом включения и выключения реле взависимости от температуры в комнате хотелось бы штобы при выключении реле при достежении нужной температуры котел выключался а насос работал ище 2 или 3 минуты чтобы вода не закипела в котле а при включении все включалось вместе имею ардуино уно и два реле но неимею мозгов написать код а учиться уже позно да и в школе я французкий учил так што очень туго помогите пожалуста хто может зарание спасибо.

dachnik
Offline
Зарегистрирован: 26.07.2013

Самый примитивный вариант =)

vovanagavana
Offline
Зарегистрирован: 29.03.2015

да да именно е то и было нужно огромное спасибо

vovanagavana
Offline
Зарегистрирован: 29.03.2015

попытался запустить по етому коду неполучается задержка идет сразу на два реле

dachnik
Offline
Зарегистрирован: 26.07.2013

Код в студию

vovanagavana
Offline
Зарегистрирован: 29.03.2015

вот етот код 

int rele1 = 9;
int rele2 = 8;
int termocontrol =2;
 
 
 
void setup() {
  pinMode(termocontrol, INPUT);
  pinMode(rele1, OUTPUT); 
  pinMode(rele2, OUTPUT);
  //термоконтроллер вход, реле 1 и 2 выход:
 
}
 
void loop() {
  if (digitalRead(termocontrol) == 1)
  digitalWrite(rele1,HIGH);
  digitalWrite(rele2,HIGH);
  if (digitalRead(termocontrol) == 0)
  digitalWrite(rele1,LOW);
  delay (60000);
  digitalWrite(rele2,LOW);
  // усли на термоконтроллере 1 реле 1 и2 включены,если 0 реле 2 выключено реле 1 отключится через минуту:
}
 
dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Проблема решена в моей статье , сотри выше !

Если малость подшаманишь код . все получится (Тело сдери)

Необходимо вывести температуру DS18B20 и положение РЕЛЕ на TFT 2.4 дисплей (ХЕЛП)

 

vovanagavana
Offline
Зарегистрирован: 29.03.2015

в том то и дело я не вкурсе как его шаманить

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Сорямба , не внимательно прочел ....  У меня все малость на иначе =))) 

 

Если все правельно понял то вот так должно быть ...  Могу и ошибатся , не гуру в этих делах ... Но из кода видно что операторы IF так сказать глотают задержку ! т.е не видят ее 

 

void loop() {
  if (digitalRead(termocontrol) == 1)
{
  digitalWrite(rele1,HIGH);
  digitalWrite(rele2,HIGH);
}
// Замыкаем оба реле ...
-----------------------------------------------------
  else if (digitalRead(termocontrol) == 0)
{  
 digitalWrite(rele1,LOW); // Размыкаем первое реле.
delay (60000); // Твоя  задержка 
}
 
 else (digitalRead(termocontrol) == 0) // Чиаем заново дигитал рид и если оно равно операнту 0 
{
digitalWrite(rele2,LOW); // выключаем его
 }
 
Подробнее здесь смотри (http://arduino.ru/Reference/Else)
vovanagavana
Offline
Зарегистрирован: 29.03.2015
int rele1 = 9;
int rele2 = 8;
int termocontrol =2;
 
 
 
void setup() {
  pinMode(termocontrol, INPUT);
  pinMode(rele1, OUTPUT); 
  pinMode(rele2, OUTPUT);
  //термоконтроллер вход, реле 1 и 2 выход:
 
}
 
void loop() {
  if (digitalRead(termocontrol) == 1)
  digitalWrite(rele1,HIGH);
  digitalWrite(rele2,HIGH);// Замыкаем оба реле 
}
  else if  (digitalRead(termocontrol) == 0)
    {
 digitalWrite(rele2,LOW);
  // выключаем реле 2 
    }
  else (digitalRead(termocontrol) == 0)  ОШИБКА  expected unqualified-id before 'else'
    {
  digitalWrite(rele1,LOW); // Размыкаем первое релe
  delay (60000);//   задержка 
}
}
dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016
 
Пробуй  этот кусок ! 
И да ты определись на какую релюху ты ставишь ДИЛЕЙ ...  Здесь будет срабатывать задержка после отключения  РЕЛЕ 1 !!! А то что ты написал выше , по тексту , ты вырубаешь после проверки сразу реле 2 , а потом  реле 1 изадержку даешь !  Помни что проц читает подряд как ты написал так он и прочел =D
 
void loop()
{
  if (digitalRead(termocontrol) == 1)
  {
  digitalWrite(rele1,HIGH);
  digitalWrite(rele2,HIGH);
  }
  if (digitalRead(termocontrol) == 0)
  {
  digitalWrite(rele1,LOW);
  delay (60000);
  }
 else if (digitalRead(termocontrol) == 0)
{
  digitalWrite(rele2,LOW);
  }
}
yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Примерно так

#define rele1  9
#define rele2  8
#define termocontrol 2
unsigned long timer =0;//таймер для задержки
#define pause 180000

void setup() {
  pinMode(termocontrol, INPUT);
  pinMode(rele1, OUTPUT); 
  pinMode(rele2, OUTPUT);
  //термоконтроллер вход, реле 1 и 2 выход:
}

void loop() {
  if (DIn(termocontrol) == 1){
    // Замыкаем оба реле 
    DOut (rele1,HIGH);
    DOut (rele2,HIGH);
  }
  if  (DIn(termocontrol) == 0 && DIn(rele1)==1){//выполняеться один раз для сброса таймера
    timer=millis();//начало отсчета задержки
    DOut(rele2,LOW);// выключаем реле 2 
  }
  if (millis()-timer >= pause && DIn(rele1)==0){//задержка отключения второго реле
    DOut(rele1,LOW); // Размыкаем первое релe
  }
}//end LOOP

//эти функции не обязательны
//-------функция переключения реле---------- 
void DOut (byte pin, boolean state){
  digitalWrite(pin,state);
}
//-------функция опроса цифровых входов----------
boolean DIn (byte pin){
  return digitalRead(pin);
}

 

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

okta
Offline
Зарегистрирован: 10.01.2015

Имею авто неизвестной породы, у него есть какой-то двигатель и какието тормоза, хочу чтоб они работали согласованно с разницей в три минуты методом включения и выключения, чтоб двигатель не закипел, а при включении все включалось. У меня есть АРДУИНО!!!! Я сам учился ездить на танке, а там вообще руля не было, да и педали были другие. Помогите хто может.

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

ТРОЛЬ =,D

okta
Offline
Зарегистрирован: 10.01.2015

о, да, только так меня еще не обзывали... Вы хоть (как минимум) спросили у ТС схему подключения, что за термоконтроллер он использует, как на этом контроллере образуются ноль или единица? Или таки экстрасенсы вышли из отпуска?

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Нуууу, парень знает видать че он делает...... Но если нет , будет печалька )  

vovanagavana
Offline
Зарегистрирован: 29.03.2015

может я чегото не понимаю но работает все через жопу при нажатии на кнопку типа сигнал с термодатчика и ее удерживании диоды типа реле загораются через задоное время delay (60000); при отпускании кнопки тухнет один диод а второй горит при нажатии через задержку включается первый при отпускании кнопки тухнет а второй как горел так и горит

vovanagavana
Offline
Зарегистрирован: 29.03.2015

ето я екстросенсу с ником okta слишиш ты пидрило пизьдеть и я умею а помоч слабо в микроконтроллере сигнал на котел дает обыкновенная реле 

 

vovanagavana
Offline
Зарегистрирован: 29.03.2015

 

 

 

       if (millis()-timer >= pause && DIn(rele1)==0){//задержка отключения второго реле

      DOut(rele1,LOW); // Размыкаем первое релe

в етой строчке у меня выдает ошибку

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Ошибки устранил, в Proteus`e проверил, всё работает.

#define pump  9
#define heather  8
#define termocontrol 2
unsigned long timer =0;//таймер для задержки
#define pause 180000

void setup() {
  pinMode(termocontrol, INPUT);
  pinMode(pump, OUTPUT); 
  pinMode(heather, OUTPUT);
  //термоконтроллер вход, реле 1 и 2 выход:
}

void loop() {
  if (DIn(termocontrol) == HIGH){
    // Замыкаем оба реле 
    DOut (pump,HIGH);
    DOut (heather,HIGH);
  }

  if (  DIn(heather)==HIGH && DIn(termocontrol) == LOW){//выполняеться один раз для сброса таймера
    timer=millis();//начало отсчета задержки
    DOut(heather,LOW);// выключаем реле 2 
  }
  if (millis()-timer >= pause && DIn(heather)==LOW){
    DOut(pump,LOW); // Размыкаем первое релe
  }
}//end LOOP


//-------функция переключения реле----------
void DOut (byte pin, boolean state){
  digitalWrite(pin,state);
}
//-------функция опроса цифровых входов----------
boolean DIn (byte pin){
  return digitalRead(pin);
}

Но использовать для этого микроконтроллер это черезчур, вот если им есче температуру мерить и с его помощью управлять нагревом по закону регулирования и реализовать погодо-зависимое управление, тогда будет GOOD.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vovanagavana пишет:

ето я екстросенсу с ником okta слишиш ты пидрило пизьдеть и я умею а помоч слабо в микроконтроллере сигнал на котел дает обыкновенная реле 

 

Голубок, твои на других сайтах тусят.

vovanagavana
Offline
Зарегистрирован: 29.03.2015

    добрый день все работает отлично только когда стоит в режиме ожидания реле включены а при нажатии выключены я понимаю что реле двусторонее но попробовал поменять местами LOW с HIGH нечего не вышло наверное совсем плохой из меня програмист а контроллер у меня стоял но пока все на роботе и котел держал температуру +5 тоесть почти не работал насос гонял холодную воду ну теперь я надеюсь устраню ету проблему так што огромное вам всем спасибо есть ищо добрые люди

vovanagavana
Offline
Зарегистрирован: 29.03.2015

вот такой у меня термопрограматор

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Ну как, работает или нет?

Добавил индикацию режима работы светодиодом на 13 пине.

#define pump  9//насос
#define heather  8//нагреватель
#define termocontrol 2//термостат
#define StatLed 13//индикатор состояния
unsigned long timer =0;//таймер для задержки
unsigned long StatTime =0;//таймер инд состояния
#define pause 3000//180000//задержка отключения насоса
int pauseLed=1000;//частота индикатора состояния

void setup() {
  pinMode(termocontrol, INPUT);
  pinMode(pump, OUTPUT); 
  pinMode(heather, OUTPUT);
  pinMode(StatLed, OUTPUT); 
  //термоконтроллер вход, реле 1 и 2 выход:
}

void loop() {
  if (DIn(termocontrol) == HIGH){//если термостат замкнут
    // Замыкаем оба реле 
    DOut (pump,HIGH);//включаем насос
    DOut (heather,HIGH);//включаем нагреватель
    pauseLed=1000;//период мигания индикатора состояния 1с
  }

  if (  DIn(heather)==HIGH && DIn(termocontrol) == LOW){//выполняеться один раз для сброса таймера
    timer=millis();//начало отсчета задержки
    DOut(heather,LOW);// выключаем нагреватель
    pauseLed=500;//период мигания индикатора состояния 0,5с
  }
  if (millis()-timer >= pause && DIn(heather)==LOW){
    DOut(pump,LOW); // выключаем насос
    pauseLed=1500;//период мигания индикатора состояния 1,5с
  }

  if(millis()- StatTime > pauseLed){
    StatTime=millis();
    DOut(StatLed,!DIn(StatLed));
  }
}//end LOOP


//-------функция переключения реле----------
void DOut (byte pin, boolean state){
  digitalWrite(pin,state);
}
//-------функция опроса цифровых входов----------
boolean DIn (byte pin){
  return digitalRead(pin);
}
//Спасибо http://yasobe.ru/na/buter#form_submit
//http://allduino.forum2x2.ru/t12-topic#17
//http://arduwir.netdo.ru/article/6264

При замкнутом термостате мигает 1 раз в 2 сек

При разомкнутом термостате и работающем насосе (до его отключения) 1 раз в сек

При отключеном насосе и нагреватели 1 раз в 3 сек

vovanagavana
Offline
Зарегистрирован: 29.03.2015

да все работает отлично БОЛЬШОЕ спасибо

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Подправил код (выровнял продолжительность вспышек индикатора независемо от периода).

#define pump_OUT 9//насос
#define heather_OUT 8//нагреватель
#define termostat_IN 2//термостат
#define StatLed 13//индикатор состояния
unsigned long timer =0;//таймер для задержки
unsigned long StatTime =0;//таймер инд состояния
#define pause 180000//задержка отключения насоса
#define ledON 250//продолжительность вспышки статуса <500
int pauseLed=0;//частота индикатора состояния

void setup() {
  pinMode(termostat_IN, INPUT);
  pinMode(pump_OUT, OUTPUT); 
  pinMode(heather_OUT, OUTPUT);
  pinMode(StatLed, OUTPUT);
}

void loop() {
  if (DIn(termostat_IN) == HIGH){//если термостат замкнут
    DOut (pump_OUT,HIGH);//включаем насос
    DOut (heather_OUT,HIGH);//включаем нагреватель
    PL(1000);//период мигания индикатора состояния 1с
  }

  if (DIn(heather_OUT)==HIGH && DIn(termostat_IN) == LOW){//выполняеться один раз для сброса таймера
    timer=millis();//начало отсчета задержки
    DOut(heather_OUT,LOW);// выключаем нагреватель
   PL(500);//период мигания индикатора состояния 0,5с
  }
  if (millis()-timer >= pause && DIn(heather_OUT)==LOW){
    DOut(pump_OUT,LOW); // выключаем насос
    PL(3000);//период мигания индикатора состояния 3с
  }

  if(millis()> StatTime){
    switch (DIn(StatLed)){//поверяем состояние индикатора
    case 0://если выключен
      StatTime=millis()+ledON;//устанавливаем время включенного состояния
      DOut(StatLed,1);//включаем
      break;
    case 1:
      StatTime=millis()+pauseLed;
      DOut(StatLed,0);
      break;
    }
  }
}//end LOOP
//-------изменение паузы между вспышками индикатора-------
void PL(unsigned int p){
    pauseLed=p-ledON;//период мигания индикатора
}

//-------функция переключения реле----------
void DOut (byte pin, boolean state){
  digitalWrite(pin,state);
}
//-------функция опроса цифровых входов----------
boolean DIn (byte pin){
  return digitalRead(pin);
}
//Спасибо yasobe.ru/na/buter#form_submit
//allduino.forum2x2.ru/t12-topic#17
//arduwir.netdo.ru/article/6264

При включеном насосе и тене 1 раз в сек.

При выключеном тене и включеном насосе 2 раза в сек.

При выключенном насосе и тене 1 раз в 3 сек.

Продолжительность вспышки 0,25 сек. в любом режиме.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Чуть изменил часть отвечающую за индикацию (уменьшил скетч).

#define pump_OUT 9//насос
#define heather_OUT 8//нагреватель
#define termostat_IN 2//термостат
#define StatLed 13//индикатор состояния
unsigned long timer =0;//таймер для задержки
unsigned long StatTime =0;//таймер инд состояния
#define pause 180000//задержка отключения насоса
#define ledON 250//продолжительность вспышки статуса <500
int pauseLed=3000;//период индикатора состояния

void setup() {
  pinMode(termostat_IN, INPUT);
  pinMode(pump_OUT, OUTPUT); 
  pinMode(heather_OUT, OUTPUT);
  pinMode(StatLed, OUTPUT);
}

void loop() {
  if (DIn(termostat_IN) == HIGH){//если термостат замкнут
    DOut (pump_OUT,HIGH);//включаем насос
    DOut (heather_OUT,HIGH);//включаем нагреватель
    pauseLed=1000;//период мигания индикатора состояния 1с
  }

  if (DIn(heather_OUT)==HIGH && DIn(termostat_IN) == LOW){//выполняеться один раз для сброса таймера
    timer=millis();//начало отсчета задержки
    DOut(heather_OUT,LOW);// выключаем нагреватель
    pauseLed=500;//период мигания индикатора состояния 0,5с
  }
  if (millis()-timer >= pause && DIn(heather_OUT)==LOW){
    DOut(pump_OUT,LOW); // выключаем насос
   pauseLed=3000;//период мигания индикатора состояния 3с
  }
  //----------Индикатор состояния-----------------------
  if (millis()-StatTime>=pauseLed){//если интервал прошел
    StatTime=millis();//засекаем снова
  }
  if(millis()<ledON+StatTime){//если время свечения индикатора не прошло
    DOut(StatLed,1);//включаем
  }
  else//иначе
  {
    DOut(StatLed,0);//выключаем
  }
}//end LOOP

//-------функция переключения реле----------
void DOut (byte pin, boolean state){
  digitalWrite(pin,state);
}
//-------функция опроса цифровых входов----------
boolean DIn (byte pin){
  return digitalRead(pin);
}
//Спасибо yasobe.ru/na/buter#form_submit