Перейти к содержанию

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


Рекомендуемые сообщения

Всем доброго времени суток. На работе случилась беда, навернулся котел, точнее программно-таймерное устройство, дергающее за "веревочки" цепей данного котла. Как у нас в стране обычно бывает, нет ни документации на это устройство,  ни описания логики данного механизма. Ну и соответственно вся возня, касаемая ремонта, легла на плечи коллектива. Недолго думая, обложился всем схемами, которые мог найти, частично методом частичного разбора и замеров расчертил полную схему данного котла. Постепенно логика работы сломанного программно-таймерного устройства стала понятна. Было принято решение воссоздать данный модуль на базе 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 это все заставить работать, так как основному телу программы не нужна цикличность. 

Изменено пользователем Dan Smith
Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Dan Smith сказал:

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

напишите:

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

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

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

Изменено пользователем ruhi
дополнил

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

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

void(* resetFunc) (void) = 0;

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

 

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

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

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

Изменено пользователем Dan Smith
Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

27.02.2021 в 06:41, Dan Smith сказал:

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

Ну вот не хватает мне знаний в программировании контроллера, но остановиться на полпути я не могу. Нужна помощь :( . Суть проблемы такова, Скетч написал, на столе все работает, алгоритм работы в норме. Но скетч получился почти на 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(;;);
  }
}

 

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

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

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

Изменено пользователем Alex
Убрал код под спойлер
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

 

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

Ссылка на комментарий
Поделиться на другие сайты

15 часов назад, Alex сказал:

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


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

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

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

 

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

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

Изменено пользователем Dan Smith
Ссылка на комментарий
Поделиться на другие сайты

2 hours ago, Dan Smith said:

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

7 часов назад, Alex сказал:

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

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

 

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

Изменено пользователем Dan Smith
Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

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

0e77fac53627.jpg
 

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Не маловато?

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

Ссылка на комментарий
Поделиться на другие сайты

24 минуты назад, LiVit сказал:

Не маловато?

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
12.03.2021 в 03:16, _abk_ сказал:

Угадайте, кто сидеть будет, когда на пожарище подгоревшую ардуину найдут?

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

Изменено пользователем Огонёк
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...