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

Плата расширения для Arduino с защищенными 24-вольтовыми ключами Infineon семейства PROFET

Компания Infineon представила плату расширения для Arduino c 24-вольтовыми ключами PROFET™+24V (BTT6xxx). Данное семейство ключей верхнего плеча с защитами предназначено для управления резистивными, емкостными и индуктивными нагрузками (лампы автомобилей, реле, двигатели, клапаны, светодиоды, конденсаторы). Использование платы расширения для Arduino с 24-вольтными защищенными ключами ускоряет создание прототипов и позволяет с минимальными затратами проводить тестирование совместимых по распиновке ключей PROFET™+24V.
Подробнее

Вебинар «Умный и безопасный дом от STMicroelectronics – строим вмеSTе!» (23.06.2021)

Приглашаем 23/06/2021 всех желающих принять участие в вебинаре, посвященном проектированию и разработке систем умного дома на базе компонентов STMicroelectronics. Экосистема продукции STMicroelectronics включает в себя как электронные компоненты, так и средства разработки, готовые стеки протоколов и законченные примеры кода. Предлагаемые ресурсы позволяют разработчику легко построить каркас системы и быстро создать прототип своего приложения. На вебинаре мы также поговорим о беспроводных интерфейсах – ведь благодаря поддержке стандартов BLE и ZigBee вы сможете при необходимости интегрировать устройства сторонних производителей и создавать открытые системы.

Подробнее

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

void(* resetFunc) (void) = 0;

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

 

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

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

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

Edited by Dan Smith

Share this post


Link to post
Share on other sites

TEA от TRACO – семейство 1 Вт DC/DC-преобразователей по доступной цене

Компания TRACO разработала новую серию оптимизированных по стоимости DC/DC-преобразователей TEA с фиксированным входом. Они изготавливаются в наиболее популярных корпусах типа SIP-4 (TEA 1) и SIP-7 (TEA 1E и TEA 1HI) на напряжение «вход-выход» 5-в-5 и изоляцию 1500 и 4000 В (только в корпусе SIP-7). Преобразователи TEA имеют расширенный рабочий температурный диапазон -40…85ºС и предназначены для широкого применения
Подробнее

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
Posted (edited)
12.03.2021 в 03:16, _abk_ сказал:

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

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

Edited by Огонёк

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...

  • Сообщения

    • В CAD моделей нет вообще. В ней есть библиотеки УГО и библиотеки футпринтов. При создании компонента сам ищешь модель и добавляешь к футпринту.   Ну так корпуса элементов стандартные, а модели либо дает производитель, либо они снабжены описанием, которого достаточно для выбора модели.   Я ведь уже писал, что проверка требуется в очень редких случаях. Да и то, достаточно открыть модель в любой CAD типа Solid, Inventor и т.п. и просто измерить.
    • А что ты считаешь ненормальным? Смайлики? Всё? А тему я всю прочитал и видел что автор писал, у него грелось до 90 градусов, считаешь при 90 градусов нельзя яичницу поджарить?)) Кстати, вот, нашел что автор писал.  
    • В вашей CAD этих моделей куча. Нужно выбирать среди них именно ту, которую будете использовать. И перепроверять. Я об этом. С альтиумом не знаю, но по сравнению с KiCad - примитивнее.
    • А морской волк не должет быть белым и пушистым. Ему приходиться грызть такую фигню... К тому же в местах его обитания вокруг столько белых и больших зубов, что без своих долго не протянешь...  
    • Вот и спрашивать надо по нормальному, а не ржать и яичницу жарить. Тыкать будешь своим друзьям алкашам...за гаражом. Как к ко мне люди обращаются, то в ответку и получают. Ясно.
    • Потому что это катушка, намотанная на резисторе мощностью 2Вт. А значит высоту соседних элементов она не превышает и интереса не представляет, и можно не тратить время на ее прорисовку (т.к. готовой модели скорее всего не будет).   Есть специализированные сайты, которые предоставляют модели. Как правило, они совпадают с реальностью и проверки не требуют. Плюс часто сам производитель элементов предоставляет модель. Так что по полученной модели платы можно спокойно делать корпус. Что я обычно и делаю. Например вот так https://cxem.net/mc/mc470.php  Более того, модель элемента позволяет избежать ошибок в посадочном месте элемента, т.к. сразу видно, совпал он с выводами элемента или нет. А он ведь тоже выдает 3D на выходе. И помнится, выглядит она даже красивше альтиума.
    • Самый умный? Да? Был бы  нормальным человеком, объяснил и нехер выопываться. Вот не люблю таких людей которые себя выше всех ставят. А знать всё никто не может. Гонора в тебе много, будь попроще.
×
×
  • Create New...