Jump to content
Dan Smith

Воссоздание алгоритма LAC-3.035 Средствами ардуино

Recommended Posts

Всем доброго времени суток. На работе случилась беда, навернулся котел, точнее программно-таймерное устройство, дергающее за "веревочки" цепей данного котла. Как у нас в стране обычно бывает, нет ни документации на это устройство,  ни описания логики данного механизма. Ну и соответственно вся возня, касаемая ремонта, легла на плечи коллектива. Недолго думая, обложился всем схемами, которые мог найти, частично методом частичного разбора и замеров расчертил полную схему данного котла. Постепенно логика работы сломанного программно-таймерного устройства стала понятна. Было принято решение воссоздать данный модуль на базе AVR контроллера со всеми вытекающими. В спринт лайот накидал печатку, заказал, и пока она доставляется занялся набором программы в среде Arduino IDE. И буквально с первых же попыток написать скетч понял, что с печатками я поторопился,  как я уже потом понял, программно-таймерное устройство c момента запуска должно единожды прогнать перечень команд в void setup и начать следить да датчиками уже в void loop. Следовательно для такого исполнения программы понадобилось дополнять схему парой транзисторов и реле, для коммутации питания ардуино самой на себя.

Ну что-то я в дебри полез. Нужен совет по скетчу. Дабы оставить печатные платы без изменений в первоначальном заказанном виде, хочу избавиться от удерживающего питание реле. Но это получится сделать только если есть возможность в void setup скинуть скетч на начало работы при определенных условиях, но только не средствами reset, а именно программно? Чтото вроде того, что при начале скетча, при несоблюдении условий продолжения работы  void setup начинал выполняться с первой строки. Ниже часть пока еще сырого пробного скетча.

#include <OLED_I2C.h>
OLED  myOLED(4, 3, 4);
extern uint8_t RusFont[];
extern uint8_t SmallFont[];
const int buttonPinSTART = A0;                     // вход для контроля пуск/стоп программы (так же через диод запитывается пин +5v, на который приходит питание через реле, управляемого 13 пином)
const int buttonPinFIRE  = A1;                     // вход для контроля пламени
const int ledPin2 = 2;                             // пин питания дисплея
const int ledPin5 = 5;                             // вывод для реле вентилятора
const int ledPin6 = 6;                             // вывод для реле аварии
const int ledPin7 = 7;                             // вывод для реле воздушной заслонки
const int ledPin8 = 8;                             // вывод для реле соленоид2
const int ledPin9 = 9;                             // вывод для реле розжига
const int ledPin10 = 10;                           // вывод для реле соленоид1
const int ledPin13 = 13;                           // вывод подтяжки питания
int buttonStateSTART = LOW;
int buttonStateFIRE = HIGH;

void setup() {
  pinMode(buttonPinSTART, INPUT);
  pinMode(buttonPinFIRE, INPUT_PULLUP);
  pinMode(ledPin2, OUTPUT);                        // Пин питания дисплея
  pinMode(ledPin5, OUTPUT);                        // Пин управления 
  pinMode(ledPin6, OUTPUT);                        // Пин управления
  pinMode(ledPin7, OUTPUT);                        // Пин управления
  pinMode(ledPin8, OUTPUT);                        // Пин управления
  pinMode(ledPin9, OUTPUT);                        // Пин управления
  pinMode(ledPin10, OUTPUT);                       // Пин управления
  pinMode(ledPin13, OUTPUT);                       // Пин удержания питания микроконтроллера
  digitalWrite(ledPin2,  HIGH);                    // Подклюаем дисплей
  delay(1500);
  myOLED.begin();
  myOLED.clrScr();                                 // Стираем все с экрана
  myOLED.setFont(RusFont);                         // Инициализируем русский шрифт
  myOLED.print( "------" , CENTER, 12);      // Выводим текст ------
  myOLED.print( "------" , CENTER, 30);           // Выводим текст ------
  myOLED.print( "------" , RIGHT, 48);              // Выводим текст ------
  myOLED.update();
  digitalWrite(ledPin13,  HIGH);                   // Подтягиваем питание ардуино через реле
  delay (2000);
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == LOW) {
    myOLED.clrScr();
    myOLED.print( "JNVTYF PFGECRF" , CENTER, 24);    // Выводим текст ОТМЕНА ЗАПУСКА
    myOLED.update();
    delay(1000);
    myOLED.print( "DSRK>XTYBT" , CENTER, 36);        // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.update();
    delay(1000);
    digitalWrite(ledPin13, LOW);
    delay(300);
  }
  myOLED.clrScr();
  myOLED.print( "GJLUJNJDRF R GECRE" , CENTER, 24);  // Выводим текст ПОДГОТОВКА К ПУСКУ
  myOLED.update();
  delay(2000);
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == LOW) {
    myOLED.clrScr();
    myOLED.print( "JNVTYF PFGECRF" , CENTER, 24);    // Выводим текст ОТМЕНА ЗАПУСКА
    myOLED.update();
    delay(1000);
    myOLED.print( "DSRK>XTYBT" , CENTER, 36);        // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.update();
    delay(1000);
    digitalWrite(ledPin13, LOW);
    delay(300);
  }
  myOLED.clrScr();
  myOLED.print( "------" , CENTER, 24);  // Выводим текст 
  myOLED.print( "------" , CENTER, 36);            // Выводим текст 
  myOLED.update();
  delay(1000);
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == LOW) {
    myOLED.clrScr();
    myOLED.print( "JNVTYF PFGECRF" , CENTER, 24);    // Выводим текст ОТМЕНА ЗАПУСКА
    myOLED.update();
    delay(1000);
    myOLED.print( "DSRK>XTYBT" , CENTER, 36);        // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.update();
    delay(1000);
    digitalWrite(ledPin13, LOW);
    delay(300);
  }
  digitalWrite(ledPin7,  HIGH);
  myOLED.clrScr();
  myOLED.print( "------" , CENTER, 24);  // Выводим текст
  myOLED.update();
  delay(1000);
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == LOW) {
    myOLED.clrScr();
    myOLED.print( "JNVTYF PFGECRF" , CENTER, 24);    // Выводим текст ОТМЕНА ЗАПУСКА
    myOLED.update();
    delay(1000);
    myOLED.print( "DSRK>XTYBT" , CENTER, 36);        // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.update();
    digitalWrite(ledPin7, LOW);
    delay(1000);
    digitalWrite(ledPin13, LOW);
    delay(300);
  }
  digitalWrite(ledPin5,  HIGH);
  delay(300);
  .....
  .....
  .....
  .....
  .....
  }
}

void loop() {
  .....
  .....
  .....
  .....
  .....
  }

В данном варианте, при отмене запуска ардуинка проделывает кое какие манипуляции, в зависимости от части кода и снимает питание с пина13 (реле поддержки питания), которое тем временем обестачивает контроллер. Вроде бы задача выполнена, но есть баг. К примеру механик решил выключить котел, повернул тумблер в *0* на стадии предпускового продува камеры, пошел цикл завершения работы. А механик передумал останавливать котел, не дождался пока завершится процесс выключения, врубает тумблер в "работу", при этом в void setup программа отключает подтяжку питания, но продолжает выполнять последовательность действий запуска. В конечном итоге сработает авария, условия которой прописано в void loop. Но момент все равно неприятный. Есть ли возможность в данной строке

    delay(1000);
    digitalWrite(ledPin13, LOW);
    delay(300);

вписать команду, которая заставит  void setup прервать выполнение программы и вернуться к началу (повторюсь, без reset), ну и соответственно избавиться от использования 13 пина и соответственно танцев с подтягиванием питания

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

Edited by Dan Smith

Share this post


Link to post
Share on other sites

Он у вас на батарейках? Зачем вам удерживать питание контроллера, может проще в сон его отправлять. 

Share this post


Link to post
Share on other sites
3 часа назад, Dan Smith сказал:

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

напишите:

goto <начальный адрес памяти программ>

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

<начальный адрес памяти программ> равен нулю на АВР-ах насколько я помню.

Edited by ruhi
дополнил

Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites

Вебинар «Решения Analog Devices для гальванической изоляции. Обзор технологий и новинок» (27.04.2021)

Компания «Компэл» и Analog Devices приглашают всех желающих 27/04/2021 принять участие в вебинаре, посвященном решениям Analog Devices для гальванической изоляции. В программе вебинара: технологии гальванической изоляции iCoupler, цифровые изоляторы, изолированное питание и технология isoPower, гальванически изолированные интерфейсы (RS-485, CAN, USB, I2C, LVDS) и другое.

Подробнее

Пружинные клеммники Degson - высокое качество соединения по оптимальной цене!

Пружинные клеммные блоки Degson для монтажа на печатную плату – это простое и надежное соединение, которое позволяет легко решать задачи для различных приложений за счет обширного ассортимента. Клеммники Degson доступны в двух конструктивных исполнениях (торцевой контакт и зажимная клеть), имеют различные направления ввода проводника (45°, 90°, 180°) и обладают широким диапазоном поперечных сечений (0,2…2,5 мм2).

Подробнее

Спасибо всем откликнувшимся, все получилось с помощью

void(* resetFunc) (void) = 0;

Избавился от лишней обвязки, теперь все работает как надо, но пока еще на столе. Если у кому нибудь будет интересна данная работа, то после получения печаток, сборки контроллера и обкатки на котле, могу выложить весь проект от начала до конца. Так что пишите, за мной не заржавеет. Единственное, надобно размер скетча немного уменьшить, на это есть еще почти месяц) Буду вечерами самообразовываться)

 

4 часа назад, ruhi сказал:

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

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

Edited by Dan Smith

Share this post


Link to post
Share on other sites

Новое семейство ИП от MEAN WELL мощностью 150, 300, 600 Вт с повышенной перегрузочной способностью

Компания MEAN WELL разработала семейство источников питания номинальной мощностью 150, 300 и 600 Вт с возможностью кратковременной безопасной работы при мощности в 2,5 раза выше номинальной (до 5 секунд). Данное семейство источников питания востребовано в промышленных установках с использованием электродвигателей или с емкостной нагрузкой. Применяя новые источники питания HRP/N можно получить экономический выигрыш.

Подробнее

6 часов назад, Dan Smith сказал:

все получилось с помощью

а я уж забыл что в goto нельзя метку произвольную написать! Докопаться до указателя на функцию - это уже очень высокая компетенция, удачи!


Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites

Никак не хотел чем-то зацепить и огорчить, Ваш ответ сподвиг читать про команду "goto", чтобы понять как это работает и с чем ее готовить, попутно нашел еще несколько примеров подобной команды и все их попробовал, остановился на функции, которую и оставил в своем скетче. Тупо использовать Вашу подсказку - не научиться ничему, а так почитал, и что-то запомнил. Так что не поймите не правильно, еще раз Вам спасибо за совет, направление мне дали, а дальше уже пошло поехало)

Share this post


Link to post
Share on other sites
27.02.2021 в 06:41, Dan Smith сказал:

Никак не хотел чем-то зацепить и огорчить,

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


Можно сделать все! Но чем больше можно, тем больше нельзя!

Share this post


Link to post
Share on other sites
Posted (edited)

Ну вот не хватает мне знаний в программировании контроллера, но остановиться на полпути я не могу. Нужна помощь :( . Суть проблемы такова, Скетч написал, на столе все работает, алгоритм работы в норме. Но скетч получился почти на 600 строк. Очень много повторяющихся блоков, которые мне посоветовали упростить в цикле for. Я бы рад попробовать, но открывая скетч,не могу понять даже с чего начинать) Происки информации по работе for еще больше закидывают меня в замешательство. 

Вот полный скетч...

Скрытый текст

#include <OLED_I2C.h>
OLED  myOLED(4, 3, 4);
extern uint8_t RusFont[];
extern uint8_t SmallFont[];
const int buttonPinSTART = A0;                     // вход для контроля пуск/стоп программы
const int buttonPinFIRE  = A1;                     // вход для контроля пламени
const int ledPin2 = 2;                             // пин питания дисплея
const int ledPin5 = 5;                             // вывод для реле вентилятора
const int ledPin6 = 6;                             // вывод для реле аварии
const int ledPin7 = 7;                             // вывод для реле воздушной заслонки
const int ledPin8 = 8;                             // вывод для реле соленоид2
const int ledPin9 = 9;                             // вывод для реле розжига
const int ledPin10 = 10;                           // вывод для реле соленоид1
const int ledPin13 = 13;                           // вывод поморгать)
int buttonStateSTART = LOW;
int buttonStateFIRE = HIGH;
void(* resetFunc) (void) = 0;                      // объявляем функцию reset с адресом 0

void setup() {
  pinMode(buttonPinSTART, INPUT_PULLUP);
  pinMode(buttonPinFIRE, INPUT);
  pinMode(ledPin2, OUTPUT);                        // пин питания дисплея
  pinMode(ledPin5, OUTPUT);                        // Пин управления вентилятором форсунки
  pinMode(ledPin6, OUTPUT);                        // Пин сигнала аварии по исвчезновению факела
  pinMode(ledPin7, OUTPUT);                        // Пин управления воздушной заслонкой
  pinMode(ledPin8, OUTPUT);                        // Пин управления соленоидом второй форсунки
  pinMode(ledPin9, OUTPUT);                        // Пин управления транформатором розжига пламени
  pinMode(ledPin10, OUTPUT);                       // Пин управления соленоидом первой форсунки
  pinMode(ledPin13, OUTPUT);                       // Контроль по диоду на ардуинке
  digitalWrite(ledPin2,  HIGH);                    // Подклюаем дисплей
  digitalWrite(ledPin6,  LOW);                     // Отключаем ревун
  myOLED.begin();
  myOLED.setFont(RusFont);                         // Инициализируем русский шрифт
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == HIGH) {
  digitalWrite(ledPin13,  HIGH);      
  delay(500);   
  digitalWrite(ledPin13,  LOW);   
  delay(500);
  resetFunc();                                     //Вызываем reset
  }
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == HIGH) {
    myOLED.clrScr();
    myOLED.print( "JNVTYF PFGECRF" , CENTER, 24);    // Выводим текст ОТМЕНА ЗАПУСКА
    myOLED.update();
    delay(1000);
    myOLED.print( "DSRK>XTYBT" , CENTER, 36);        // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.update();
    delay(1000);
    resetFunc();                                     //Вызываем reset
    delay(300);
  }
  myOLED.clrScr();
  myOLED.print( "-----" , CENTER, 12);           // Выводим текст 
  myOLED.print( "-----" , CENTER, 30);           // Выводим текст 
  myOLED.print( "-----" , RIGHT, 48);            // Выводим текст 
  myOLED.update();
  delay(2000);
  myOLED.clrScr();
  myOLED.print( "GJLUJNJDRF R GECRE" , CENTER, 24);  // Выводим текст ПОДГОТОВКА К ПУСКУ
  myOLED.update();
  delay(1000);
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == HIGH) {
    myOLED.clrScr();
    myOLED.print( "JNVTYF PFGECRF" , CENTER, 24);    // Выводим текст ОТМЕНА ЗАПУСКА
    myOLED.update();
    delay(1000);
    myOLED.print( "DSRK>XTYBT" , CENTER, 36);        // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.update();
    delay(1000);
    resetFunc();                                     //Вызываем reset
    delay(300);
  }
  myOLED.clrScr();
  myOLED.print( "JNRHSNBT DJPLEIYJQ" , CENTER, 24);  // Выводим текст ОТКРЫТИЕ ВОЗДУШНОЙ
  myOLED.print( "PFCKJYRB" , CENTER, 36);            // Выводим текст ЗАСЛОНКИ
  myOLED.update();
  delay(1000);
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == HIGH) {
    myOLED.clrScr();
    myOLED.print( "JNVTYF PFGECRF" , CENTER, 24);    // Выводим текст ОТМЕНА ЗАПУСКА
    myOLED.update();
    delay(1000);
    myOLED.print( "DSRK>XTYBT" , CENTER, 36);        // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.update();
    delay(1000);
    resetFunc();                                     //Вызываем reset
    delay(300);
  }
  digitalWrite(ledPin7,  HIGH);
  myOLED.clrScr();
  myOLED.print( "PFGECR DTYNBKZNJHF" , CENTER, 24);  // Выводим текст ЗАПУСК ВЕНТИЛЯТОРА
  myOLED.update();
  delay(1000);
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == HIGH) {
    myOLED.clrScr();
    myOLED.print( "JNVTYF PFGECRF" , CENTER, 24);    // Выводим текст ОТМЕНА ЗАПУСКА
    myOLED.update();
    delay(1000);
    myOLED.print( "DSRK>XTYBT" , CENTER, 36);        // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.update();
    digitalWrite(ledPin7, LOW);
    delay(1000);
    resetFunc();                                     //Вызываем reset
    delay(300);
  }
  digitalWrite(ledPin5,  HIGH);
  delay(300);
  myOLED.clrScr();
  myOLED.print( "GHJLEDRF RFVTHS" , CENTER, 12);      // Выводим текст ПРОДУВКА КАМЕРЫ
  myOLED.print( "J:BLFYBT HJP:BUF" , CENTER, 24);     // Выводим текст ОЖИДАНИЕ РОЗЖИГА
  myOLED.print( "XTHTP" , CENTER, 36);                // Выводим текст ЧЕРЕЗ
  myOLED.print( "-15-" , CENTER, 48);                 // Выводим текст -15-
  myOLED.update();
  delay(1000);
  myOLED.print( "-14-" , CENTER, 48);// Выводим текст -14-
  myOLED.update();
  delay(1000);
  myOLED.print( "-13-" , CENTER, 48);// Выводим текст -13-
  myOLED.update();
  delay(1000);
  myOLED.print( "-12-" , CENTER, 48);// Выводим текст -12-
  myOLED.update();
  delay(1000);
  myOLED.print( "-11-" , CENTER, 48);// Выводим текст -11-
  myOLED.update();
  delay(1000);
  myOLED.print( "-10-" , CENTER, 48);// Выводим текст -10-
  myOLED.update();
  delay(1000);
  myOLED.print( "-09-" , CENTER, 48);// Выводим текст -09-
  myOLED.update();
  delay(1000);
  myOLED.print( "-08-" , CENTER, 48);// Выводим текст -08-
  myOLED.update();
  delay(1000);
  myOLED.print( "-07-" , CENTER, 48);// Выводим текст -07-
  myOLED.update();
  delay(1000);
  myOLED.print( "-06-" , CENTER, 48);// Выводим текст -06-
  myOLED.update();
  delay(1000);
  myOLED.print( "-05-" , CENTER, 48);// Выводим текст -05-
  myOLED.update();
  delay(1000);
  myOLED.print( "-04-" , CENTER, 48);// Выводим текст -04-
  myOLED.update();
  delay(1000);
  myOLED.print( "-03-" , CENTER, 48);// Выводим текст -03-
  myOLED.update();
  delay(1000);
  myOLED.print( "-02-" , CENTER, 48);// Выводим текст -02-
  myOLED.update();
  delay(1000);
  myOLED.print( "-01-" , CENTER, 48);// Выводим текст -01-
  myOLED.update();
  delay(1000);
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == HIGH) {
    myOLED.clrScr();
    myOLED.print( "JNVTYF PFGECRF" , CENTER, 24);    // Выводим текст ОТМЕНА ЗАПУСКА
    myOLED.update();
    digitalWrite(ledPin5, LOW);
    delay(1000);
    myOLED.print( "DSRK>XTYBT" , CENTER, 36);        // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.update();
    digitalWrite(ledPin7, LOW);
    delay(1000);
    resetFunc();                                     //Вызываем reset
    delay(300);
  }
  digitalWrite(ledPin9,  HIGH);                      // включение тр-р розжига
  myOLED.clrScr();
  myOLED.print( "HJP:BU" , CENTER, 12);              // Выводим текст РОЗЖИГ
  myOLED.print( "PFGECR AJHCEYRB 1" , CENTER, 24);   // Выводим текст ЗАПУСК ФОРСУНКИ 1
  myOLED.print( "XTHTP" , CENTER, 36);               // Выводим текст ЧЕРЕЗ
  myOLED.print( "-3-" , CENTER, 48);                 // Выводим текст -3-
  myOLED.update();
  delay(1000);
  myOLED.print( "-2-" , CENTER, 48);                 // Выводим текст -2-
  myOLED.update();
  delay(1000);
  myOLED.print( "-1-" , CENTER, 48);                 // Выводим текст -1-
  myOLED.update();
  delay(1000);
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == HIGH) {
    myOLED.clrScr();
    myOLED.print( "JNVTYF PFGECRF" , CENTER, 24);    // Выводим текст ОТМЕНА ЗАПУСКА
    myOLED.update();
    delay(1000);
    myOLED.print( "DSRK>XTYBT" , CENTER, 36);        // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.update();
    digitalWrite(ledPin9, LOW);
    digitalWrite(ledPin5, LOW);
    delay(2000);
    digitalWrite(ledPin7, LOW);
    delay(1000);
    resetFunc();                                     //Вызываем reset
    delay(300);
  }
  digitalWrite(ledPin10,  HIGH);                     // включение соленоида 1й форсунки
  myOLED.clrScr();
  myOLED.print( "HF<JNF AJHCEYRB 1" , CENTER, 12);   // Выводим текст  РАБОТА фОРСУНКИ 1
  myOLED.print( "RJYNHJKM AFRTKF" , CENTER, 24);     // Выводим КОНТРОЛЬ ФАКЕЛА
  myOLED.print( "XTHTP" , CENTER, 36);               // Выводим текст ЧЕРЕЗ
  myOLED.print( "-5-" , CENTER, 48);                 // Выводим текст -5-
  myOLED.update();
  delay(1000);
  myOLED.print( "-4-" , CENTER, 48);// Выводим текст -4-
  myOLED.update();
  delay(1000);
  myOLED.print( "-3-" , CENTER, 48);// Выводим текст -3-
  myOLED.update();
  delay(1000);
  digitalWrite(ledPin9,  LOW);                        // выключение тр-р розжига
  myOLED.print( "-2-" , CENTER, 48);// Выводим текст -2-
  myOLED.update();
  delay(1000);
  myOLED.print( "-1-" , CENTER, 48);// Выводим текст -1-
  myOLED.update();
  delay(1000);
  buttonStateSTART = digitalRead(buttonPinSTART);
  if (buttonStateSTART == HIGH) {
    myOLED.clrScr();
    myOLED.print( "JNVTYF PFGECRF" , CENTER, 24);    // Выводим текст ОТМЕНА ЗАПУСКА
    myOLED.update();
    digitalWrite(ledPin10, LOW);
    delay(1000);
    myOLED.clrScr();
    myOLED.print( "GHJLEDRF RFVTHS" , CENTER, 12);    // Выводим текст ПРОДУВКА КАМЕРЫ
    myOLED.print( "DSRK>XTYBT" , CENTER, 24);         // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.print( "XTHTP" , CENTER, 36);              // Выводим текст ЧЕРЕЗ
    myOLED.print( "-15-" , CENTER, 48);               // Выводим текст -15-
    myOLED.update();
    delay(1000);
    myOLED.print( "-14-" , CENTER, 48);// Выводим текст -14-
    myOLED.update();
    delay(1000);
    myOLED.print( "-13-" , CENTER, 48);// Выводим текст -13-
    myOLED.update();
    delay(1000);
    myOLED.print( "-12-" , CENTER, 48);// Выводим текст -12-
    myOLED.update();
    delay(1000);
    myOLED.print( "-11-" , CENTER, 48);// Выводим текст -11-
    myOLED.update();
    delay(1000);
    myOLED.print( "-10-" , CENTER, 48);// Выводим текст -10-
    myOLED.update();
    delay(1000);
    myOLED.print( "-09-" , CENTER, 48);// Выводим текст -09-
    myOLED.update();
    delay(1000);
    myOLED.print( "-08-" , CENTER, 48);// Выводим текст -08-
    myOLED.update();
    delay(1000);
    myOLED.print( "-07-" , CENTER, 48);// Выводим текст -07-
    myOLED.update();
    delay(1000);
    myOLED.print( "-06-" , CENTER, 48);// Выводим текст -06-
    myOLED.update();
    delay(1000);
    myOLED.print( "-05-" , CENTER, 48);// Выводим текст -05-
    myOLED.update();
    delay(1000);
    myOLED.print( "-04-" , CENTER, 48);// Выводим текст -04-
    myOLED.update();
    delay(1000);
    myOLED.print( "-03-" , CENTER, 48);// Выводим текст -03-
    myOLED.update();
    delay(1000);
    digitalWrite(ledPin5, LOW);
    myOLED.print( "-02-" , CENTER, 48);// Выводим текст -02-
    myOLED.update();
    delay(1000);
    myOLED.print( "-01-" , CENTER, 48);// Выводим текст -01-
    myOLED.update();
    digitalWrite(ledPin7, LOW);
    delay(1000);
    myOLED.print( "----" , CENTER, 48);
    myOLED.update();
    delay(1000);
    resetFunc();                                     //Вызываем reset
    delay(300);
  }
}

void loop() {
  buttonStateSTART = digitalRead(buttonPinSTART);
  buttonStateFIRE = digitalRead(buttonPinFIRE);
  if (buttonStateSTART == LOW && buttonStateFIRE == HIGH) {
    digitalWrite(ledPin8,  HIGH);
    myOLED.clrScr();
    myOLED.print( "RJNTK DDTLTY" , CENTER, 12);         // Выводим текст КОТЕЛ ВВЕДЕН
    myOLED.print( "AJHCEYRF 2 UJNJDF" , CENTER, 24);    // Выводим текст фОРСУНКА 2 ГОТОВА  
    myOLED.print( "R PFGECRE" , CENTER, 36);            // Выводим текст К ЗАПУСКУ
    myOLED.update();
    delay(3000);
  }
  if (buttonStateSTART == HIGH && buttonStateFIRE == HIGH) {
    digitalWrite(ledPin8,  LOW);
    digitalWrite(ledPin10,  LOW);
    myOLED.clrScr();
    myOLED.print( "GHJLEDRF RFVTHS" , CENTER, 12);      // Выводим текст ПРОДУВКА КАМЕРЫ
    myOLED.print( "DSRK>XTYBT" , CENTER, 24);           // Выводим текст ВЫКЛЮЧЕНИЕ
    myOLED.print( "XTHTP" , CENTER, 36);                // Выводим текст ЧЕРЕЗ
    myOLED.print( "-15-" , CENTER, 48);                 // Выводим текст -15-
    myOLED.update();
    delay(1000);
    myOLED.print( "-14-" , CENTER, 48);// Выводим текст -14-
    myOLED.update();
    delay(1000);
    myOLED.print( "-13-" , CENTER, 48);// Выводим текст -13-
    myOLED.update();
    delay(1000);
    myOLED.print( "-12-" , CENTER, 48);// Выводим текст -12-
    myOLED.update();
    delay(1000);
    myOLED.print( "-11-" , CENTER, 48);// Выводим текст -11-
    myOLED.update();
    delay(1000);
    myOLED.print( "-10-" , CENTER, 48);// Выводим текст -10-
    myOLED.update();
    delay(1000);
    myOLED.print( "-09-" , CENTER, 48);// Выводим текст -09-
    myOLED.update();
    delay(1000);
    myOLED.print( "-08-" , CENTER, 48);// Выводим текст -08-
    myOLED.update();
    delay(1000);
    myOLED.print( "-07-" , CENTER, 48);// Выводим текст -07-
    myOLED.update();
    delay(1000);
    myOLED.print( "-06-" , CENTER, 48);// Выводим текст -06-
    myOLED.update();
    delay(1000);
    myOLED.print( "-05-" , CENTER, 48);// Выводим текст -05-
    myOLED.update();
    delay(1000);
    myOLED.print( "-04-" , CENTER, 48);// Выводим текст -04-
    myOLED.update();
    delay(1000);
    myOLED.print( "-03-" , CENTER, 48);// Выводим текст -03-
    myOLED.update();
    delay(1000);
    digitalWrite(ledPin5, LOW);
    myOLED.print( "-02-" , CENTER, 48);// Выводим текст -02-
    myOLED.update();
    delay(1000);
    myOLED.print( "-01-" , CENTER, 48);// Выводим текст -01-
    myOLED.update();
    digitalWrite(ledPin7, LOW);
    delay(1000);
    myOLED.print( "----" , CENTER, 48);
    myOLED.update();
    delay(700);
    resetFunc();                                     //Вызываем reset
    delay(300);
  }
  if (buttonStateFIRE == LOW) {
    digitalWrite(ledPin6,  HIGH);
    digitalWrite(ledPin8,  LOW);
    digitalWrite(ledPin10,  LOW);
    myOLED.clrScr();
    myOLED.print( "FDFHBQYJT JNRK>XTYBT" , CENTER, 24); // Выводим текст АВАРИЙНОЕ ОТКЛЮЧЕНИЕ
    myOLED.print( "GJNE{ AFRTK" , CENTER, 12);          // Выводим текст ПОТУХ ФАКЕЛ
    myOLED.print( "GHJLEDRF RFVTHS" , CENTER, 36);      // Выводим текст ПРОДУВКА КАМЕРЫ
    myOLED.print( "-30-" , CENTER, 48);                 // Выводим текст -30-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-29-" , CENTER, 48);// Выводим текст -29-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-28-" , CENTER, 48);// Выводим текст -28-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-27-" , CENTER, 48);// Выводим текст -27-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-26-" , CENTER, 48);// Выводим текст -26-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-25-" , CENTER, 48);// Выводим текст -25-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-24-" , CENTER, 48);// Выводим текст -24-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-23-" , CENTER, 48);// Выводим текст -23-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-22-" , CENTER, 48);// Выводим текст -22-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-21-" , CENTER, 48);// Выводим текст -21-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-20-" , CENTER, 48);// Выводим текст -20-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-19-" , CENTER, 48);// Выводим текст -19-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-18-" , CENTER, 48);// Выводим текст -18-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-17-" , CENTER, 48);// Выводим текст -17-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-16-" , CENTER, 48);// Выводим текст -16-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-15-" , CENTER, 48);// Выводим текст -15-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-14-" , CENTER, 48);// Выводим текст -14-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-13-" , CENTER, 48);// Выводим текст -13-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-12-" , CENTER, 48);// Выводим текст -12-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-11-" , CENTER, 48);// Выводим текст -11-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-10-" , CENTER, 48);// Выводим текст -10-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-09-" , CENTER, 48);// Выводим текст -09-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-08-" , CENTER, 48);// Выводим текст -08-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-07-" , CENTER, 48);// Выводим текст -07-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-06-" , CENTER, 48);// Выводим текст -06-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-05-" , CENTER, 48);// Выводим текст -05-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-04-" , CENTER, 48);// Выводим текст -04-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-03-" , CENTER, 48);// Выводим текст -03-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    digitalWrite(ledPin5, LOW);
    myOLED.print( "-02-" , CENTER, 48);// Выводим текст -02-
    myOLED.update();
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.print( "-01-" , CENTER, 48);// Выводим текст -01-
    myOLED.update();
    digitalWrite(ledPin7, LOW);
    delay(1000);
    buttonStateSTART = digitalRead(buttonPinSTART);
    if (buttonStateSTART == HIGH) {
    digitalWrite(ledPin6, LOW);
  }
    myOLED.clrScr();
    myOLED.print( "RJNTK PF<KJRBHJDFY" , CENTER, 12); // Выводим текст КОТЕЛ ЗАБЛОКИРОВАН 
    myOLED.print( "NHT<ETNCZ" , CENTER, 24);          // Выводим текст ТРЕБУЕТСЯ  
    myOLED.print( "GTHTPFGECR" , CENTER, 36);         // Выводим текст ПЕРЕЗАПУСК
    myOLED.print( "NEV<KTHJV HF1" , CENTER, 48);      // Выводим текст ТУМБЛЕРОМ РВ1
    myOLED.update();
    digitalWrite(ledPin6, LOW);
    delay(1000);
    for(;;);
  }
}

 

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

Я уже на финишной прямой, но конкректно забуксовал(

Если можно то хоть примерчик скиньте как реализовать.

Edited by Alex
Убрал код под спойлер

Share this post


Link to post
Share on other sites

Вам, по сути, только вот эту строку переделать для цикла :

myOLED.print( "-29-" , CENTER, 48);

Остальное всё - одно и тоже, повторяющееся.
И запихиваем этот маленький кусок кода в цикл.

Посмотрите, может ли класс OLED работать с числами.

 

PS: Я настоятельно Вам рекомендую бросить эту затею и заставить руководство приобрести лицензированную автоматику. Поверьте мне, как КИПовцу с 20-тилетнем стажем, газовые котлы - страшная штука. А в условиях даже небольших помех, ваша "автоматика" обязательно будет сбоить. И дай Бог, чтобы она сбойнула в нужную сторону :(

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Posted (edited)
15 часов назад, Alex сказал:

Вам, по сути, только вот эту строку переделать для цикла :


myOLED.print( "-29-" , CENTER, 48);

Остальное всё - одно и тоже, повторяющееся.
И запихиваем этот маленький кусок кода в цикл.

Посмотрите, может ли класс OLED работать с числами.

 

PS: Я настоятельно Вам рекомендую бросить эту затею и заставить руководство приобрести лицензированную автоматику. Поверьте мне, как КИПовцу с 20-тилетнем стажем, газовые котлы - страшная штука. А в условиях даже небольших помех, ваша "автоматика" обязательно будет сбоить. И дай Бог, чтобы она сбойнула в нужную сторону :(

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

Edited by Dan Smith

Share this post


Link to post
Share on other sites
2 hours ago, Dan Smith said:

котел не газовый, на салярке, большая часть защиты реализована вне данного блока,

Нет разницы. Откажет какая-то часть защиты вне данного блока и... Угадайте, кто сидеть будет, когда на пожарище подгоревшую ардуину найдут?

Share this post


Link to post
Share on other sites

Не хотелось бы переводить тему в подобное рассуждение)) Я все прекрасно понимаю, но когда начальство "любит" в хвост и гриву, тут остается либо лишаться рабочего места, либо выкручиваться всеми подручными способами. Задача в данный момент стоит не в эксплуатации котла, а в предъявлении его в рабочем состоянии для "галочки". И надеюсь все понимают, что в нашей стране всё всегда так делалось и делается. Повторюсь, что данный блок - это временное решение, дотянуть до сервисного ремонта. Да и сам лет 20 работаю с системами автоматики, и не такое видел)

Share this post


Link to post
Share on other sites

Ну, Вам видней ... :)

22 часа назад, Alex сказал:

Посмотрите, может ли класс OLED работать с числами.

Это посмотрели ?

Share this post


Link to post
Share on other sites
Posted (edited)
7 часов назад, Alex сказал:

Это посмотрели ?

Доброго дня, к компьютеру не дорваться, работы понавалилось.  По Вашему вопросу затрудняюсь ответить, так как не до конца понимаю суть вопроса. Если Вы имели ввиду (может ли он проводить вычисления своими ресурсами?,то наврятли.) Использовал такой вот распространенный дисплей. По крайней мере числа то он выводит, как и текст

 

oled-i2c-display-1-3-inch-128x64px-4-1-720x720.jpg

Edited by Dan Smith

Share this post


Link to post
Share on other sites

Имеется в виду класс Oled в библиотеке Ардуино.

Share this post


Link to post
Share on other sites

Всем спасибо. Тихим сапом разобрался) 

0e77fac53627.jpg
 

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

Share this post


Link to post
Share on other sites
14 часов назад, Dan Smith сказал:

... 4х слойного текстолита.. Без него никак.

Серьезно? 6 релюшек, трансформатор, буратина и дисплей - надо 4 слоя?

Не маловато?

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

Share this post


Link to post
Share on other sites
24 минуты назад, LiVit сказал:

Не маловато?

В том и дело, между двумя слоями спрятать слаботочку, так же ардуино распаять на плате и спрятать под экран...

Share this post


Link to post
Share on other sites
5 часов назад, Dan Smith сказал:

В том и дело, между двумя слоями спрятать слаботочку

т.е., наружние слои будут земляными, а внутренние сигнальными?
Это что-то новенькое.
Нет, я видел такое, но для сигналов 1,8В, никак не 5.
Я не отговариваю - развлекайтесь, ваше право.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...