Управление дизельной тепловой пушкой.

hostman77
Offline
Зарегистрирован: 13.02.2015

Добрый день всем.

Имею в пользовании гараж. В нем установлена дизельная тепловая пушка ОВ-95 снятая с военной техники.

Принцип работы прост - открываем краник, нажимаем кнопку свечи накаливания, примерно через 10 сек. запускаем двигатель на минимальных оборотах который в свою очередь вращает вентилятор и топливный насос. Через пару минут, после прогрева печки, переводим обороты в максимум. Процедура остановки - отключили топливо, подождали пару минут пока камера сгорания продуется и остынет, выключаем двигатель. В печке есть два датчика, первый - датчик нагрева, который замыкается на массу когда печка начинает работать. Второй, датчик перегрева, который тоже замыкается на массу при слишком большой температуре выходящего воздуха.

Теперь по сути вопроса. Решил я это дело автоматизировать и сделать дистанционный запуск. В гараже есть GSM сигнализация у которой я планирую задействовать свободный канал на управление печкой. Самой печкой будет рулить Arduino через релейный модуль. Это вообще мое первое знакомство с Ардуиной, да и с микроконтролерами в целом. Прошу глянуть код, и по возможности дать свои рекомендации. Возможно все что я намутил, можно реализовать проще.

 

[
hostman77
Offline
Зарегистрирован: 13.02.2015
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#define ONE_WIRE_BUS 7 // OneWire на 7 пин
#define RELE_1 8 // Выход на 1 реле 8 пин, "Питание"
#define RELE_2 9 // Выход на 2 реле 9 пин, "Клапан"
#define RELE_3 10 // Выход на 3 реле 10 пин, "Обороты1"
#define RELE_4 11 // Выход на 4 реле 11 пин, "Обороты2"
#define RELE_5 12 // Выход на 5 реле 12 пин, "Свеча"
#define RELE_6 13 // Выход на 6 реле 13 пин
#define Ypr 0 // Вход управления на 0 пин
#define Dn 1 // Вход датчика нагрева на 1 пин
#define Dp 2 // Вход датчика перегрева на 2 пин
#define Ob 3 // Вход кнопки смены оборотов на 3 пин
#define Bp 4 // Вход кнопки блока питания на 4 пин
#define ON 0 
#define OFF 1
#define a 1 // Время включения клапана при старте, сек.
#define b 2 // Время включения свечи при старте, сек.
#define c 12 // Время включения оборотов MIN при старте, сек.
#define d 20 // Время выключения свечи при старте, сек.
#define e 60 // Время включения оборотов MAX при старте, сек.
#define f 90 // Длительность цикла запуска при старте, сек
#define g 60 // Время продувки печки при остановке, сек.
#define h 65 // Время отключения 12v при остановке, сек.
#define i 70 // Длительность цикла остановки
#define j 60 // Время остановки двигателя ALARM, сек.
#define k 65 // Время отключения питания ALARM, сек.
#define l 70 // Длительность цикла ALARM, сек.
#define m 30 // Время остановки двигателя NO FUEL, сек.
#define n 35 // Время отключения 12v NO FUEL, сек.
#define o 40 // Длительность цикла NO FUEL, сек.

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27,16,2); 
byte man_with_hat[8] =
{
  B01110,
  B11111,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B11111,
};
int R=OFF; // Вводим переменную для хранения режима работы и присваиваем ей выключенное состояние
int A=OFF; // Вводим переменную для хранения аварийного состояния и присваеваем ей выключенное состояние
int O; // Вводим переменную состояния оборотов
int U=OFF; // Вводим переменную состояния блока питания 12v

void setup(void)
{
  pinMode(RELE_1, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_2, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_3, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_4, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_5, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_6, OUTPUT); // Настраиваем пин как выход
  pinMode(Ypr, INPUT); // Настраиваем пин Ypr как вход
  digitalWrite(Ypr, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Dn, INPUT); // Настраиваем пин Dn как вход
  digitalWrite(Dn, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Dp, INPUT); // Настраиваем пин Dp как вход
  digitalWrite(Dp, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Ob, INPUT); // Настраиваем пин Ob как вход
  digitalWrite(Ob, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Bp, INPUT); // Настраиваем пин Bp как вход
 digitalWrite(Bp, HIGH); // Подтягиваем вход внутренним резистором

  digitalWrite(RELE_1, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_2, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_3, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_4, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_5, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_6, OFF); // Устанавливаем реле в выключенное состояние

  lcd.init(); // Инициируем дисплей
  lcd.backlight(); // Включаем подсветку
  lcd.createChar(1, man_with_hat); // Регистрируем собственный символы с кодом 1
  sensors.begin(); // Включаем термометры
  lcd.setCursor(0, 0); // Устанавливаем курсор
  lcd.print("Mode:"); // Выводим на дисплей "Mode:"
  lcd.setCursor(5, 0); // Устанавливаем курсор
  lcd.print("OFF"); // Выводим на дисплей "OFF"
}

void loop(void)
{ 
  sensors.requestTemperatures();
  // Начало процедуры отображения температуры
  lcd.setCursor(0, 1); // Индикация Т1
  lcd.print("T1=");
  int t1=sensors.getTempCByIndex(0);
  lcd.print(t1);
  lcd.print((char)223);
  lcd.print("C ");
  lcd.setCursor(8, 1); // Индикация Т2
  lcd.print("T2=");
  int t2=sensors.getTempCByIndex(1);
  lcd.print(t2);
  lcd.print((char)223);
  lcd.print("C ");
  // Конец процедуры отображения температуры



//******************************************************************************************
  // Начало процедуры аварийной остановки
  if(digitalRead(Dp)==ON&&R==ON) // Проверяем аварийный датчик перегрева
  {
    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    lcd.setCursor(11, 0); // Устанавливаем курсор
    lcd.print("MAX"); // Выводим на дисплей индикацию MAX оборотов
    digitalWrite(RELE_2, OFF); // Отключаем клапан
    lcd.setCursor(9, 0); // Устанавливаем курсор
    lcd.print(" "); // Гасим индикацию клапана
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("ALARM"); // Выводим на дисплей индикацию "ALARM"

    for(int x=0; x<l; x++) // Запускаем таймер, каждый цикл + 1 секунда
    {
      if (x==j) //Если x= j секунд, то
      {
        digitalWrite(RELE_4, OFF); // Отключаем обороты на j секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор
        lcd.print("   "); // Гасим индикацию оборотов
      }
      if (x==k) //Если x= k секунд, то
      {
        digitalWrite(RELE_1, OFF); // Отключаем блок питания на k секунде
        lcd.setCursor(15, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим индикацию батарейки
      }
      delay (1000); // Ждем 1 секунду

      // Начало процедуры отображения температуры
      lcd.setCursor(0, 1); // Индикация Т1
      lcd.print("T1=");
      int t1=sensors.getTempCByIndex(0);
      lcd.print(t1);
      lcd.print((char)223);
      lcd.print("C ");
      lcd.setCursor(8, 1); // Индикация Т2
      lcd.print("T2=");
      int t2=sensors.getTempCByIndex(1);
      lcd.print(t2);
      lcd.print((char)223);
      lcd.print("C ");
      // Конец процедуры отображения температуры
    }
    lcd.setCursor(0, 0); // Индикация режима ALARM
    lcd.print("     ALARM!     ");
    R=OFF;
    A=ON; // Ошибка из за перегрева
  }
  // Конец процедуры аварийной остановки
//***************************************************************************************

//***************************************************************************************
  // Начало процедуры запуска
  if(digitalRead(Ypr)==ON&&R==OFF&&A==OFF) // Проверяем условия запуска
  {
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("ON "); // Выводим на дисплей "ON"
    for(int x=0; x<f; x++) // Запускаем таймер, каждый цикл + 1 секунда
    {
      digitalWrite(RELE_1, ON); // Включаем блок питания
      lcd.setCursor(15, 0); // Индикация включения 12v
      lcd.print("\1"); // Выводим на дисплей символ батарейки
      if (x==a) // Если x= а секунд, то
      {
        digitalWrite(RELE_2, ON); // Включаем клапан на а секунде
        lcd.setCursor(9, 0); // Устанавливаем курсор
        lcd.print("K"); // Выводим на дисплей значек включения клапана
      }
      if (x==3) // Если x= b секунд, то
      {
        digitalWrite(RELE_5, ON); // Включаем свечу на b секунде
        lcd.setCursor(10, 0); // Устанавливаем курсор
        lcd.print("S"); // Выводим на дисплей значек включения свечи
      }
      if (x==c) //Если x= c секунд, то
      {
        digitalWrite(RELE_3, ON); // Включаем  обороты MIN на 15 секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор
        lcd.print("MIN"); // Выводим на дисплей индикацию MIN оборотов
      }
      if (x==d) //Если x= d секунд, то
      {
        digitalWrite(RELE_5, OFF); // Выключаем свечу на 25 секунде
        lcd.setCursor(10, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим на дисплее значек свечи
      }
      if (x==e) //Если x= e секунд, то
      {
        digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
        digitalWrite(RELE_4, ON);
        O=1; // Запоминаем что обороты в максимуме
        lcd.setCursor(11, 0); // Устанавливаем курсор
        lcd.print("MAX"); // Выводим на дисплей индикацию MAX оборотов
      }
      delay (1000); // Ждем 1 секунду

      // Начало процедуры отображения температуры
      lcd.setCursor(0, 1); // Индикация Т1
      lcd.print("T1=");
      int t1=sensors.getTempCByIndex(0);
      lcd.print(t1);
      lcd.print((char)223);
      lcd.print("C ");
      lcd.setCursor(8, 1); // Индикация Т2
      lcd.print("T2=");
      int t2=sensors.getTempCByIndex(1);
      lcd.print(t2);
      lcd.print((char)223);
      lcd.print("C ");
      // Конец процедуры отображения температуры
    }
    R=ON; // Запоминаем что печка запущена
  }
  // Конец процедуры запуска
//**************************************************************************************

//**************************************************************************************
  // Начало процедуры остановки
  if(digitalRead(Ypr)==OFF&&R==ON&&A==OFF) // Проверяем условия остановки
  {
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("OFF"); // Выводим на дисплей OFF вместо ON
    digitalWrite(RELE_2, OFF); // Отключаем клапан
    lcd.setCursor(9, 0); // Устанавливаем курсор
    lcd.print(" "); // Гасим индикацию клапана

    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    lcd.setCursor(11, 0); // Устанавливаем курсор
    lcd.print("MAX"); // Выводим на дисплей индикацию MAX оборотов

    for(int x=0; x<i; x++) // Запускаем таймер, каждый цикл + 1 секунда
    {
      if (x==g) //Если x= g секунд, то
      {
        digitalWrite(RELE_4, OFF); // Отключаем обороты на g секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор 
        lcd.print("   "); // Гасим индикацию оборотов
      }
      if (x==h)// Если x= h секунд, то
      {
        digitalWrite(RELE_1, OFF); // Отключаем блок питания на 15 секунде
        lcd.setCursor(15, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим значек батарейки
      }
      delay (1000); // Ждем 1 секунду
      // Начало процедуры отображения температуры
      lcd.setCursor(0, 1); // Индикация Т1
      lcd.print("T1=");
      int t1=sensors.getTempCByIndex(0);
      lcd.print(t1);
      lcd.print((char)223);
      lcd.print("C ");
      lcd.setCursor(8, 1); // Индикация Т2
      lcd.print("T2=");
      int t2=sensors.getTempCByIndex(1);
      lcd.print(t2);
      lcd.print((char)223);
      lcd.print("C ");
      // Конец процедуры отображения температуры
    }
    R=OFF; // Обозначаем что печка выключилась
  }
  // Конец процедуры остановки
//************************************************************************************

//************************************************************************************
  // Начало процедуры отключения при погасании
  if(digitalRead(Dn)==OFF&&R==ON&&A==OFF) // Проверяем условия отключения при погасании
  {
    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    lcd.setCursor(11, 0); // Устанавливаем курсор
    lcd.print("MAX"); // Выводим на дисплей индикацию оборотов MAX
    digitalWrite(RELE_2, OFF); // Отключаем клапан
    lcd.setCursor(9, 0); // Устанавливаем курсор
    lcd.print(" "); // Гасим индикацию клапана
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("FUEL"); // Выводим на дисплей индикацию "FUEL"

    for(int x=0; x<o; x++) // Запускаем таймер
    {
      if (x==m) //Если x= m секунд, то
      {
        digitalWrite(RELE_4, OFF); // Отключаем обороты на 10 секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор 
        lcd.print("   "); // Гасим индикацию оборотов
      }
      if (x==n) //Если x= n секунд, то
      {
        digitalWrite(RELE_1, OFF); // Отключаем блок питания на 15 секунде
        lcd.setCursor(15, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим индикацию питания
      }
      delay (1000); // Ждем 1 секунду
      // Начало процедуры отображения температуры
      lcd.setCursor(0, 1); // Индикация Т1
      lcd.print("T1=");
      int t1=sensors.getTempCByIndex(0);
      lcd.print(t1);
      lcd.print((char)223);
      lcd.print("C ");
      lcd.setCursor(8, 1); // Индикация Т2
      lcd.print("T2=");
      int t2=sensors.getTempCByIndex(1);
      lcd.print(t2);
      lcd.print((char)223);
      lcd.print("C ");
      // Конец процедуры отображения температуры
    }
    lcd.setCursor(0, 0); // Индикация режима NO FUEL
    lcd.print("    NO FUEL!    ");
    R=OFF;
    A=ON;
  }
  // Конец процедуры отключения при погасании
//***************************************************************************

//***************************************************************************
  // Процедура опроса кнопки смены оборотов
  if(digitalRead(Ob)==ON&&R==ON&&O==1) // Проверяем условия смены оборотов
  {
    digitalWrite(RELE_4, OFF); // Переключаем обороты в MIN
    digitalWrite(RELE_3, ON);
    O=0;
    delay (1000);
    lcd.setCursor(11, 0); // Индикация оборотов MIN
    lcd.print("MIN ");    
  }
  if(digitalRead(Ob)==ON&&R==ON&&O==0) // Проверяем условия смены оборотов
  {
    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    O=1;
    delay (1000); 
    lcd.setCursor(11, 0); // Индикация оборотов MAX
    lcd.print("MAX ");   
  }
  // Конец процедуры смены оборотов

  // Процедура опроса кнопки включения блока питания
  if(digitalRead(Bp)==ON&&R==OFF&&U==OFF) // Проверяем условия включения
  {
    digitalWrite(RELE_1, ON); // Переключаем обороты в MIN
    U=ON;
    delay (1000);
    lcd.setCursor(15, 0); // Индикация включения 12v
    lcd.print("\1");    
  }
  if(digitalRead(Bp)==ON&&R==OFF&&U==ON) // Проверяем условия смены оборотов
   {
    digitalWrite(RELE_1, OFF); // Переключаем обороты в MAX
    U=OFF;
    delay (1000); 
    lcd.setCursor(15, 0); // Индикация включения 12v
    lcd.print(" ");   
  }
  // Конец процедуры включения 12v
//************************************************************************

}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

при вставке длинных кодов на допвкладке ставьте галочку "сернуть код"

ОВ-95 - это которые стояли-стоят в кунгах 66, 131, камаз и др. ?

автоматика работает и хотите упростить код ? или ещё не подключали ?

hostman77
Offline
Зарегистрирован: 13.02.2015

Свернул.

Да, которые стояли на кунгах. 

Еще не подключал, пока все собрано на столе. Идет откатка.

Иногда при отработке кода аварийной остановки дисплей замусоривается кракозябрами.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

если система дистУправления то зачем дисплей ? при отладке выводите всё нужное в Srial-монитор, а переменные лучше обзывать сразу так, чтобы в коде было понятно

hostman77
Offline
Зарегистрирован: 13.02.2015

Ну не всегда же я ее дистанционно запускать буду.Родной то пульт на кондовых советских переключателях я выкидываю. Пришел в гараж, нажал кнопку старт и все. Никаких -нажмите это, подождите столько, переключите то.

 

А дисплей он наверное больше для красоты. Что бы видеть что происходит.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

красоту - после наладки конечного автомата :) , есть 4 комплекта скоммуниженных обогревателя, мне тоже такая штука может пригодиться :)

пока так...... 

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> 
#define ONE_WIRE_BUS 7      // OneWire на 7 пин
#define relayPOWER 8        // Выход на 1 реле 8 пин, "Питание"
#define relayVALVE 9        // Выход на 2 реле 9 пин, "Клапан"
#define relaySPEEDmin 10    // Выход на 3 реле 10 пин, "Обороты1"
#define relaySPEEDmax 11    // Выход на 4 реле 11 пин, "Обороты2"
#define relayGLOW 12        // Выход на 5 реле 12 пин, "Свеча"
#define RELE_6 13           // Выход на 6 реле 13 пин
#define pinStartStop 0      // Вход управления на 0 пин
#define sensorFLAME 1       // Вход датчика нагрева на 1 пин
#define sensorOVERheating 2 // Вход датчика перегрева на 2 пин
// зачем ?
//#define Ob 3 // Вход кнопки смены оборотов на 3 пин
//#define Bp 4 // Вход кнопки блока питания на 4 пин
// заменяем
//#define ON 0 
//#define OFF 1
boolean statusOnOff=0; // 0 - выкл, 1 - вкл
boolean statusAlarm=0; // 0 - норм, 1 - авария
boolean statusPower=0; // 0 - выкл, 1 - вкл
boolean statusSpeed=0; // 0 - мин, 1 - макс
#define tValve 1       // Время включения клапана при старте, сек.
#define tGlowOn 2      // Время включения свечи при старте, сек.
#define tGlowOn 20     // Время выключения свечи при старте, сек.
#define tSpeedmin 12   // Время включения оборотов MIN при старте, сек.
#define tGlowOn 20     // Время выключения свечи при старте, сек.
#define tSpeedmax 60   // Время включения оборотов MAX при старте, сек.
//#define f 90 // Длительность цикла запуска при старте, сек
#define tPurge 60      // Время продувки печки при остановке, сек.
//#define h 65 // Время отключения 12v при остановке, сек.
//#define i 70 // Длительность цикла остановки
//#define j 60 // Время остановки двигателя ALARM, сек.
//#define k 65 // Время отключения питания ALARM, сек.
//define l 70 // Длительность цикла ALARM, сек.
//#define m 30 // Время остановки двигателя NO FUEL, сек.
//#define n 35 // Время отключения 12v NO FUEL, сек.
//#define o 40 // Длительность цикла NO FUEL, сек.
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// уже есть boolean statusOnOff=0; // 0 - выкл, 1 - вкл
//int R=OFF; // Вводим переменную для хранения режима работы и присваиваем ей выключенное состояние
// уже есть boolean statusAlarm=0; // 0 - норм, 1 - авария
//int A=OFF; // Вводим переменную для хранения аварийного состояния и присваеваем ей выключенное состояние
// уже есть boolean statusSpeed=0; // 0 - мин, 1 - макс
//int O; // Вводим переменную состояния оборотов
// уже есть boolean statusPower=0; // 0 - выкл, 1 - вкл
//int U=OFF; // Вводим переменную состояния блока питания 12v
//==================================================================================================================
void setup(void)
{
// это
//  pinMode(RELE_1, OUTPUT); // Настраиваем пин как выход
//  pinMode(RELE_2, OUTPUT); // Настраиваем пин как выход
//  pinMode(RELE_3, OUTPUT); // Настраиваем пин как выход
//  pinMode(RELE_4, OUTPUT); // Настраиваем пин как выход
//  pinMode(RELE_5, OUTPUT); // Настраиваем пин как выход
//  pinMode(RELE_6, OUTPUT); // Настраиваем пин как выход
// и это
//  digitalWrite(RELE_1, OFF); // Устанавливаем реле в выключенное состояние
//  digitalWrite(RELE_2, OFF); // Устанавливаем реле в выключенное состояние
//  digitalWrite(RELE_3, OFF); // Устанавливаем реле в выключенное состояние
//  digitalWrite(RELE_4, OFF); // Устанавливаем реле в выключенное состояние
//  digitalWrite(RELE_5, OFF); // Устанавливаем реле в выключенное состояние
//  digitalWrite(RELE_6, OFF); // Устанавливаем реле в выключенное состояние
// можно заменить на
  DDRB=B00111111;
  PORTB=B00000000;
// http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry

// это
//  pinMode(Ypr, INPUT); // Настраиваем пин Ypr как вход
//  digitalWrite(Ypr, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(pinStartStop,INPUT);          // Настраиваем пин Ypr как вход                DDRD.0
  digitalWrite(pinStartStop, HIGH);     // Подтягиваем вход внутренним резистором      DDRD.0
//  pinMode(Dn, INPUT); // Настраиваем пин Dn как вход
//  digitalWrite(Dn, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(sensorFLAME, INPUT); // Настраиваем пин Dn как вход                          DDRD.1
  digitalWrite(sensorFLAME, HIGH); // Подтягиваем вход внутренним резистором           DDRD.1
//  pinMode(Dp, INPUT); // Настраиваем пин Dp как вход                    DDRD.2
//  digitalWrite(Dp, HIGH); // Подтягиваем вход внутренним резистором     DDRD.2
  pinMode(sensorOVERheating, INPUT); // Настраиваем пин Dp как вход                    DDRD.2
  digitalWrite(sensorOVERheating, HIGH); // Подтягиваем вход внутренним резистором     DDRD.2
//  pinMode(Ob, INPUT); // Настраиваем пин Ob как вход
//  digitalWrite(Ob, HIGH); // Подтягиваем вход внутренним резистором  
//  pinMode(Bp, INPUT); // Настраиваем пин Bp как вход
//  digitalWrite(Bp, HIGH); // Подтягиваем вход внутренним резистором
// можно заменить на
  DDRD=B00000000;
  PORTD=B00000111;

//  lcd.init(); // Инициируем дисплей
//  lcd.backlight(); // Включаем подсветку
//  lcd.createChar(1, man_with_hat); // Регистрируем собственный символы с кодом 1
//  sensors.begin(); // Включаем термометры
//  lcd.setCursor(0, 0); // Устанавливаем курсор
//  lcd.print("Mode:"); // Выводим на дисплей "Mode:"
//  lcd.setCursor(5, 0); // Устанавливаем курсор
//  lcd.print("OFF"); // Выводим на дисплей "OFF"
}
//==================================================================================================================
void loop(void)

если использовать датчик t воздуха - то зачем ДУ ? t < 12 - включить , t > 18 - выключить , при нахождении на объекте включили тумблерок "люди" - t < 18 - включить , t > 24 - выключить , перед уходом - тумблер в положение "неЛюди" :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

время включения свечи накала - вообще-то контролируется по накалу контрольной спирали на блоке управления....

вы просто выбрали среднее время для накала ? 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

разделение на задачи....

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#define ONE_WIRE_BUS 7 // OneWire на 7 пин
#define RELE_1 8 // Выход на 1 реле 8 пин, "Питание"
#define RELE_2 9 // Выход на 2 реле 9 пин, "Клапан"
#define RELE_3 10 // Выход на 3 реле 10 пин, "Обороты1"
#define RELE_4 11 // Выход на 4 реле 11 пин, "Обороты2"
#define RELE_5 12 // Выход на 5 реле 12 пин, "Свеча"
#define RELE_6 13 // Выход на 6 реле 13 пин
#define Ypr 0 // Вход управления на 0 пин
#define Dn 1 // Вход датчика нагрева на 1 пин
#define Dp 2 // Вход датчика перегрева на 2 пин
#define Ob 3 // Вход кнопки смены оборотов на 3 пин
#define Bp 4 // Вход кнопки блока питания на 4 пин
#define ON 0 
#define OFF 1
#define a 1 // Время включения клапана при старте, сек.
#define b 2 // Время включения свечи при старте, сек.
#define c 12 // Время включения оборотов MIN при старте, сек.
#define d 20 // Время выключения свечи при старте, сек.
#define e 60 // Время включения оборотов MAX при старте, сек.
#define f 90 // Длительность цикла запуска при старте, сек
#define g 60 // Время продувки печки при остановке, сек.
#define h 65 // Время отключения 12v при остановке, сек.
#define i 70 // Длительность цикла остановки
#define j 60 // Время остановки двигателя ALARM, сек.
#define k 65 // Время отключения питания ALARM, сек.
#define l 70 // Длительность цикла ALARM, сек.
#define m 30 // Время остановки двигателя NO FUEL, сек.
#define n 35 // Время отключения 12v NO FUEL, сек.
#define o 40 // Длительность цикла NO FUEL, сек.

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27,16,2); 
byte man_with_hat[8] =
{
  B01110,
  B11111,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B11111,
};
int R=OFF; // Вводим переменную для хранения режима работы и присваиваем ей выключенное состояние
int A=OFF; // Вводим переменную для хранения аварийного состояния и присваеваем ей выключенное состояние
int O; // Вводим переменную состояния оборотов
int U=OFF; // Вводим переменную состояния блока питания 12v

void setup(void)
{
  pinMode(RELE_1, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_2, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_3, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_4, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_5, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_6, OUTPUT); // Настраиваем пин как выход
  pinMode(Ypr, INPUT); // Настраиваем пин Ypr как вход
  digitalWrite(Ypr, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Dn, INPUT); // Настраиваем пин Dn как вход
  digitalWrite(Dn, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Dp, INPUT); // Настраиваем пин Dp как вход
  digitalWrite(Dp, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Ob, INPUT); // Настраиваем пин Ob как вход
  digitalWrite(Ob, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Bp, INPUT); // Настраиваем пин Bp как вход
 digitalWrite(Bp, HIGH); // Подтягиваем вход внутренним резистором

  digitalWrite(RELE_1, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_2, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_3, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_4, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_5, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_6, OFF); // Устанавливаем реле в выключенное состояние

  lcd.init(); // Инициируем дисплей
  lcd.backlight(); // Включаем подсветку
  lcd.createChar(1, man_with_hat); // Регистрируем собственный символы с кодом 1
  sensors.begin(); // Включаем термометры
  lcd.setCursor(0, 0); // Устанавливаем курсор
  lcd.print("Mode:"); // Выводим на дисплей "Mode:"
  lcd.setCursor(5, 0); // Устанавливаем курсор
  lcd.print("OFF"); // Выводим на дисплей "OFF"
}

void loop(void)
{ 
  GetTemperatures();

  GetStopAlarm();

  GetStart();

  GetStop();
  
  GetExtinction();

  SetSpeed();

  SetPower();
}
//***************** процедура отображения температуры *****************************************************
void GetTemperatures()
{
  sensors.requestTemperatures();
  lcd.setCursor(0, 1); // Индикация Т1
  lcd.print("T1=");
  int t1=sensors.getTempCByIndex(0);
  lcd.print(t1);
  lcd.print((char)223);
  lcd.print("C ");
  lcd.setCursor(8, 1); // Индикация Т2
  lcd.print("T2=");
  int t2=sensors.getTempCByIndex(1);
  lcd.print(t2);
  lcd.print((char)223);
  lcd.print("C ");
}
//***************** процедура аварийной остановки *********************************************************
void GetStopAlarm()
{
  if(digitalRead(Dp)==ON&&R==ON) // Проверяем аварийный датчик перегрева
  {
    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    lcd.setCursor(11, 0); // Устанавливаем курсор
    lcd.print("MAX"); // Выводим на дисплей индикацию MAX оборотов
    digitalWrite(RELE_2, OFF); // Отключаем клапан
    lcd.setCursor(9, 0); // Устанавливаем курсор
    lcd.print(" "); // Гасим индикацию клапана
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("ALARM"); // Выводим на дисплей индикацию "ALARM"

    for(int x=0; x<l; x++) // Запускаем таймер, каждый цикл + 1 секунда
    {
      if (x==j) //Если x= j секунд, то
      {
        digitalWrite(RELE_4, OFF); // Отключаем обороты на j секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор
        lcd.print("   "); // Гасим индикацию оборотов
      }
      if (x==k) //Если x= k секунд, то
      {
        digitalWrite(RELE_1, OFF); // Отключаем блок питания на k секунде
        lcd.setCursor(15, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим индикацию батарейки
      }
      delay (1000); // Ждем 1 секунду
      
  GetTemperatures();

    }
    lcd.setCursor(0, 0); // Индикация режима ALARM
    lcd.print("     ALARM!     ");
    R=OFF;
    A=ON; // Ошибка из за перегрева
  }
}
//***************** процедура запуска *********************************************************************
void GetStart()
{
  if(digitalRead(Ypr)==ON&&R==OFF&&A==OFF) // Проверяем условия запуска
  {
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("ON "); // Выводим на дисплей "ON"
    for(int x=0; x<f; x++) // Запускаем таймер, каждый цикл + 1 секунда
    {
      digitalWrite(RELE_1, ON); // Включаем блок питания
      lcd.setCursor(15, 0); // Индикация включения 12v
      lcd.print("\1"); // Выводим на дисплей символ батарейки
      if (x==a) // Если x= а секунд, то
      {
        digitalWrite(RELE_2, ON); // Включаем клапан на а секунде
        lcd.setCursor(9, 0); // Устанавливаем курсор
        lcd.print("K"); // Выводим на дисплей значек включения клапана
      }
      if (x==3) // Если x= b секунд, то
      {
        digitalWrite(RELE_5, ON); // Включаем свечу на b секунде
        lcd.setCursor(10, 0); // Устанавливаем курсор
        lcd.print("S"); // Выводим на дисплей значек включения свечи
      }
      if (x==c) //Если x= c секунд, то
      {
        digitalWrite(RELE_3, ON); // Включаем  обороты MIN на 15 секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор
        lcd.print("MIN"); // Выводим на дисплей индикацию MIN оборотов
      }
      if (x==d) //Если x= d секунд, то
      {
        digitalWrite(RELE_5, OFF); // Выключаем свечу на 25 секунде
        lcd.setCursor(10, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим на дисплее значек свечи
      }
      if (x==e) //Если x= e секунд, то
      {
        digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
        digitalWrite(RELE_4, ON);
        O=1; // Запоминаем что обороты в максимуме
        lcd.setCursor(11, 0); // Устанавливаем курсор
        lcd.print("MAX"); // Выводим на дисплей индикацию MAX оборотов
      }
      delay (1000); // Ждем 1 секунду

  GetTemperatures();
  
    }
    R=ON; // Запоминаем что печка запущена
  }
}
//***************** процедура останова ********************************************************************
void GetStop()
{
  if(digitalRead(Ypr)==OFF&&R==ON&&A==OFF) // Проверяем условия остановки
  {
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("OFF"); // Выводим на дисплей OFF вместо ON
    digitalWrite(RELE_2, OFF); // Отключаем клапан
    lcd.setCursor(9, 0); // Устанавливаем курсор
    lcd.print(" "); // Гасим индикацию клапана

    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    lcd.setCursor(11, 0); // Устанавливаем курсор
    lcd.print("MAX"); // Выводим на дисплей индикацию MAX оборотов

    for(int x=0; x<i; x++) // Запускаем таймер, каждый цикл + 1 секунда
    {
      if (x==g) //Если x= g секунд, то
      {
        digitalWrite(RELE_4, OFF); // Отключаем обороты на g секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор 
        lcd.print("   "); // Гасим индикацию оборотов
      }
      if (x==h)// Если x= h секунд, то
      {
        digitalWrite(RELE_1, OFF); // Отключаем блок питания на 15 секунде
        lcd.setCursor(15, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим значек батарейки
      }
      delay (1000); // Ждем 1 секунду
      
  GetTemperatures();
  
    }
    R=OFF; // Обозначаем что печка выключилась
  }
}
//***************** процедура отключения при погасании ****************************************************
void GetExtinction()
{
  if(digitalRead(Dn)==OFF&&R==ON&&A==OFF) // Проверяем условия отключения при погасании
  {
    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    lcd.setCursor(11, 0); // Устанавливаем курсор
    lcd.print("MAX"); // Выводим на дисплей индикацию оборотов MAX
    digitalWrite(RELE_2, OFF); // Отключаем клапан
    lcd.setCursor(9, 0); // Устанавливаем курсор
    lcd.print(" "); // Гасим индикацию клапана
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("FUEL"); // Выводим на дисплей индикацию "FUEL"

    for(int x=0; x<o; x++) // Запускаем таймер
    {
      if (x==m) //Если x= m секунд, то
      {
        digitalWrite(RELE_4, OFF); // Отключаем обороты на 10 секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор 
        lcd.print("   "); // Гасим индикацию оборотов
      }
      if (x==n) //Если x= n секунд, то
      {
        digitalWrite(RELE_1, OFF); // Отключаем блок питания на 15 секунде
        lcd.setCursor(15, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим индикацию питания
      }
      delay (1000); // Ждем 1 секунду
      
  GetTemperatures();
  
    }
    lcd.setCursor(0, 0); // Индикация режима NO FUEL
    lcd.print("    NO FUEL!    ");
    R=OFF;
    A=ON;
  }
}
//***************** процедура опроса кнопки смены оборотов ************************************************
void GetExtinction()
{
  if(digitalRead(Ob)==ON&&R==ON&&O==1) // Проверяем условия смены оборотов
  {
    digitalWrite(RELE_4, OFF); // Переключаем обороты в MIN
    digitalWrite(RELE_3, ON);
    O=0;
    delay (1000);
    lcd.setCursor(11, 0); // Индикация оборотов MIN
    lcd.print("MIN ");    
  }
  if(digitalRead(Ob)==ON&&R==ON&&O==0) // Проверяем условия смены оборотов
  {
    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    O=1;
    delay (1000); 
    lcd.setCursor(11, 0); // Индикация оборотов MAX
    lcd.print("MAX ");   
  }
}
//***************** процедура опроса кнопки включения блока питания ***************************************
void SetPower()
{
  if(digitalRead(Bp)==ON&&R==OFF&&U==OFF) // Проверяем условия включения
  {
    digitalWrite(RELE_1, ON); // Переключаем обороты в MIN
    U=ON;
    delay (1000);
    lcd.setCursor(15, 0); // Индикация включения 12v
    lcd.print("\1");    
  }
  if(digitalRead(Bp)==ON&&R==OFF&&U==ON) // Проверяем условия смены оборотов
   {
    digitalWrite(RELE_1, OFF); // Переключаем обороты в MAX
    U=OFF;
    delay (1000); 
    lcd.setCursor(15, 0); // Индикация включения 12v
    lcd.print(" ");   
  }
}
//*********************************************************************************************************#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#define ONE_WIRE_BUS 7 // OneWire на 7 пин
#define RELE_1 8 // Выход на 1 реле 8 пин, "Питание"
#define RELE_2 9 // Выход на 2 реле 9 пин, "Клапан"
#define RELE_3 10 // Выход на 3 реле 10 пин, "Обороты1"
#define RELE_4 11 // Выход на 4 реле 11 пин, "Обороты2"
#define RELE_5 12 // Выход на 5 реле 12 пин, "Свеча"
#define RELE_6 13 // Выход на 6 реле 13 пин
#define Ypr 0 // Вход управления на 0 пин
#define Dn 1 // Вход датчика нагрева на 1 пин
#define Dp 2 // Вход датчика перегрева на 2 пин
#define Ob 3 // Вход кнопки смены оборотов на 3 пин
#define Bp 4 // Вход кнопки блока питания на 4 пин
#define ON 0 
#define OFF 1
#define a 1 // Время включения клапана при старте, сек.
#define b 2 // Время включения свечи при старте, сек.
#define c 12 // Время включения оборотов MIN при старте, сек.
#define d 20 // Время выключения свечи при старте, сек.
#define e 60 // Время включения оборотов MAX при старте, сек.
#define f 90 // Длительность цикла запуска при старте, сек
#define g 60 // Время продувки печки при остановке, сек.
#define h 65 // Время отключения 12v при остановке, сек.
#define i 70 // Длительность цикла остановки
#define j 60 // Время остановки двигателя ALARM, сек.
#define k 65 // Время отключения питания ALARM, сек.
#define l 70 // Длительность цикла ALARM, сек.
#define m 30 // Время остановки двигателя NO FUEL, сек.
#define n 35 // Время отключения 12v NO FUEL, сек.
#define o 40 // Длительность цикла NO FUEL, сек.

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27,16,2); 
byte man_with_hat[8] =
{
  B01110,
  B11111,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B11111,
};
int R=OFF; // Вводим переменную для хранения режима работы и присваиваем ей выключенное состояние
int A=OFF; // Вводим переменную для хранения аварийного состояния и присваеваем ей выключенное состояние
int O; // Вводим переменную состояния оборотов
int U=OFF; // Вводим переменную состояния блока питания 12v

void setup(void)
{
  pinMode(RELE_1, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_2, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_3, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_4, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_5, OUTPUT); // Настраиваем пин как выход
  pinMode(RELE_6, OUTPUT); // Настраиваем пин как выход
  pinMode(Ypr, INPUT); // Настраиваем пин Ypr как вход
  digitalWrite(Ypr, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Dn, INPUT); // Настраиваем пин Dn как вход
  digitalWrite(Dn, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Dp, INPUT); // Настраиваем пин Dp как вход
  digitalWrite(Dp, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Ob, INPUT); // Настраиваем пин Ob как вход
  digitalWrite(Ob, HIGH); // Подтягиваем вход внутренним резистором
  pinMode(Bp, INPUT); // Настраиваем пин Bp как вход
 digitalWrite(Bp, HIGH); // Подтягиваем вход внутренним резистором

  digitalWrite(RELE_1, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_2, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_3, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_4, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_5, OFF); // Устанавливаем реле в выключенное состояние
  digitalWrite(RELE_6, OFF); // Устанавливаем реле в выключенное состояние

  lcd.init(); // Инициируем дисплей
  lcd.backlight(); // Включаем подсветку
  lcd.createChar(1, man_with_hat); // Регистрируем собственный символы с кодом 1
  sensors.begin(); // Включаем термометры
  lcd.setCursor(0, 0); // Устанавливаем курсор
  lcd.print("Mode:"); // Выводим на дисплей "Mode:"
  lcd.setCursor(5, 0); // Устанавливаем курсор
  lcd.print("OFF"); // Выводим на дисплей "OFF"
}

void loop(void)
{ 
  GetTemperatures();

  GetStopAlarm();

  GetStart();

  GetStop();
  
  GetExtinction();

  SetSpeed();

  SetPower();
}
//***************** процедура отображения температуры *****************************************************
void GetTemperatures()
{
  sensors.requestTemperatures();
  lcd.setCursor(0, 1); // Индикация Т1
  lcd.print("T1=");
  int t1=sensors.getTempCByIndex(0);
  lcd.print(t1);
  lcd.print((char)223);
  lcd.print("C ");
  lcd.setCursor(8, 1); // Индикация Т2
  lcd.print("T2=");
  int t2=sensors.getTempCByIndex(1);
  lcd.print(t2);
  lcd.print((char)223);
  lcd.print("C ");
}
//***************** процедура аварийной остановки *********************************************************
void GetStopAlarm()
{
  if(digitalRead(Dp)==ON&&R==ON) // Проверяем аварийный датчик перегрева
  {
    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    lcd.setCursor(11, 0); // Устанавливаем курсор
    lcd.print("MAX"); // Выводим на дисплей индикацию MAX оборотов
    digitalWrite(RELE_2, OFF); // Отключаем клапан
    lcd.setCursor(9, 0); // Устанавливаем курсор
    lcd.print(" "); // Гасим индикацию клапана
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("ALARM"); // Выводим на дисплей индикацию "ALARM"

    for(int x=0; x<l; x++) // Запускаем таймер, каждый цикл + 1 секунда
    {
      if (x==j) //Если x= j секунд, то
      {
        digitalWrite(RELE_4, OFF); // Отключаем обороты на j секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор
        lcd.print("   "); // Гасим индикацию оборотов
      }
      if (x==k) //Если x= k секунд, то
      {
        digitalWrite(RELE_1, OFF); // Отключаем блок питания на k секунде
        lcd.setCursor(15, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим индикацию батарейки
      }
      delay (1000); // Ждем 1 секунду
      
  GetTemperatures();

    }
    lcd.setCursor(0, 0); // Индикация режима ALARM
    lcd.print("     ALARM!     ");
    R=OFF;
    A=ON; // Ошибка из за перегрева
  }
}
//***************** процедура запуска *********************************************************************
void GetStart()
{
  if(digitalRead(Ypr)==ON&&R==OFF&&A==OFF) // Проверяем условия запуска
  {
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("ON "); // Выводим на дисплей "ON"
    for(int x=0; x<f; x++) // Запускаем таймер, каждый цикл + 1 секунда
    {
      digitalWrite(RELE_1, ON); // Включаем блок питания
      lcd.setCursor(15, 0); // Индикация включения 12v
      lcd.print("\1"); // Выводим на дисплей символ батарейки
      if (x==a) // Если x= а секунд, то
      {
        digitalWrite(RELE_2, ON); // Включаем клапан на а секунде
        lcd.setCursor(9, 0); // Устанавливаем курсор
        lcd.print("K"); // Выводим на дисплей значек включения клапана
      }
      if (x==3) // Если x= b секунд, то
      {
        digitalWrite(RELE_5, ON); // Включаем свечу на b секунде
        lcd.setCursor(10, 0); // Устанавливаем курсор
        lcd.print("S"); // Выводим на дисплей значек включения свечи
      }
      if (x==c) //Если x= c секунд, то
      {
        digitalWrite(RELE_3, ON); // Включаем  обороты MIN на 15 секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор
        lcd.print("MIN"); // Выводим на дисплей индикацию MIN оборотов
      }
      if (x==d) //Если x= d секунд, то
      {
        digitalWrite(RELE_5, OFF); // Выключаем свечу на 25 секунде
        lcd.setCursor(10, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим на дисплее значек свечи
      }
      if (x==e) //Если x= e секунд, то
      {
        digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
        digitalWrite(RELE_4, ON);
        O=1; // Запоминаем что обороты в максимуме
        lcd.setCursor(11, 0); // Устанавливаем курсор
        lcd.print("MAX"); // Выводим на дисплей индикацию MAX оборотов
      }
      delay (1000); // Ждем 1 секунду

  GetTemperatures();
  
    }
    R=ON; // Запоминаем что печка запущена
  }
}
//***************** процедура останова ********************************************************************
void GetStop()
{
  if(digitalRead(Ypr)==OFF&&R==ON&&A==OFF) // Проверяем условия остановки
  {
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("OFF"); // Выводим на дисплей OFF вместо ON
    digitalWrite(RELE_2, OFF); // Отключаем клапан
    lcd.setCursor(9, 0); // Устанавливаем курсор
    lcd.print(" "); // Гасим индикацию клапана

    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    lcd.setCursor(11, 0); // Устанавливаем курсор
    lcd.print("MAX"); // Выводим на дисплей индикацию MAX оборотов

    for(int x=0; x<i; x++) // Запускаем таймер, каждый цикл + 1 секунда
    {
      if (x==g) //Если x= g секунд, то
      {
        digitalWrite(RELE_4, OFF); // Отключаем обороты на g секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор 
        lcd.print("   "); // Гасим индикацию оборотов
      }
      if (x==h)// Если x= h секунд, то
      {
        digitalWrite(RELE_1, OFF); // Отключаем блок питания на 15 секунде
        lcd.setCursor(15, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим значек батарейки
      }
      delay (1000); // Ждем 1 секунду
      
  GetTemperatures();
  
    }
    R=OFF; // Обозначаем что печка выключилась
  }
}
//***************** процедура отключения при погасании ****************************************************
void GetExtinction()
{
  if(digitalRead(Dn)==OFF&&R==ON&&A==OFF) // Проверяем условия отключения при погасании
  {
    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    lcd.setCursor(11, 0); // Устанавливаем курсор
    lcd.print("MAX"); // Выводим на дисплей индикацию оборотов MAX
    digitalWrite(RELE_2, OFF); // Отключаем клапан
    lcd.setCursor(9, 0); // Устанавливаем курсор
    lcd.print(" "); // Гасим индикацию клапана
    lcd.setCursor(5, 0); // Устанавливаем курсор
    lcd.print("FUEL"); // Выводим на дисплей индикацию "FUEL"

    for(int x=0; x<o; x++) // Запускаем таймер
    {
      if (x==m) //Если x= m секунд, то
      {
        digitalWrite(RELE_4, OFF); // Отключаем обороты на 10 секунде
        lcd.setCursor(11, 0); // Устанавливаем курсор 
        lcd.print("   "); // Гасим индикацию оборотов
      }
      if (x==n) //Если x= n секунд, то
      {
        digitalWrite(RELE_1, OFF); // Отключаем блок питания на 15 секунде
        lcd.setCursor(15, 0); // Устанавливаем курсор
        lcd.print(" "); // Гасим индикацию питания
      }
      delay (1000); // Ждем 1 секунду
      
  GetTemperatures();
  
    }
    lcd.setCursor(0, 0); // Индикация режима NO FUEL
    lcd.print("    NO FUEL!    ");
    R=OFF;
    A=ON;
  }
}
//***************** процедура опроса кнопки смены оборотов ************************************************
void GetExtinction()
{
  if(digitalRead(Ob)==ON&&R==ON&&O==1) // Проверяем условия смены оборотов
  {
    digitalWrite(RELE_4, OFF); // Переключаем обороты в MIN
    digitalWrite(RELE_3, ON);
    O=0;
    delay (1000);
    lcd.setCursor(11, 0); // Индикация оборотов MIN
    lcd.print("MIN ");    
  }
  if(digitalRead(Ob)==ON&&R==ON&&O==0) // Проверяем условия смены оборотов
  {
    digitalWrite(RELE_3, OFF); // Переключаем обороты в MAX
    digitalWrite(RELE_4, ON);
    O=1;
    delay (1000); 
    lcd.setCursor(11, 0); // Индикация оборотов MAX
    lcd.print("MAX ");   
  }
}
//***************** процедура опроса кнопки включения блока питания ***************************************
void SetPower()
{
  if(digitalRead(Bp)==ON&&R==OFF&&U==OFF) // Проверяем условия включения
  {
    digitalWrite(RELE_1, ON); // Переключаем обороты в MIN
    U=ON;
    delay (1000);
    lcd.setCursor(15, 0); // Индикация включения 12v
    lcd.print("\1");    
  }
  if(digitalRead(Bp)==ON&&R==OFF&&U==ON) // Проверяем условия смены оборотов
   {
    digitalWrite(RELE_1, OFF); // Переключаем обороты в MAX
    U=OFF;
    delay (1000); 
    lcd.setCursor(15, 0); // Индикация включения 12v
    lcd.print(" ");   
  }
}
//*********************************************************************************************************

но так тоже неправильно, в лупе надо проверять какие-то условия и опрос кнопок - по результатам вызывать процедуры ( подпрограммы )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

что у вас на новом пульте ? я бы сделал :

- кнопка принудительного старт-стопа ( включение/выключение питания ОВ внутри подпрограммы ) - не обязательно

- кнопка принудительной установки скорости вентилятора ( лучше её устанавливать в зависимости от текущей t и заданной t - чем меньше разница, тем меньше скорость ) , т.е. - кнопка не нужна

- кнопка "режим по t" - выдерживать t 10....18 или 20....24

- кнопки "меню" для задания установок t, режимов и др. с сохраненим в памяти - это не скоро, не сразу

итого - одна кнопка-тумблер - "присутствие" - ON/OFF

реле :

- питание на ОВ

- топливо

- накал

- скорость мин

- скорость мин

датчики :

- горение

- перегрев

GSM сигнализация у которой я планирую задействовать свободный канал

у него на выходе какой сигнал ? импульс, потенциал ?

hostman77
Offline
Зарегистрирован: 13.02.2015

У GSM сигналки свободно одно реле, которым я могу управлять по телефону. 

На пульте будут:

1. Тумблер включения (к нему шлейф от контактов реле сигналки в паралель, получится печку можно или с сигналки запускать или с тумблера),

2. Кнопка без фиксации для смены оборотов (надо что бы их можно было в ручном режиме менять, иногда шум печки мешает, я ее принудительно в малые обороты перевожу, а иногда канистру с водой в поток воздуха ставлю, что бы быстрее разогрелась, в максимум переключаю).

3. Кнопка без фиксации для запуска блока питания без старта печки (в щите отдельный блок питания импульсный 13,6в, 30а для питания самой печки. От него сделан вывод на наружние клеймы, иногда использую для зарядки аккумуляторов).

По реле и датчикам все так и есть как Вы сказали.

Запуск по датчику температуры не нужен. Когда собрался идти в гараж поковыряться с машиной или мотоциклом, дистанционно запустил за пару часов до прихода и красота. 

И спасибо за правку кода. Я многих команд не знаю, будем изучать.

З.Ы. Я кажется понял причину кракозябр и зависаний ардуинки. Зря я D0 и D1 задействовал. Завтра перекину на D5 и D6.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

1 - этот тумблер не нужен, ардуина питается от своего источника ( желательно с резервом от АКБ )

и включает питание 220 на блок питания импульсный через реле_POWER1  и включает питание +13,6 V на печку через реле_POWER2 ( или одно реле с 2-мя рабочими группами контактов )

2 - не помешает

3 - нужен именно тумблер с 2-мя рабочими группами контактов ( как в 1, только 2-ая группа подаёт +13,6 V на клеммы для собственных нужд

да, пины RX, TX лучше не использовать

схему нарисовали уже ? или всё в голове ?

hostman77
Offline
Зарегистрирован: 13.02.2015

1 - Как это не нужен тумблер? У меня тумблер сидит паралельно контактам реле сигналки. При включении  или реле или тумблера пин Ypr замыкается с GND. Т.е. логический 0. Это и есть команда на запуск печки.

Схема уже собрана на монтажной пластине которая идет в комплекте со щитом.

hostman77
Offline
Зарегистрирован: 13.02.2015

Вообще система организована так:

Ардуинка питается своим импульсным источником 7 вольт.

8-и канальный релейный модуль с гальванической развязкой питается другим источником 5 вольт.

В связи с тем что максимальный ток реле которые на модуле всего 10 ампер, на пластине стоит 3 автомобильных реле на 30 ампер.

Соответсвенно Ардуинка и релейный модуль всегда включены. Блок питания 13,6 вольт включается напрямую релюшкой модуля. Топливный клапан печки тоже напрямую релюшкой модуля. А вот двигатель и свеча накала через силовые автомобильные реле.

Так что тумблер 1 у меня для подачи команды включения или выключения на пин, а не для обесточивания Ардуины. Ардуина всегда включена.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

реле сигналки по команде "Вкл." замыкает котакты ( параллельные тумблеру ) до команды "Выкл." ?

схему можете прислать , чтобы говорить об одном и том же ? 

hostman77
Offline
Зарегистрирован: 13.02.2015

Блин, не рисовал я схему.

 

Да, реле сигналки по команде замыкает контакты. И будет держать их замкнутые пока я не позвоню и не дам команду отключить реле. Тумблер подключен паралельно контактам.

Т.е. если реле или тумблер включается, то пин Ypr принимает значение 0. Ардуинка при совпадении остальных условий прекращает опрос управляющего входа и начинает цикл запуска печки. По окончании цикла опрос входов восстанавливается. Если реле или тумблер разомкнуть (пин Ypr подтянут внутренним резистором к +5в ) то пин Ypr принимает значение 1 и начинается цикл остановки.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

понял, спасибо.... щас не в форме...   :(

схему мине рисовать ? :) хорошо, продуюсь на второй скорости - нарисую, может быть.... :)

geksogen
Offline
Зарегистрирован: 08.02.2019

Здравствуйте. Код рабочий или по мере эксплуатации что то менялось?

P.S. Попробовал скомпилировать, IDE ошибок много навыдавала, кто поможет поправить  код?

P.S.P.S. В последнем примере код дублируется дважды, обрезал "лишнее", прошёл компиляцию.

Придут компоненты с Китая, буду дальше разбираться.

FAI4
Offline
Зарегистрирован: 23.09.2016

А если солярки много вылилосьь и потом пожар произошел.

Здесь как ардуино поможет?

SLKH
Offline
Зарегистрирован: 17.08.2015

Идея дистанционного включения и самостоятельной (без присмотра) работы упомянутой установки представляется мне крайне сомнительной.

geksogen
Offline
Зарегистрирован: 08.02.2019

Да никто в здравом уме не собирается оставлять такую печку без присмотра, пожалуйста, не переживайте.

SLKH
Offline
Зарегистрирован: 17.08.2015

geksogen пишет:
Да никто в здравом уме не собирается оставлять такую печку без присмотра, пожалуйста, не переживайте.

" и сделать дистанционный запуск. В гараже есть GSM сигнализация у которой я планирую задействовать свободный канал на управление печкой. Самой печкой будет рулить Arduino через релейный модуль."

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

SLKH пишет:

Идея дистанционного включения и самостоятельной (без присмотра) работы упомянутой установки представляется мне крайне сомнительной.

Да, тебе представляется так... мне НЕТ!

Есть куча вебаст и эбершпехеров, которые работают автономно уже МНОГО лет на технике. И ниЧо)))

По поводу дурдуины и иже с ней... Если ВСЁ сделать по правилам - всё буит классно. Ежли из дурдуины, макетор и прочего хлама - овноипалки!

ДуМаЕм!!!!!!!!!!!!!!!!!!!!

geksogen
Offline
Зарегистрирован: 08.02.2019

#define Dn 1 // Вход датчика нагрева на 1 пин - кто может пояснить, в коде подразумевают термопары? Далласы тут просто для контроля температуры в помещении?

geksogen
Offline
Зарегистрирован: 08.02.2019

Друзья, помогите с кодом.
Датчика нагрева в моей печке нет, хочу заметить его на термопару.
Логика такая - включаем печку, выходим на режим работы. Например 200°с. Далее если температура начнёт снижаться (нет пламени) отслеживаем и приводим в действие процедуру отключения при погасании.
Для себя вижу трудность в том что присутствует:
гуляние температуры при считывании с термопары;
определенное гуляние температуры самой печки.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Имхо может датчик пламени готовый взять с печки какой нибудь. Ебер или планар