Контроллер газовой пушки

stranger80-01
Offline
Зарегистрирован: 16.02.2016

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

Так как в Arduino 1.0.5 размер скетча 1.5кБ. Пока ориентируюсь на ATtiny2313

int gassens = 6;    // датчик наличия газа пин 6
int airsens = 7;    // датчик наличия воздуха пин 7
int flamesens = 0;  // датчик наличия пламени пин 0
int air = 4;        // вентилятор пин 4
int gas = 5;        // газовый клапан пин 5
int ignition = 9;   // ШИМ электроподжиг пин 9

void setup() {
  pinMode(gassens, INPUT);
  pinMode(airsens, INPUT);
  pinMode(flamesens, INPUT);
  pinMode(air, OUTPUT);
  pinMode(gas, OUTPUT);
  pinMode(ignition, OUTPUT);
}

void loop() {
  
 analogRead(flamesens);                      // есть пламя?
if(flamesens < 100) {                        // если нет пламени
  digitalWrite(gas, LOW);                    // закрыть газовый клапан
  digitalWrite(air, HIGH);                   // пуск вентилятора если первое включение
  delay(10000);                              // задержка на продувку
  digitalWrite(gas, HIGH);                   // открыть подачу газа    
if(airsens, HIGH)    {                       // есть ли воздух ?     
  if (gassens, HIGH) {                       // есть ли газ ?
  analogWrite(ignition, 127);                // подать ШИМ электроподжиг
  delay(1000);                               // длительность ШИМ электроподжиг
  digitalWrite(ignition, LOW);               // выключить ШИМ электроподжиг
}
else {                                       // если нет газа
  digitalWrite(gas, LOW);                    // закрыть газ
  delay(10000);                              // задержка на продувку
  digitalWrite(air, LOW);                    // стоп вентилятор
  delay(1000);                               // задержка останов вентилятора
}
}
else {                                       // если нет воздуха
  digitalWrite(gas, LOW);                    // закрыть газ
  delay(10000);                              // задержка на продувку
  digitalWrite(air, LOW);                    // стоп вентилятор
  delay(1000);                               // задержка останов вентилятора
}
  
}
else {                                       // если есть пламя
  delay(1000);                               // задержка на следующий опрос датчика пламени
}
}

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Цитата:
Родной контроллер делает три попытки запуска, после чего уходит в ошибку при неудачном старте. Как мне добавить эту функцию ?
Например так.

attempt++;
if (attempt>=3) Error();

В коде ошибки. Строки 19, 20, 25...

Если пины объявишь как #define сэкономишь 12 байт памяти данных.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Речь о тепловой пушке, работающей на газе или легкогазовой пушке?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что это такое у Вас написано?

stranger80-01 пишет:
analogRead(flamesens); 

С какой целью читать значение, если никуда его на присваивать?

stranger80-01 пишет:
if(flamesens < 100) { // если нет пламени

Это всегда ИСТИНА, т.к. flamesens равен 0 и разумеется меньше 100

stranger80-01 пишет:
if(airsens, HIGH) { // есть ли воздух ?     

Это всегда ИСТИНА, т.к.HIGH всегда равен 1.

Каков глубокий смысл писать условия, которые всегда инстинны, да ещё и else к ним приписывать?

 

stranger80-01
Offline
Зарегистрирован: 16.02.2016

Благодарю за проверку !!! исправил скетч, 706 байт, проверьте плиззз. Не могу найти инфу по attempt. Куда его вставлять и как???

int gassens = 6;    // датчик наличия газа пин 6
int airsens = 7;    // датчик наличия воздуха пин 7
int flamesens = 0;  // датчик наличия пламени пин 0
int air = 4;        // вентилятор пин 4
int gas = 5;        // газовый клапан пин 5
int ignition = 9;   // ШИМ электроподжиг пин 9
int val = 0;        // переменная для хранения значения пламени
int val2 = 0;        // переменная для хранения значения воздуха
int val3 = 0;        // переменная для хранения значения газа

void setup() {
  pinMode(gassens, INPUT);
  pinMode(airsens, INPUT);
  pinMode(flamesens, INPUT);
  pinMode(air, OUTPUT);
  pinMode(gas, OUTPUT);
  pinMode(ignition, OUTPUT);
}

void loop() {
  
 val = analogRead(flamesens);                // читаем датчик пламени
if(val < 100) {                              // если нет пламени
  digitalWrite(gas, LOW);                    // закрыть газовый клапан
  digitalWrite(air, HIGH);                   // пуск вентилятора если первое включение
  delay(10000);                              // задержка на продувку
  digitalWrite(gas, HIGH);                   // открыть подачу газа 
  val2 = digitalRead(airsens);               // читаем датчик воздуха
  val3 = digitalRead(gassens);               // читаем датчик газа
if(val2 == HIGH && val3 == HIGH)    {        // есть ли и воздух и газ ?  
  analogWrite(ignition, 127);                // подать ШИМ электроподжиг
  delay(1000);                               // длительность ШИМ электроподжиг
  digitalWrite(ignition, LOW);               // выключить ШИМ электроподжиг
}
else {                                       // если нет газа
  digitalWrite(gas, LOW);                    // закрыть газ
  delay(10000);                              // задержка на продувку
  digitalWrite(air, LOW);                    // стоп вентилятор
  delay(1000);                               // задержка останов вентилятора
}
}
else {                                       // если есть пламя
  delay(1000);                               // задержка на следующий опрос датчика пламени
}
}
  

 

stranger80-01
Offline
Зарегистрирован: 16.02.2016

ЕвгенийП пишет:

Речь о тепловой пушке, работающей на газе или легкогазовой пушке?

на магистральном газе, марка пушки kroll (euronord). Вышел из строя менеджер горения HONEYWELL DVI980

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

stranger80-01 пишет:
Не могу найти инфу по attempt. Куда его вставлять и как???
stranger80-01, attempt это не более чем название переменной, которую можно обозвать как угодно, пусть будет не attempt, а popytka.

Переменную нужно объявить: byte popytka=0; В том месте, где делается электроподжиг добавить popytka++; И где-то в цикле добавить проверку: if (popytka>=3) Error(); Что должна делать функция Error(); я понятия не имею... можно уйти в бесконечный цикл, начать моргать светодиодами, опрашивать кнопки и т.п.

stranger80-01
Offline
Зарегистрирован: 16.02.2016

Добавил в начало цикла оператор while с условием попыток менее 4х. Но по достижении 4-й попытки запуска цикл становится пустым. Так можно ?



int gassens = 6;     // датчик наличия газа пин 6
int airsens = 7;     // датчик наличия воздуха пин 7
int flamesens = 0;   // вентилятор пин 4
int gas = 5;         // газовый клапан пин 5
int ignition = 9;    // ШИМ электроподжиг пин 9
int val = 0;         // переменная для хранения значения пламени
int val2 = 0;        // переменная для хранения значения воздуха
int val3 = 0;        // переменная для хранения значения газа
byte counter = 0;    // счётчик попыток электроподжига

void setup() {
  pinMode(gassens, INPUT);
  pinMode(airsens, INPUT);
  pinMode(flamesens, INPUT);
  pinMode(air, OUTPUT);
  pinMode(gas, OUTPUT);
  pinMode(ignition, OUTPUT);
}

void loop() {
while(counter < 4) {  
  val = analogRead(flamesens);               // читаем датчик пламени
if(val < 100) {                              // если нет пламени
  digitalWrite(gas, LOW);                    // закрыть газовый клапан
  digitalWrite(air, HIGH);                   // пуск вентилятора если первое включение
  delay(10000);                              // задержка на продувку
  digitalWrite(gas, HIGH);                   // открыть подачу газа 
  val2 = digitalRead(airsens);               // читаем датчик воздуха
  val3 = digitalRead(gassens);               // читаем датчик газа
if(val2 == HIGH && val3 == HIGH)    {        // есть ли и воздух и газ ?  
  analogWrite(ignition, 127);                // подать ШИМ электроподжиг
  counter++;                                 // прибавляем счёт попыток
  delay(1000);                               // длительность ШИМ электроподжиг
  digitalWrite(ignition, LOW);               // выключить ШИМ электроподжиг
}
else {                                       // если нет газа и\или воздуха
  digitalWrite(gas, LOW);                    // закрыть газ
  delay(10000);                              // задержка на продувку
  digitalWrite(air, LOW);                    // стоп вентилятор
  delay(1000);                               // задержка останов вентилятора
}
}
else {                                       // если есть пламя
  delay(1000);                               // задержка на следующий опрос датчика пламени
}
}
}

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

С точки зрения программирования можно.

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