Проект отопительного котла.
- Войдите на сайт для отправки комментариев
Чт, 29/09/2016 - 18:31
Здравствуйте. Хотел попросить совет как можно перезагрузить весю программу по значению канала.
Котел газовый самодельный.
последовательность действий.
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); // Оставить выключеным клапан основной горелки если пламени факела нет.
}
}
Для простоты нужно выделить отдельные задачи в самостоятельные функци.
Например функция продувки (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Я не верно написал извините. вентиляции нужна всегда. то есть изночально она используется для вентиляции котла а в дальнейшем она дает воздух для горения пламени так как газ без воздуха не горит. и еще в вашем коде все работает. но единственное когда пропадает пляме нужно чтобы кнопка подачи искры игаза на клапан не работали пока не пройдет вентиляция.
Чтобы не работала кнопка необходимо завести флаг, и во время продувки его выставлять, а после продувки снимать. При проверке кнопки нужно смотреть на флаг и если он поднят то не реагировать на кнопку.
Както я монтировал газовый котел в одном котедже, так там защита была от отсутствия тяги. Работала следующим образом - питание подовалось на вытяжной вентилятор, на всасе был установлен датчик разряжения с контактами через которые запитывался сам котел. При включении веетилятора появлялось разряжение и включался котел, соответственно если тяга проподала то и котел обесточивался и клапана закрывались.
Я тут както класс писал DigOut (через поиск на форуме найдете), так вот с ним можно написать более читабельный код. Еще неплохо бы завести индикатор редима работы (светодиод напимер, который различными вспышками индицировал текущий режим)
Удачи!
Попробуйте так
/* Контроль самодельного котла. Первый проект 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 попытки не разжогся то аварийный останов с непрерывной продувкой.
Вот код с применением классов 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 выводе "готовность" висит светодиод, то теперь его можно просто заставить индицировать различные состояния системы различными вспышками.
Для этого вместо
Нужно написать
в скобочках (период в мс, % заполнения периода)
Таким же образом можно и искру подавать многократно.
У вас есть протеус? я бы вам скинул проект. сейчас факел все время моргает. а кнопка подачи искы и открытие клапана факела не работает.
Попробуйте так
/* Контроль самодельного котла. Первый проект 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 попытки не разжогся то аварийный останов с непрерывной продувкой.
вот этот код работает отлично. но есть сомнения дело в протэусе или нет не пойму. когда котел разгорелся и потом тухнет то готовность и горелка отключается но потом готовность не включается совсем.
/* Контроль самодельного котла. Первый проект 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 есть. Выложте схему девайса.
Вот ссылка https://yadi.sk/d/N_xjnm4vvxjHN
Спасибо за вашу помощь. Очень благодарен вам.
Не получается открыть, проверте наличие ощего доступа к файлам.
попробуйте вот эту ссылку https://yadi.sk/d/CG8B_gFkvxkGQ
попробуйте вот эту ссылку https://yadi.sk/d/CG8B_gFkvxkGQ
Мой протеус не хочет открывать, пишет что фаил испорчен. Выложите схему просто, или принт скрин из протеуса.
попробуйте вот эту ссылку https://yadi.sk/d/CG8B_gFkvxkGQ
Мой протеус не хочет открывать, пишет что фаил испорчен. Выложите схему просто, или принт скрин из протеуса.
Это 8 протеус. Сейчас уже не могу завтра выложу у меня давольно таки поздно завтра на работе выложу
вот так выглядит.
Попробуйте этот код
/* Контроль самодельного котла. Первый проект 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Попробуйте этот код
/* Контроль самодельного котла. Первый проект 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Кнопка искры совсем перестала работать.
Вот еще попробуйте
/* Контролер самодельного газового котла 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); // Клапан газа факела }Вот еще попробуйте
/* Контролер самодельного газового котла 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); // Клапан газа факела }все отлично спасибо вам. а можно где нибудь еще добавить чтобы проверялось давление газа и воды? в качестве датчиков буду использовать обычные ЭКМ.
Добавил 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); // Клапан газа факела }Всё правильно. Но её лучше вынести в 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); // Клапан газа факела }все отлично спасибо вам. а можно где нибудь еще добавить чтобы проверялось давление газа и воды? в качестве датчиков буду использовать обычные ЭКМ.
Возможно всё, но спортивного интереса к этому не имею, я и так много сделал.
И за это спасибо вам.
Удачи!
Удачи!
Еще раз огромное спасибо вам. Теперь попробую сам глядя на ваш пример что нибудь сделать. Что получится потом напишу. Спасибо большое.
Хотелось бы увидет проект в "железе". Можно еще прикрутить датчик температуры и тушить котел когда температура теплонасителя находится в нужных пределах, добавить управление насосом теплоносителя и т.п.
Хотелось бы увидет проект в "железе". Можно еще прикрутить датчик температуры и тушить котел когда температура теплонасителя находится в нужных пределах, добавить управление насосом теплоносителя и т.п.
как закончу установку сделаю фото и выложу. пока что то ни как ни могу добавить датчики давления.
Нужно добавить флаг для состояния датчика давления.
Затем в 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;//котел не продут }Вот еще попробуйте
/* Контролер самодельного газового котла 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); // Клапан газа факела }Извините конечно за наглость но объясните пожалуста как работает этот код. как не пробовал не получается сделать так чтобы готовность зависила от еще двух каналов от давления воды и газа. или ткните меня пожалуйста в статью в интернете где есть об этом информации.
Нужно добавить флаг для состояния датчика давления.
Затем в 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 }Вот еще попробуйте
/* Контролер самодельного газового котла 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 пример привел. А вообще нужно както более грамотно собрать все необходимые для готовности флаги и если они все подняты то готовность есть, если хоть один не поднят, то готовности нет.
Сегодня времени нет, подумаю как лучьше организовать. А Вы пока сами подумайте.
Сегодня времени нет, подумаю как лучьше организовать. А Вы пока сами подумайте.
Хорошо. Спасибо вам. я напишу до завтра все мои соображения на этот счет. и еще вопрос а как вы сделали так чтобы без объявления канала он используется. мне нужно добавить 2 канала на воду и газ. но как их использовать теперь не знаю. я совсем не знаю языка программирования и для меня очень сложно сейчас так сразу это понять. потихоньку изучаю
Сегодня времени нет, подумаю как лучьше организовать. А Вы пока сами подумайте.
Не получается. код даже компилируется.
/* Контролер самодельного газового котла 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); // Клапан газа факела }Может так пойдет
/* Контролер самодельного газового котла 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); // Клапан газа факела }Ваша ошибка была в том что Вы не опрашивали входы датчиков давления.
Может так пойдет
/* Контролер самодельного газового котла 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); // Клапан газа факела }Ваша ошибка была в том что Вы не опрашивали входы датчиков давления.
теперь котел снова не встает на готовность.
Может так пойдет
/* Контролер самодельного газового котла 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;//нет готовности }Может так пойдет
/* Контролер самодельного газового котла 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;//нет готовности }сейчас возникла проблема когда датчик видет огонь и включает основную горелку. через задержку на факел тухнет готовность факел и сама горелка
сейчас код выглядит так. и когда тухнет пламе готовность и горелка не сбрасывается. но реагирует на давление.
/* Контролер самодельного газового котла 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); // Клапан газа факела }Так попробуйте.
/* Контролер самодельного газового котла 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); // Клапан газа факела }Вообще изначально подход не очень правельный, нужно составить конечный автомат, а потом по нему написать программу.
Так попробуйте.
/* Контролер самодельного газового котла 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); // Клапан газа факела }Вообще изначально подход не очень правельный, нужно составить конечный автомат, а потом по нему написать программу.
фото датчик не реагирует если котел горел и потух. готовность не сбрасывается. но она отлично работает на каналах давления
Так попробуйте.
/* Контролер самодельного газового котла 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 , не разобрался как написать Вам в ЛС, хотел уточнить: вы собираете полностью автономный блок автоматики, или костыль к существующему? Как производится росжиг?
К чему спрашиваю: газовый котел protherm , навернулся блок росжига и автоматики honeywell, ремонту они не поддаются, а новый стоит 10-15 т.р. вот и возникла мысль реализовать на arduino блок автоматики.
По сути задача предстоит такая: газовый клапан управляется напряжением, 220в 100% открытие, ниже - соответственно ниже %. Но с АС напряжением проблема регулировать, проще выставить на 100% т.к за все время работы так и было.
из безопасности установлен датчик разрежения в улитке, которая высасывает отработавшие газы, ну и соответственно датчик пламени, но реализован он по системе Ионизации.. на ардуино ничего похожего не нашел, как вариант использовать фоторезистор.
а вот с росжигом проблема.. кто-то использует от Ксенона, или от катушки зажигания авто (с классики), но система очень "шумная" в сеть.
nezza_profi , не разобрался как написать Вам в ЛС, хотел уточнить: вы собираете полностью автономный блок автоматики, или костыль к существующему? Как производится росжиг?
К чему спрашиваю: газовый котел protherm , навернулся блок росжига и автоматики honeywell, ремонту они не поддаются, а новый стоит 10-15 т.р. вот и возникла мысль реализовать на arduino блок автоматики.
По сути задача предстоит такая: газовый клапан управляется напряжением, 220в 100% открытие, ниже - соответственно ниже %. Но с АС напряжением проблема регулировать, проще выставить на 100% т.к за все время работы так и было.
из безопасности установлен датчик разрежения в улитке, которая высасывает отработавшие газы, ну и соответственно датчик пламени, но реализован он по системе Ионизации.. на ардуино ничего похожего не нашел, как вариант использовать фоторезистор.
а вот с росжигом проблема.. кто-то использует от Ксенона, или от катушки зажигания авто (с классики), но система очень "шумная" в сеть.
мой котел самодельный. все своими руками. сварка и все такое)) в качестве искры буду использовать тоже самодельную схему зажигания на подобе свечи в автомобили. где напряжение большое а вот ток маленький.
выложите обязательно в этой теме подробнее... пока еще ничего не приобретал, но думаю начать сборку
выложите обязательно в этой теме подробнее... пока еще ничего не приобретал, но думаю начать сборку
хорошо завтра объязательно сфоткаю готовое устройство и схема где то должна быть у меня.
Для управления свечей лучше использовать автомобильный комутатор
и вместо прерывателя использовать транзистор на который подавать импульсы для получения продолжительной искры, т.к. при одиночной иске возможно не получится разжеч факел.
Чтобы написать грамотный код нужна полная схема подключения периферии и точный алгоритм работы.
Для управления свечей лучше использовать автомобильный комутатор
и вместо прерывателя использовать транзистор на который подавать импульсы для получения продолжительной искры, т.к. при одиночной иске возможно не получится разжеч факел.
Чтобы написать грамотный код нужна полная схема подключения периферии и точный алгоритм работы.
в принцепи ваш последний код очень отлично работает. я постараюсь поправить его реакцию на пламе. а если не получится то уберу совсем датчики давленя. и поставлю как и планировал на цепь питания. Огромное спасибо вам.
у тому же я подозреваю что возможно эта проблема с реакцией может быть из за протеуса. скоро закончу с монтажом тогда и проверим на деле это все.