Проект отопительного котла.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

Здравствуйте. Хотел попросить совет как можно перезагрузить весю программу по значению канала. 

Котел газовый самодельный. 
последовательность действий.
1. Вентиляция например 5 мин.
2. Индикация готовности. (после вентиляции контроллер должен ждать нажатия кнопки)
3. Кнопка запуска искры и клапана искры факела.
4. если фоторезистор видит пляме в котле он открывает клапан основной горелки.
 
Задача в том что если в момет горения по каким то причинам пропало пламе в котле то весь цикл должен пройти заново.
код вроде все расписал чтобы было понятнее.
 
/*
 Контроль самодельного котла. Первый проект 16.09.2016
 */
  int val = 0; //начальное значение пина 11 (искра факела)
   int sensePin = 0; //Фотодатчик контроля пламени.
 
  void setup() {
// Обявление всех каналов.
  pinMode(13, OUTPUT); // Канал вентиляции.
  pinMode(12, OUTPUT); // Канал готовности.
  pinMode(11, OUTPUT); // Канал искры факела.
  pinMode(10, OUTPUT); // Канал клапана подачи газа на факел.
  pinMode(9, OUTPUT); // Канал клапана подачи газа на основную горелку.
  pinMode(8, OUTPUT); // Канал пустой.
  pinMode(7, OUTPUT); // Канал пустой.
  pinMode(6, OUTPUT); // Канал пустой.
  pinMode(5, OUTPUT); // Канал пустой.
  pinMode(4, INPUT); // Канал подачи искры и клапана подачи газа на факел.
  analogReference(DEFAULT); //Стандартное значение аналогово входа.
 
 
// Запуск вентиляции, задержка времени и готовность системы.
  digitalWrite(13, HIGH);   // Венциляция запущена.
  delay(1000);          // Время продувки.
    digitalWrite(12, HIGH);   // Готовность системы
}
 
// Цикл проекта 
void loop() {
 
 
val = digitalRead(4); // Кнопка искры и клапана подачи газа на факел.
if (val == HIGH) {
digitalWrite(11,HIGH); // Искра включена пока кнопка нажата.
digitalWrite(10,HIGH); // Клапан газа факела включен.
}
else
{
digitalWrite(11,LOW); // Отключение искры когда кнопка отпущена.
digitalWrite(10,LOW); // Отключение клапана газа факела когда кнопка отпущена.
 
 
int val1 = analogRead (sensePin); //Установка значения VAL1 в значение фотодатчика.
if (val1 < 800) digitalWrite(9, HIGH); // Включение клапана основной горелки если горит пламя факела.
else digitalWrite (9, LOW); // Оставить выключеным клапан основной горелки если пламени факела нет.
 
}
 
  }
yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

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

Например функция продувки (void ventilation())

Функция росжига (void kindling())

В основном цикле проверять состояние пламени, и если оно отсутствует то вызывать соответствующие функции в неоходимой последовательности.

/*
 Контроль самодельного котла. Первый проект 16.09.2016
 */
boolean val = 0; //начальное значение пина 11 (искра факела)
#define sensePin 0//Фотодатчик контроля пламени.
#define button 4//Кнопка росжига

void setup() {
  // Обявление всех каналов.
  //13 Канал вентиляции.
  //12 Канал готовности.
  //11 Канал искры факела.
  //10 Канал клапана подачи газа на факел.
  //9 Канал клапана подачи газа на основную горелку.
  //8 Канал пустой.
  //7 Канал пустой.
  //6 Канал пустой.
  //5 Канал пустой.
  //4 Канал подачи искры и клапана подачи газа на факел.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
  }

  analogReference(DEFAULT); //Стандартное значение аналогово входа.

  ventilation();//вызываем функцию вентиляции котла
}//end setup

//ФУНКЦИЯ ВЕНТИЛЯЦИИ КОТЛА
void ventilation(){
  digitalWrite(13, HIGH);   // Венциляция запущена.
  delay(1000);          // Время продувки.
  digitalWrite(12, HIGH);   // Готовность системы
}
//ФУНКЦИЯ ПРОВЕРКИ НАЛИЧИЯ ПЛАМЕНИ
void fire(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    digitalWrite(9, HIGH); // Включение клапана основной горелки .
  }
  else 
  {
    digitalWrite (9, LOW); // Оставить выключеным клапан основной горелки если пламени факела нет.
  }
}

// Цикл проекта 
void loop() {
  val = digitalRead (button); // Кнопка искры и клапана подачи газа на факел.
  if (val == HIGH) {
    digitalWrite(11,HIGH); // Искра включена пока кнопка нажата.
    digitalWrite(10,HIGH); // Клапан газа факела включен.
  }
  else
  {
    digitalWrite(11,LOW); // Отключение искры когда кнопка отпущена.
    digitalWrite(10,LOW); // Отключение клапана газа факела когда кнопка отпущена.
  }
  
  fire();//проверяем наличие пламени
}//end loop

 

nezza_profi
Offline
Зарегистрирован: 26.08.2016

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

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

Чтобы не работала кнопка необходимо завести флаг, и во время продувки его выставлять, а после продувки снимать. При проверке кнопки нужно смотреть на флаг и если он поднят то не реагировать на кнопку.
Както я монтировал газовый котел в одном котедже, так там защита была от отсутствия тяги. Работала следующим образом - питание подовалось на вытяжной вентилятор, на всасе был установлен датчик разряжения с контактами через которые запитывался сам котел. При включении веетилятора появлялось разряжение и включался котел, соответственно если тяга проподала то и котел обесточивался и клапана закрывались.
Я тут както класс писал DigOut (через поиск на форуме найдете), так вот с ним можно написать более читабельный код. Еще неплохо бы завести индикатор редима работы (светодиод напимер, который различными вспышками индицировал текущий режим)
Удачи!

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

Попробуйте так

/*
 Контроль самодельного котла. Первый проект 16.09.2016
V0.2
 */
boolean val = 0; //начальное значение пина 11 (искра факела)
boolean f_fire = 0;//флаг наличия пламени (1-отсутствует, 0-присутствует)
#define sensePin 0//Фотодатчик контроля пламени.
#define button 4//Кнопка росжига

void setup() {
  // Обявление всех каналов.
  //13 Канал вентиляции.
  //12 Канал готовности.
  //11 Канал искры факела.
  //10 Канал клапана подачи газа на факел.
  //9 Канал клапана подачи газа на основную горелку.
  //8 Канал пустой.
  //7 Канал пустой.
  //6 Канал пустой.
  //5 Канал пустой.
  //4 Канал подачи искры и клапана подачи газа на факел.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }

  analogReference(DEFAULT); //Стандартное значение аналогово входа.

  ventilation();//вызываем функцию вентиляции котла
}//end setup

//ФУНКЦИЯ ВЕНТИЛЯЦИИ КОТЛА
void ventilation(){
  digitalWrite(13, HIGH);   // Венциляция запущена.
  delay(1000);          // Время продувки. подозрительно малое время продувки
  f_fire=0;//снимаем флаг отсутствия пламени 
  digitalWrite(12, HIGH);   // Готовность системы
}
//ФУНКЦИЯ ПРОВЕРКИ НАЛИЧИЯ ПЛАМЕНИ
void fire(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
   f_fire=0;//Флаг присутствия пламени
    digitalWrite(9, HIGH); // Включение клапана основной горелки .
  }
  else 
  {
    digitalWrite (9, LOW); // Оставить выключеным клапан основной горелки если пламени факела нет.
    f_fire=1;//Выставляем флаг отсутствия пламени 
//флаг будет сброшен в функции венитиляции
      digitalWrite(12, LOW);   // НЕТ Готовности системы
      ventilation();//вызываем функцию вентиляции котла
 }
}

// Цикл проекта 
void loop() {
  val = digitalRead (button); // Кнопка искры и клапана подачи газа на факел.
  if (val == HIGH && f_fire==0) {//если кнопка нажата и нет пламени
    digitalWrite(11,HIGH); // Искра включена пока кнопка нажата.
    digitalWrite(10,HIGH); // Клапан газа факела включен.
  }
  else 
  {
    digitalWrite(10,LOW); // Отключение клапана газа факела
    digitalWrite(11,LOW); // Отключение искры
  }
  fire();//проверяем наличие пламени  
}//end loop

Подал питание, котел продулся, затем розжиг, если не разжегся то опять продувка (можно установить лимит автоматических попыток розжига), если горел но потух, опять продувка и розжиг, если с 5 попытки не разжогся то аварийный останов с непрерывной продувкой.

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

Вот код с применением классов DigIn и DigOut

DigIn обеспечивает защиту от дребезга

/*
 Контроль самодельного котла V0.3
 */
#include <DigOut.h>//подключаем библиотеку выходов yadi.sk/d/NM4S6HmFrTRu6
#include <DigIn.h>//подключаем библиотеку входов yadi.sk/d/7tGp_zlVsBt7s
DigOut vent_ch(13,1);//инициализация цифрового выхода на вентилятор и сразу включаем его
DigOut ready_ch(12);//канал гоовности
DigOut spark_ch(11);//канал искры
DigOut gas_valve_ch(10,0);//канал клапана газа
DigIn button(4,0);//Канал подачи искры и клапана подачи газа на факел.
boolean val = 0; //начальное значение пина 11 (искра факела)
boolean f_fire = 0;//флаг наличия пламени (1-отсутствует, 0-присутствует)
#define sensePin 0//Фотодатчик контроля пламени.
unsigned long currentMillis=millis();//для хранения текущего времени

void setup() {
  //прерывание от таймера 0 для опроса millis() не чаще 1 раза/мс
  OCR0A = 0xAF;//robotosha.ru/arduino/multitasking-and-interrupts-arduino.html
  TIMSK0 |= _BV(OCIE0A);
  analogReference(DEFAULT); //Стандартное значение аналогово входа.
  ventilation();//вызываем функцию вентиляции котла
}//end setup

//ФУНКЦИЯ ПОЛУЧЕНИЯ millis по прерыванию таймера
SIGNAL(TIMER0_COMPA_vect)
{
  currentMillis = millis();
}

//ФУНКЦИЯ ВЕНТИЛЯЦИИ КОТЛА
void ventilation(){
  vent_ch.HI();// Венциляция запущена.
  delay(1000);// Время продувки. подозрительно малое время продувки
  f_fire=0;//снимаем флаг отсутствия пламени 
  ready_ch.HI();// Готовность системы
}
//ФУНКЦИЯ ПРОВЕРКИ НАЛИЧИЯ ПЛАМЕНИ
void fire(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    f_fire=0;//Флаг присутствия пламени
    gas_valve_ch.HI(); // Включение клапана основной горелки .
  }
  else 
  {
    gas_valve_ch.LO(); // Оставить выключеным клапан основной горелки если пламени факела нет.
    f_fire=1;//Выставляем флаг отсутствия пламени 
    //флаг будет сброшен в функции венитиляции
    ready_ch.LO();// НЕТ Готовности системы
    ventilation();//вызываем функцию вентиляции котла
  }
}

// Цикл проекта 
void loop() {
  if (button.valid(currentMillis) && f_fire==0) {//если кнопка нажата и нет пламени
    spark_ch.HI(); // Искра включена пока кнопка нажата.
    gas_valve_ch.HI(); // Клапан газа факела включен.
  }
  else 
  {
    gas_valve_ch.LO(); // Отключение клапана газа факела
    spark_ch.LO(); // Отключение искры
  }
  fire();//проверяем наличие пламени  
}//end loop

Если у Вас на 12 выводе "готовность" висит светодиод, то теперь его можно просто заставить индицировать различные состояния системы различными вспышками.

Для этого вместо

ready_ch.LO();// НЕТ Готовности системы

Нужно написать

ready_ch.lpwm(500,50);// НЕТ Готовности системы

в скобочках (период в мс, % заполнения периода)

Таким же образом можно и искру подавать многократно.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

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

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Попробуйте так

/*
 Контроль самодельного котла. Первый проект 16.09.2016
V0.2
 */
boolean val = 0; //начальное значение пина 11 (искра факела)
boolean f_fire = 0;//флаг наличия пламени (1-отсутствует, 0-присутствует)
#define sensePin 0//Фотодатчик контроля пламени.
#define button 4//Кнопка росжига

void setup() {
  // Обявление всех каналов.
  //13 Канал вентиляции.
  //12 Канал готовности.
  //11 Канал искры факела.
  //10 Канал клапана подачи газа на факел.
  //9 Канал клапана подачи газа на основную горелку.
  //8 Канал пустой.
  //7 Канал пустой.
  //6 Канал пустой.
  //5 Канал пустой.
  //4 Канал подачи искры и клапана подачи газа на факел.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }

  analogReference(DEFAULT); //Стандартное значение аналогово входа.

  ventilation();//вызываем функцию вентиляции котла
}//end setup

//ФУНКЦИЯ ВЕНТИЛЯЦИИ КОТЛА
void ventilation(){
  digitalWrite(13, HIGH);   // Венциляция запущена.
  delay(1000);          // Время продувки. подозрительно малое время продувки
  f_fire=0;//снимаем флаг отсутствия пламени 
  digitalWrite(12, HIGH);   // Готовность системы
}
//ФУНКЦИЯ ПРОВЕРКИ НАЛИЧИЯ ПЛАМЕНИ
void fire(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
   f_fire=0;//Флаг присутствия пламени
    digitalWrite(9, HIGH); // Включение клапана основной горелки .
  }
  else 
  {
    digitalWrite (9, LOW); // Оставить выключеным клапан основной горелки если пламени факела нет.
    f_fire=1;//Выставляем флаг отсутствия пламени 
//флаг будет сброшен в функции венитиляции
      digitalWrite(12, LOW);   // НЕТ Готовности системы
      ventilation();//вызываем функцию вентиляции котла
 }
}

// Цикл проекта 
void loop() {
  val = digitalRead (button); // Кнопка искры и клапана подачи газа на факел.
  if (val == HIGH && f_fire==0) {//если кнопка нажата и нет пламени
    digitalWrite(11,HIGH); // Искра включена пока кнопка нажата.
    digitalWrite(10,HIGH); // Клапан газа факела включен.
  }
  else 
  {
    digitalWrite(10,LOW); // Отключение клапана газа факела
    digitalWrite(11,LOW); // Отключение искры
  }
  fire();//проверяем наличие пламени  
}//end loop

Подал питание, котел продулся, затем розжиг, если не разжегся то опять продувка (можно установить лимит автоматических попыток розжига), если горел но потух, опять продувка и розжиг, если с 5 попытки не разжогся то аварийный останов с непрерывной продувкой.

 

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

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012
/*
 Контроль самодельного котла. Первый проект 16.09.2016
V0.2
 */
boolean val = 0; //начальное значение пина 11 (искра факела)
boolean f_fire = 0;//флаг наличия пламени (1-отсутствует, 0-присутствует)
#define sensePin 0//Фотодатчик контроля пламени.
#define button 4//Кнопка росжига

void setup() {
  // Обявление всех каналов.
  //13 Канал вентиляции.
  //12 Канал готовности.
  //11 Канал искры факела.
  //10 Канал клапана подачи газа на факел.
  //9 Канал клапана подачи газа на основную горелку.
  //8 Канал пустой.
  //7 Канал пустой.
  //6 Канал пустой.
  //5 Канал пустой.
  //4 Канал подачи искры и клапана подачи газа на факел.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }

  analogReference(DEFAULT); //Стандартное значение аналогово входа.

  ventilation();//вызываем функцию вентиляции котла
}//end setup

//ФУНКЦИЯ ВЕНТИЛЯЦИИ КОТЛА
void ventilation(){
  digitalWrite(13, HIGH);   // Венциляция запущена.
  delay(1000);          // Время продувки. подозрительно малое время продувки
  f_fire=0;//снимаем флаг отсутствия пламени 
  digitalWrite(12, HIGH);   // Готовность системы
}
//ФУНКЦИЯ ПРОВЕРКИ НАЛИЧИЯ ПЛАМЕНИ
void fire(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
   f_fire=0;//Флаг присутствия пламени
   digitalWrite(12, HIGH);   // ЕСТЬ Готовность системы
    digitalWrite(9, HIGH); // Включение клапана основной горелки
  }
  else 
  {
    digitalWrite (9, LOW); // Оставить выключеным клапан основной горелки если пламени факела нет.
    f_fire=1;//Выставляем флаг отсутствия пламени 
//флаг будет сброшен в функции венитиляции
      digitalWrite(12, LOW);   // НЕТ Готовности системы
      ventilation();//вызываем функцию вентиляции котла
 }
}

// Цикл проекта 
void loop() {
  val = digitalRead (button); // Кнопка искры и клапана подачи газа на факел.
  if (val == HIGH && f_fire==0) {//если кнопка нажата и нет пламени
    digitalWrite(11,HIGH); // Искра включена пока кнопка нажата.
    digitalWrite(10,HIGH); // Клапан газа факела включен.
  }
  else 
  {
    digitalWrite(10,LOW); // Отключение клапана газа факела
    digitalWrite(11,LOW); // Отключение искры
  }
  fire();//проверяем наличие пламени  
}//end loop

Может так.

Proteus есть. Выложте схему девайса.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

Вот ссылка https://yadi.sk/d/N_xjnm4vvxjHN

Спасибо за вашу помощь. Очень благодарен вам.

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

Не получается открыть, проверте наличие ощего доступа к файлам.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

попробуйте вот эту ссылку https://yadi.sk/d/CG8B_gFkvxkGQ

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

nezza_profi пишет:

попробуйте вот эту ссылку https://yadi.sk/d/CG8B_gFkvxkGQ

Мой протеус не хочет открывать, пишет что фаил испорчен. Выложите схему просто, или принт скрин из протеуса.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

nezza_profi пишет:

попробуйте вот эту ссылку https://yadi.sk/d/CG8B_gFkvxkGQ

Мой протеус не хочет открывать, пишет что фаил испорчен. Выложите схему просто, или принт скрин из протеуса.


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

nezza_profi
Offline
Зарегистрирован: 26.08.2016

вот так выглядит. 

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

Попробуйте этот код

/*
 Контроль самодельного котла. Первый проект 16.09.2016
 V0.21
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки

void setup() {
  // Обявление всех каналов.
  //13 Канал вентиляции.
  //12 Канал готовности.
  //11 Канал искры факела.
  //10 Канал клапана подачи газа на факел.
  //9 Канал клапана подачи газа на основную горелку.
  //8 Канал пустой.
  //7 Канал пустой.
  //6 Канал пустой.
  //5 Канал пустой.
  //4 Канал подачи искры и клапана подачи газа на факел.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }

  analogReference(DEFAULT);  //Стандартное значение аналогово входа.

  ventilation();             //вызываем функцию вентиляции котла
}//end setup

//ФУНКЦИЯ ВЕНТИЛЯЦИИ КОТЛА
void ventilation(){
  digitalWrite(13, HIGH);    // Венциляция запущена.
  delay(vent_time);          // Время продувки
  fire();                    // Проверяем наличие пламени
}
//УПРАВЛЕНИЕ ФАКЕЛОМ
void flame_control(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

//ФУНКЦИЯ ПРОВЕРКИ НАЛИЧИЯ ПЛАМЕНИ
void fire(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    f_fire=1;//Пламя есть
    digitalWrite(12, HIGH);   // ЕСТЬ Готовность системы
    digitalWrite(9, HIGH);    // Включение клапана основной горелки
  }
  else 
  {
    digitalWrite (9, LOW);    // ЗАКРЫТЬ основной клапан горелки если пламени факела нет.
    f_fire=0;//Пламя отсутствует
    digitalWrite(12, LOW);    // НЕТ Готовности системы
    ventilation();            //вызываем функцию вентиляции котла
  }
}

// Цикл проекта 
void loop() {
  if (digitalRead (button) && f_fire==0) {//если кнопка нажата и нет пламени
    flame_control(1);        //включаем факел
  }
  else 
  {
    flame_control(0);        //выключаем факел
  }
  fire();                    //проверяем наличие пламени  
}//end loop


 

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Попробуйте этот код

/*
 Контроль самодельного котла. Первый проект 16.09.2016
 V0.21
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки

void setup() {
  // Обявление всех каналов.
  //13 Канал вентиляции.
  //12 Канал готовности.
  //11 Канал искры факела.
  //10 Канал клапана подачи газа на факел.
  //9 Канал клапана подачи газа на основную горелку.
  //8 Канал пустой.
  //7 Канал пустой.
  //6 Канал пустой.
  //5 Канал пустой.
  //4 Канал подачи искры и клапана подачи газа на факел.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }

  analogReference(DEFAULT);  //Стандартное значение аналогово входа.

  ventilation();             //вызываем функцию вентиляции котла
}//end setup

//ФУНКЦИЯ ВЕНТИЛЯЦИИ КОТЛА
void ventilation(){
  digitalWrite(13, HIGH);    // Венциляция запущена.
  delay(vent_time);          // Время продувки
  fire();                    // Проверяем наличие пламени
}
//УПРАВЛЕНИЕ ФАКЕЛОМ
void flame_control(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

//ФУНКЦИЯ ПРОВЕРКИ НАЛИЧИЯ ПЛАМЕНИ
void fire(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    f_fire=1;//Пламя есть
    digitalWrite(12, HIGH);   // ЕСТЬ Готовность системы
    digitalWrite(9, HIGH);    // Включение клапана основной горелки
  }
  else 
  {
    digitalWrite (9, LOW);    // ЗАКРЫТЬ основной клапан горелки если пламени факела нет.
    f_fire=0;//Пламя отсутствует
    digitalWrite(12, LOW);    // НЕТ Готовности системы
    ventilation();            //вызываем функцию вентиляции котла
  }
}

// Цикл проекта 
void loop() {
  if (digitalRead (button) && f_fire==0) {//если кнопка нажата и нет пламени
    flame_control(1);        //включаем факел
  }
  else 
  {
    flame_control(0);        //выключаем факел
  }
  fire();                    //проверяем наличие пламени  
}//end loop


 

Кнопка искры совсем перестала работать.

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

Вот еще попробуйте

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки

void setup() {
  // Обявление всех каналов.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Индикатор готовности
  digitalWrite(12, f_vent);//зависит от продувки

  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_fire==1 && f_work==0){//если обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    //возможно тут нужна задержка
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }

  //Проверка на затухание котла
  if(f_work==1 && f_fire==0){//если котел работал но потух
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

 

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Вот еще попробуйте

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки

void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Индикатор готовности
  digitalWrite(12, f_vent);//зависит от продувки

  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_fire==1 && f_work==0){//если обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    //возможно тут нужна задержка
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }

  //Проверка на затухание котла
  if(f_work==1 && f_fire==0){//если котел работал но потух
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

 

все отлично спасибо вам. а можно где нибудь еще добавить чтобы проверялось давление газа и воды? в качестве датчиков буду использовать обычные ЭКМ.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

Добавил Delay в пол секунды на отключение факела посмотрите все правильно ли сделал?

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки

void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Индикатор готовности
  digitalWrite(12, f_vent);//зависит от продувки

  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_fire==1 && f_work==0){//если обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    delay (500);//задержка перед отключением факела.
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }

  //Проверка на затухание котла
  if(f_work==1 && f_fire==0){//если котел работал но потух
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

 

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

Всё правильно. Но её лучше вынести в define вверх кода, чтобы настраивать легче было

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки
#define delay_flame_off 500 //Время задержки выключения факела

void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Индикатор готовности
  digitalWrite(12, f_vent);//зависит от продувки

  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_fire==1 && f_work==0){//если обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    delay (delay_flame_off);//задержка перед отключением факела.
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }

  //Проверка на затухание котла
  if(f_work==1 && f_fire==0){//если котел работал но потух
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

 

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

nezza_profi пишет:

все отлично спасибо вам. а можно где нибудь еще добавить чтобы проверялось давление газа и воды? в качестве датчиков буду использовать обычные ЭКМ.

Возможно всё, но спортивного интереса к этому не имею, я и так много сделал.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

И за это спасибо вам.

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

Удачи!

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Удачи!


Еще раз огромное спасибо вам. Теперь попробую сам глядя на ваш пример что нибудь сделать. Что получится потом напишу. Спасибо большое.

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

Хотелось бы увидет проект в "железе". Можно еще прикрутить датчик температуры и тушить котел когда температура теплонасителя находится в нужных пределах, добавить управление насосом теплоносителя и т.п.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Хотелось бы увидет проект в "железе". Можно еще прикрутить датчик температуры и тушить котел когда температура теплонасителя находится в нужных пределах, добавить управление насосом теплоносителя и т.п.

как закончу установку сделаю фото и выложу. пока что то ни как ни могу добавить датчики давления. 

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

Нужно добавить флаг для состояния датчика давления.

Затем в loop опрашивать его вход и выставлять флаг в зависимости от состояния входа.

Затем добавить реакцию на этот флаг

Например

//Индикатор готовности
if(f_pressure==1 && f_vent==1){//если есть давление и продувка выполнена
digitalWrite(12, 1);//есть готовность
}
else
{
digitalWrite(12, 0);//нет готовности
}
if (f_pressure==1 && f_fire==1 && f_work==0){//если есть давление, обнаружено пламя горелки и котел не разожон
digitalWrite(9, HIGH);//открываем клапан основной горелки
delay (delay_flame_off);//задержка перед отключением факела.
flame_ctrl(0);//выключаем факел
f_work=1;//Котел запущен
}
//Проверка на затухание котла
if(f_work==1 && f_fire==0 || f_pressure==0){//если котел работал но потух или нет давления
digitalWrite(9, LOW);//закрываем клапан основной горелки
f_work=0;//котел не в работе
f_vent=0;//котел не продут
}

 

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Вот еще попробуйте

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки

void setup() {
  // Обявление всех каналов.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Индикатор готовности
  digitalWrite(12, f_vent);//зависит от продувки

  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_fire==1 && f_work==0){//если обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    //возможно тут нужна задержка
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }

  //Проверка на затухание котла
  if(f_work==1 && f_fire==0){//если котел работал но потух
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

 

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

 

 

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Нужно добавить флаг для состояния датчика давления.

Затем в loop опрашивать его вход и выставлять флаг в зависимости от состояния входа.

Затем добавить реакцию на этот флаг

Например

//Индикатор готовности
if(f_pressure==1 && f_vent==1){//если есть давление и продувка выполнена
digitalWrite(12, 1);//есть готовность
}
else
{
digitalWrite(12, 0);//нет готовности
}
if (f_pressure==1 && f_fire==1 && f_work==0){//если есть давление, обнаружено пламя горелки и котел не разожон
digitalWrite(9, HIGH);//открываем клапан основной горелки
delay (delay_flame_off);//задержка перед отключением факела.
flame_ctrl(0);//выключаем факел
f_work=1;//Котел запущен
}
//Проверка на затухание котла
if(f_work==1 && f_fire==0 || f_pressure==0){//если котел работал но потух или нет давления
digitalWrite(9, LOW);//закрываем клапан основной горелки
f_work=0;//котел не в работе
f_vent=0;//котел не продут
}

 

а флаг можно устанавить через такой способ? 

if (dav_gaz == 1 && dav_voda ==1)
{
f_pressure=1
}



 

 

 

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

nezza_profi пишет:

yul-i-an пишет:

Вот еще попробуйте

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки

void setup() {
  // Обявление всех каналов.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Индикатор готовности
  digitalWrite(12, f_vent);//зависит от продувки

  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_fire==1 && f_work==0){//если обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    //возможно тут нужна задержка
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }

  //Проверка на затухание котла
  if(f_work==1 && f_fire==0){//если котел работал но потух
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

 

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

В посте #27 пример привел. А вообще нужно както более грамотно собрать все необходимые для готовности флаги и если они все подняты то готовность есть, если хоть один не поднят, то готовности нет.

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

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

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

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

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

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

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

Не получается. код даже компилируется. 

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
boolean f_pressure=0	    //Флаг давления
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки
#define zad_is 500	    //Время задержки искры
#define davgaz  5	    //канал давления газа
#define davvoda  6	    //канал давления воды
void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
    pinMode(davgaz,OUTPUT);
    pinMode(davvoda,OUTPUT);
    

  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
if (davgaz == 1 && davvoda ==1)
{
f_pressure=1;
}
 //Индикатор готовности
if(f_pressure==1 && f_vent==1){//если есть давление и продувка выполнена
digitalWrite(12, 1);//есть готовность
}
else
{
digitalWrite(12, 0);//нет готовности
}
  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

if (f_pressure==1 && f_fire==1 && f_work==0){//если есть давление, обнаружено пламя горелки и котел не разожон
digitalWrite(9, HIGH);//открываем клапан основной горелки
delay (zad_is);//задержка перед отключением факела.
flame_ctrl(0);//выключаем факел
f_work=1;//Котел запущен
}
  

  
//Проверка на затухание котла
if(f_work==1 && f_fire==0 || f_pressure==0){//если котел работал но потух или нет давления
digitalWrite(9, LOW);//закрываем клапан основной горелки
f_work=0;//котел не в работе
f_vent=0;//котел не продут
}

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

 

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

Может так пойдет

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
boolean f_gas=0;            //Флаг давления
boolean f_water=0;          //Флаг наличия воды
boolean f_ready=0;          //Флаг готовности
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки
#define zad_is 500	    //Время задержки искры
#define davgaz  5	    //канал давления газа
#define davvoda  6	    //канал давления воды
void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){//объявление каналов с 4 по 13 выходами
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);



  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  f_gas=digitalRead(davgaz);//опрос давления газа
  f_water=digitalRead(davvoda);//опрос давления воды

  //Индикатор готовности
  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready==1;//флаг готовно
  }
  else
  {
    f_ready==0;//нет готовности
  }
  digitalWrite(12, f_ready);//управление индикатором готовности

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_ready==1 && f_fire==1 && f_work==0){//если есть готовность, обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    delay (zad_is);//задержка перед отключением факела.
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }



  //Проверка на затухание котла
  if(f_work==1 && f_fire==0 || f_ready==0){//если котел работал но потух или нет давления
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
    f_ready=0;//нет готовности
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

Ваша ошибка была в том что Вы не опрашивали входы датчиков давления.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Может так пойдет

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
boolean f_gas=0;            //Флаг давления
boolean f_water=0;          //Флаг наличия воды
boolean f_ready=0;          //Флаг готовности
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки
#define zad_is 500	    //Время задержки искры
#define davgaz  5	    //канал давления газа
#define davvoda  6	    //канал давления воды
void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){//объявление каналов с 4 по 13 выходами
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);



  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  f_gas=digitalRead(davgaz);//опрос давления газа
  f_water=digitalRead(davvoda);//опрос давления воды

  //Индикатор готовности
  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready==1;//флаг готовно
  }
  else
  {
    f_ready==0;//нет готовности
  }
  digitalWrite(12, f_ready);//управление индикатором готовности

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_ready==1 && f_fire==1 && f_work==0){//если есть готовность, обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    delay (zad_is);//задержка перед отключением факела.
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }



  //Проверка на затухание котла
  if(f_work==1 && f_fire==0 || f_ready==0){//если котел работал но потух или нет давления
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
    f_ready=0;//нет готовности
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

Ваша ошибка была в том что Вы не опрашивали входы датчиков давления.

теперь котел снова не встает на готовность.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Может так пойдет

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
boolean f_gas=0;            //Флаг давления
boolean f_water=0;          //Флаг наличия воды
boolean f_ready=0;          //Флаг готовности
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки
#define zad_is 500	    //Время задержки искры
#define davgaz  5	    //канал давления газа
#define davvoda  6	    //канал давления воды
void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){//объявление каналов с 4 по 13 выходами
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);



  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  f_gas=digitalRead(davgaz);//опрос давления газа
  f_water=digitalRead(davvoda);//опрос давления воды

  //Индикатор готовности
  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready==1;//флаг готовно
  }
  else
  {
    f_ready==0;//нет готовности
  }
  digitalWrite(12, f_ready);//управление индикатором готовности

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_ready==1 && f_fire==1 && f_work==0){//если есть готовность, обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    delay (zad_is);//задержка перед отключением факела.
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }



  //Проверка на затухание котла
  if(f_work==1 && f_fire==0 || f_ready==0){//если котел работал но потух или нет давления
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
    f_ready=0;//нет готовности
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

Ваша ошибка была в том что Вы не опрашивали входы датчиков давления.

все нашел в чем причина.

  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready==1;//флаг готовно
  }
  else
  {
    f_ready==0;//нет готовности
  }

исправил на 

  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready=1;//флаг готовно
  }
  else
  {
    f_ready=0;//нет готовности
  }

 

nezza_profi
Offline
Зарегистрирован: 26.08.2016

nezza_profi пишет:

yul-i-an пишет:

Может так пойдет

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
boolean f_gas=0;            //Флаг давления
boolean f_water=0;          //Флаг наличия воды
boolean f_ready=0;          //Флаг готовности
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки
#define zad_is 500	    //Время задержки искры
#define davgaz  5	    //канал давления газа
#define davvoda  6	    //канал давления воды
void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){//объявление каналов с 4 по 13 выходами
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);



  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  f_gas=digitalRead(davgaz);//опрос давления газа
  f_water=digitalRead(davvoda);//опрос давления воды

  //Индикатор готовности
  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready==1;//флаг готовно
  }
  else
  {
    f_ready==0;//нет готовности
  }
  digitalWrite(12, f_ready);//управление индикатором готовности

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_ready==1 && f_fire==1 && f_work==0){//если есть готовность, обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    delay (zad_is);//задержка перед отключением факела.
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }



  //Проверка на затухание котла
  if(f_work==1 && f_fire==0 || f_ready==0){//если котел работал но потух или нет давления
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
    f_ready=0;//нет готовности
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

Ваша ошибка была в том что Вы не опрашивали входы датчиков давления.

все нашел в чем причина.

  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready==1;//флаг готовно
  }
  else
  {
    f_ready==0;//нет готовности
  }

исправил на 

  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready=1;//флаг готовно
  }
  else
  {
    f_ready=0;//нет готовности
  }

 

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

nezza_profi
Offline
Зарегистрирован: 26.08.2016

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

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
boolean f_gas=0;            //Флаг давления
boolean f_water=0;          //Флаг наличия воды
boolean f_ready=0;          //Флаг готовности
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки
#define zad_is 500	    //Время задержки искры
#define davgaz  5	    //канал давления газа
#define davvoda  6	    //канал давления воды
void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){//объявление каналов с 4 по 13 выходами
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);



  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  f_gas=digitalRead(davgaz);//опрос давления газа
  f_water=digitalRead(davvoda);//опрос давления воды

  //Индикатор готовности
  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready=1;//флаг готовно
  }
  else
  {
    f_ready=0;//нет готовности
  }
  digitalWrite(12, f_ready);//управление индикатором готовности

  //Управление розжигом
  if(f_vent==1 && f_fire==0){//если котел продут но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_ready==1 && f_fire==1 && f_work==0){//если есть готовность, обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    delay (zad_is);//задержка перед отключением факела.
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }



  //Проверка на затухание котла
  if(f_work==1 && f_fire==0 || f_ready==0){//если котел работал но потух или нет давления
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
    f_ready=0;//нет готовности
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

 

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

Так попробуйте.

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
boolean f_gas=0;            //Флаг давления
boolean f_water=0;          //Флаг наличия воды
boolean f_ready=0;          //Флаг готовности
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки
#define zad_is 500	    //Время задержки искры
#define davgaz  5	    //канал давления газа
#define davvoda  6	    //канал давления воды
void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){//объявление каналов с 4 по 13 выходами
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);



  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  f_gas=digitalRead(davgaz);//опрос давления газа
  f_water=digitalRead(davvoda);//опрос давления воды

  //Индикатор готовности
  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready=1;//флаг готовно
  }
  else
  {
    f_ready=0;//нет готовности
  }
  digitalWrite(12, f_ready);//управление индикатором готовности

  //Управление розжигом
  if(f_ready==1 && f_fire==0){//если котел готов но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_ready==1 && f_fire==1 && f_work==0){//если есть готовность, обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    delay (zad_is);//задержка перед отключением факела.
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }

  //Проверка на затухание котла
  if(f_work==1 && f_fire==0 || f_ready==0){//если котел работал но потух или нет давления
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

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

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Так попробуйте.

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
boolean f_gas=0;            //Флаг давления
boolean f_water=0;          //Флаг наличия воды
boolean f_ready=0;          //Флаг готовности
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки
#define zad_is 500	    //Время задержки искры
#define davgaz  5	    //канал давления газа
#define davvoda  6	    //канал давления воды
void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){//объявление каналов с 4 по 13 выходами
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);



  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  f_gas=digitalRead(davgaz);//опрос давления газа
  f_water=digitalRead(davvoda);//опрос давления воды

  //Индикатор готовности
  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready=1;//флаг готовно
  }
  else
  {
    f_ready=0;//нет готовности
  }
  digitalWrite(12, f_ready);//управление индикатором готовности

  //Управление розжигом
  if(f_ready==1 && f_fire==0){//если котел готов но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_ready==1 && f_fire==1 && f_work==0){//если есть готовность, обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    delay (zad_is);//задержка перед отключением факела.
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }

  //Проверка на затухание котла
  if(f_work==1 && f_fire==0 || f_ready==0){//если котел работал но потух или нет давления
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

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

фото датчик не реагирует если котел горел и потух. готовность не сбрасывается. но она отлично работает на каналах давления

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Так попробуйте.

/*
 Контролер самодельного газового котла V0.4
 */
boolean f_fire = 0;         //флаг наличия пламени (0-отсутствует, 1-присутствует)
boolean f_vent = 0;         //флаг продувки (0-не продут, 1-продут)
boolean f_work = 0;         //Флаг работы котла
boolean f_gas=0;            //Флаг давления
boolean f_water=0;          //Флаг наличия воды
boolean f_ready=0;          //Флаг готовности
#define sensePin 0          //Фотодатчик контроля пламени.
#define button 4            //Кнопка розжига
#define vent_time 1000      //Время продувки
#define zad_is 500	    //Время задержки искры
#define davgaz  5	    //канал давления газа
#define davvoda  6	    //канал давления воды
void setup() {
  // Объявление всех каналов.
  for (byte i=4; i <= 12; i++){//объявление каналов с 4 по 13 выходами
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);



  }
  digitalWrite(13, HIGH);//Запускаем вытяжной вентилятор
  analogReference(DEFAULT);  //Стандартное значение аналогово входа.
}//end setup

void loop() {
  //Продуваем котел если не продут
  if (f_vent==0){//Если котел не продут
    delay(vent_time);// Время продувки
    f_vent=1;//Котел продут
  }

  f_gas=digitalRead(davgaz);//опрос давления газа
  f_water=digitalRead(davvoda);//опрос давления воды

  //Индикатор готовности
  if(f_gas==1 && f_water==1 && f_vent==1){//если есть давление газа и воды и продувка выполнена
    f_ready=1;//флаг готовно
  }
  else
  {
    f_ready=0;//нет готовности
  }
  digitalWrite(12, f_ready);//управление индикатором готовности

  //Управление розжигом
  if(f_ready==1 && f_fire==0){//если котел готов но нет пламени
    if(digitalRead(button)==1){
      flame_ctrl(1);//включаем факел
    }
  }

  //Проверяем наличие пламени
  f_fire=fire_ctrl();

  if (f_ready==1 && f_fire==1 && f_work==0){//если есть готовность, обнаружено пламя горелки и котел не разожон
    digitalWrite(9, HIGH);//открываем клапан основной горелки
    delay (zad_is);//задержка перед отключением факела.
    flame_ctrl(0);//выключаем факел
    f_work=1;//Котел запущен
  }

  //Проверка на затухание котла
  if(f_work==1 && f_fire==0 || f_ready==0){//если котел работал но потух или нет давления
    digitalWrite(9, LOW);//закрываем клапан основной горелки
    f_work=0;//котел не в работе
    f_vent=0;//котел не продут
  }

}//end loop

//Фун-я проверки наличия пламени
boolean fire_ctrl(){
  if (analogRead (sensePin) < 800){//если горит пламя факела
    return 1;//Пламя есть
  }
  else
  {
    return 0;//Пламени нет
  }
}

//Фун-я управления факелом
void flame_ctrl(boolean stat){
  digitalWrite(11,stat);     // Подача искры
  digitalWrite(10,stat);     // Клапан газа факела
}

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

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

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

Вам нужно составить конечный автомат, а потом его запрограммировать.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Вам нужно составить конечный автомат, а потом его запрограммировать.


Я вас не понял

alex46
Offline
Зарегистрирован: 06.10.2016

nezza_profi , не разобрался как написать Вам в ЛС, хотел уточнить: вы собираете полностью автономный блок автоматики, или костыль к существующему? Как производится росжиг?

К чему спрашиваю: газовый котел protherm , навернулся блок росжига и автоматики honeywell, ремонту они не поддаются, а новый стоит 10-15 т.р. вот и возникла мысль реализовать на arduino блок автоматики.

По сути задача предстоит такая: газовый клапан управляется напряжением, 220в 100% открытие, ниже - соответственно ниже %. Но с АС напряжением проблема регулировать, проще выставить на 100% т.к за все время работы так и было.

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

а вот с росжигом проблема.. кто-то использует от Ксенона, или от катушки зажигания авто (с классики), но система очень "шумная" в сеть.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

alex46 пишет:

nezza_profi , не разобрался как написать Вам в ЛС, хотел уточнить: вы собираете полностью автономный блок автоматики, или костыль к существующему? Как производится росжиг?

К чему спрашиваю: газовый котел protherm , навернулся блок росжига и автоматики honeywell, ремонту они не поддаются, а новый стоит 10-15 т.р. вот и возникла мысль реализовать на arduino блок автоматики.

По сути задача предстоит такая: газовый клапан управляется напряжением, 220в 100% открытие, ниже - соответственно ниже %. Но с АС напряжением проблема регулировать, проще выставить на 100% т.к за все время работы так и было.

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

а вот с росжигом проблема.. кто-то использует от Ксенона, или от катушки зажигания авто (с классики), но система очень "шумная" в сеть.

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

alex46
Offline
Зарегистрирован: 06.10.2016

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

nezza_profi
Offline
Зарегистрирован: 26.08.2016

alex46 пишет:

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

хорошо завтра объязательно сфоткаю готовое устройство и схема где то должна быть у меня.

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

Для управления свечей лучше использовать автомобильный комутатор

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

Чтобы написать грамотный код нужна полная схема подключения периферии и точный алгоритм работы.

nezza_profi
Offline
Зарегистрирован: 26.08.2016

yul-i-an пишет:

Для управления свечей лучше использовать автомобильный комутатор

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

Чтобы написать грамотный код нужна полная схема подключения периферии и точный алгоритм работы.

в принцепи ваш последний код очень отлично работает. я постараюсь поправить его реакцию на пламе. а если не получится то уберу совсем датчики давленя. и поставлю как и планировал на цепь питания. Огромное спасибо вам. 

nezza_profi
Offline
Зарегистрирован: 26.08.2016

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