Имитация бортовых огней самолета

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

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

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

Из того что смог сделать сам, это переключение режимов и мигание, но с ним беда, настроить его не реально, чтоб было хотя бы похоже на реальность.

В интернете нашел похожие проекты, но их авторы не делятся кодом. 

Мой недокод тут, более подробно расписано в комментариях.
Научите меня мигать нормально диодами)
 

p.s. прошу не кидаться тапками :)

int regim = 0;          // объявляем переменную для переключения режимов
int flag = 0;           // хз что это
int cabin = 10;         // освещение салона 10 пин
int logo = 9;           // освещение логотипа 9 пин
int taxi = 8;           // рулежная фара 8 пин
int landing = 7;        // посадочные фары 7 пин
int strobe = 6;      // мигающие белые (по две вспышки) 6 пин
int beacon = 5;         // мигающие красные 5 пин
int nav = 4;            // красный_зеленый_белый_ 4 пин
int button = 2;         // сенсорная кнопка для переключения режимов
int dly = 100;          // интервал мигания

void setup()
{
  pinMode(cabin, OUTPUT);
  pinMode(logo, OUTPUT);
  pinMode(taxi, OUTPUT);
  pinMode(landing, OUTPUT);
  pinMode(strobe, OUTPUT);
  pinMode(beacon, OUTPUT);
  pinMode(nav, OUTPUT);
  pinMode(button, INPUT);
}

void loop()
{
  if (digitalRead(button) == HIGH && flag == 0) // не уверен что написан код правильно для переключения, но работает
  {
    regim++;
    flag = 1;

    if (regim > 9)
    {
      regim = 1;
    }
  }
  if (digitalRead(button) == LOW && flag == 1)
  {

    flag = 0;
  }

  if (regim == 1) // тестовый (первый) режим, все огни включить поочередно с интервалом
  {
    delay (1000);
    digitalWrite(cabin, HIGH);
    delay (500);
    digitalWrite(logo, HIGH);
    delay (500);
    digitalWrite(taxi, HIGH);
    delay (500);
    digitalWrite(landing, HIGH);
    delay (500);
    digitalWrite(strobe, HIGH);
    delay (500);
    digitalWrite(beacon, HIGH);
    delay (500);
    digitalWrite(nav, HIGH);
    delay (500);
    digitalWrite(cabin, LOW);
    delay (500);
    digitalWrite(logo, LOW);
    delay (500);
    digitalWrite(taxi, LOW);
    delay (500);
    digitalWrite(landing, LOW);
    delay (500);
    digitalWrite(strobe, LOW);
    delay (500);
    digitalWrite(beacon, LOW);
    delay (500);
    digitalWrite(nav, LOW);                 // ну и как по мне, тут нужно остановить мигание. Одного круга достаточно
  }

  if (regim == 2) //  второй режим_самолет на стоянке
  {
    digitalWrite(cabin, HIGH); //работает освещение салона
    digitalWrite(logo, HIGH); // работает освещение логотипа на хвосте
    digitalWrite(taxi, LOW);
    digitalWrite(landing, LOW);
    digitalWrite(strobe, LOW);
    digitalWrite(beacon, LOW);
    digitalWrite(nav, HIGH); // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
  }

  if (regim == 3) // третий режим_руление
  {
    digitalWrite(cabin, HIGH); //работает освещение салона. Идеально бы его подключить к ШИМ и сделать на 50% тусклее
    digitalWrite(logo, HIGH); // работает освещение логотипа на хвосте
    digitalWrite(taxi, HIGH);  // работает рулежная фара
    digitalWrite(landing, LOW);
    digitalWrite(strobe, LOW);
    digitalWrite(beacon, HIGH); // мигают два красных диода. с интервалом: High - 200мс, Low - 1500мс
    digitalWrite(nav, HIGH);      // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
  }

  if (regim == 4) // четвертый режим_взлет
  {
    digitalWrite(cabin, LOW);
    digitalWrite(logo, HIGH); // работает освещение логотипа на хвосте
    digitalWrite(taxi, HIGH); // работает рулежная фара
    digitalWrite(landing, HIGH); // включены взлетно посадочные огни
    digitalWrite(strobe, HIGH); // мигают белые диоды. Две вспышки одна за одной, буквально мгновение и пауза 1500мс. Srtobe и Beacon разведены в интервале ровно на половину.
    // т.е. одни огни не догоняют другие в частоте. Одновременно горят только одни из двух. Подробнее и понятнее в видео.
    digitalWrite(beacon, HIGH); // мигают два красных диода. с интервалом: High - 200мс, Low - 1500мс
    digitalWrite(nav, HIGH);  // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
  }

  if (regim == 5) // пятый режим_полет на эшелоне
  {
    digitalWrite(cabin, HIGH); //работает освещение салона
    digitalWrite(logo, HIGH); // работает освещение логотипа на хвосте
    digitalWrite(taxi, LOW);
    digitalWrite(landing, LOW);
    digitalWrite(strobe, HIGH); // мигают белые диоды. Две вспышки одна за одной, буквально мгновение и пауза 1500мс. Srtobe и Beacon разведены в интервале ровно на половину.
    // т.е. одни огни не догоняют другие в частоте. Одновременно горят только одни из двух. Подробнее и понятнее в видео.
    digitalWrite(beacon, HIGH); // мигают два красных диода. с интервалом: High - 200мс, Low - 1500мс
    digitalWrite(nav, HIGH);     // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
  }

  if (regim == 6) // шестой режим_посадка (тоже самое, что и взлет)
  {
    digitalWrite(cabin, LOW);
    digitalWrite(logo, HIGH); // работает освещение логотипа на хвосте
    digitalWrite(taxi, HIGH); // работает рулежная фара
    digitalWrite(landing, HIGH); // включены взлетно посадочные огни
    digitalWrite(strobe, HIGH); // мигают белые диоды. Две вспышки одна за одной, буквально мгновение и пауза 1500мс. Srtobe и Beacon разведены в интервале ровно на половину.
    // т.е. одни огни не догоняют другие в частоте. Одновременно горят только одни из двух. Подробнее и понятнее в видео.
    digitalWrite(beacon, HIGH); // мигают два красных диода. с интервалом: High - 200мс, Low - 1500мс
    digitalWrite(nav, HIGH); // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
  }

  if (regim == 7) // седьмой режим_руление (тоже самое, что и третий режим)
  {
    digitalWrite(cabin, HIGH); //работает освещение салона. Идеально бы его подключить к ШИМ и сделать на 50% тусклее
    digitalWrite(logo, HIGH); // работает освещение логотипа на хвосте
    digitalWrite(taxi, HIGH);  // работает рулежная фара
    digitalWrite(landing, LOW);
    digitalWrite(strobe, LOW);
    digitalWrite(beacon, HIGH); // мигают два красных диода. с интервалом: High - 200мс, Low - 1500мс
    digitalWrite(nav, HIGH);      // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
  }

  if (regim == 8) //  восьмой режим_самолет на стоянке
  {
    digitalWrite(cabin, HIGH); //работает освещение салона
    digitalWrite(logo, HIGH); // работает освещение логотипа на хвосте
    digitalWrite(taxi, LOW);
    digitalWrite(landing, LOW);
    digitalWrite(strobe, LOW);
    digitalWrite(beacon, LOW);
    digitalWrite(nav, HIGH); // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
  }

  if (regim == 9) //девятый режим_новогодняя елка_все включено и мигает (strobe и beacon)
  {
    digitalWrite(cabin, HIGH);
    digitalWrite(logo, HIGH);
    digitalWrite(taxi, HIGH);
    digitalWrite(landing, HIGH);
    digitalWrite(strobe, HIGH); // мигают белые диоды. Две вспышки одна за одной, буквально мгновение и пауза 1500мс. Srtobe и Beacon разведены в интервале ровно на половину.
    // т.е. одни огни не догоняют другие в частоте. Одновременно горят только одни из двух. Подробнее и понятнее в видео.
    digitalWrite(beacon, HIGH); // мигают два красных диода. с интервалом: High - 200мс, Low - 1500мс
    digitalWrite(nav, HIGH);  // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
  }

  if (regim == 10) //девятый режим_Off_или как-то реализовать режим сна
  {
    digitalWrite(cabin, LOW);
    digitalWrite(logo, LOW);
    digitalWrite(taxi, LOW);
    digitalWrite(landing, LOW);
    digitalWrite(strobe, LOW);
    digitalWrite(beacon, LOW);
    digitalWrite(nav, LOW);
  }

}
BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я делитант в авиации, поэтому кроме мигающих огней (раз в пять секунд вроде?) ничего другого не заметил (на видео). Поясните «тонкости» огней. 

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

Да конечно, сейчас попробую.
Я сейчас пишу про реальный самолёт, не модель.

1. Освещение салона. Ну тут думаю вск понятно, белый свет который вкл или выкл.
2. Освещение хвоста самолёта двумя белыми лампами. Установлены на горизонтальном стабилизаторе, на хвосте в общем. Тоже вкл или выкл. Называется также как logo light. Так как они подсвечивают логотип авиакомпании.
3. Рулежная фара находится на передней стойке шасси. Используется при рулении по аэропорту и иногда при взлете. Вкл-выкл.
4. Посадочные огни, используют при взлете и посадке. Вкл-выкл.
5. Beacon - это красные огни внизу и вверху фюзеляжа самолёта( нижний по центру, верхний ближе к передней части). Мигают синхронно между собой. Одна вспышка на 100-200мс и пауза на полторы секунды. И так всегда от момента запуска двигателей и до выключения.
6. Strobe - белые огни по краям крыла и в хвосте. Мигают с момента как самолёт выруливает на полосу. Мигают двойной вспышкой и потом пауза полторы секунды.
Стробы и биконы обычно рассинхронизированы.
7. Навигационные огни -красный и зелёный огонь рядом со строками на конце крыла. Горят во время полёта.

b707
Offline
Зарегистрирован: 26.05.2017

yauhenibabuk, задачка-то вроде несложная. Пункты 1-4 и 7 - обычные лампочки, вкл-выкл, и только две мигалки  - Strobe и Beacon. Это все программируется на раз.

Чуть сложнее только синхронизация (точнее РАС-синхронизация Strobe и Beacon на половину периода). Сложнее с учетом того, что Strobe может быть выключен...

 

b707
Offline
Зарегистрирован: 26.05.2017

yauhenibabuk, - честно говоря я не очень понимаю, как у вас работает кнопка в коде. Подозреваю, что там не слишком правильно написано, так что лучше обьясните просто словами, как оно должно работать

sadman41
Offline
Зарегистрирован: 19.10.2016

Конечно они не поделятся - модели же делают на выставки, стенды за денежки. Зачем им конкуренту подарок делать ))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

yauhenibabuk, во-первых, найдите и тщательно изучите, как работают два варианта кода, которые называются "blink" и "blink without delay". На самом деле тщательно изучите. Если для этого потребуется несколько десятков раз прочитать каждый - не страшно, оно того стоит. Проект следует делать на основе второго, но для этого надо хорошо понимать, как он работает.

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Я бы еще посоветовал разрисовать на шкале времени циклические сигналы. Очень способствует пониманию.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

вот тут библиотека DetSimen как раз и пригодилась бы

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

b707 пишет:

yauhenibabuk, задачка-то вроде несложная. Пункты 1-4 и 7 - обычные лампочки, вкл-выкл, и только две мигалки  - Strobe и Beacon. Это все программируется на раз.

Чуть сложнее только синхронизация (точнее РАС-синхронизация Strobe и Beacon на половину периода). Сложнее с учетом того, что Strobe может быть выключен...

Не сложная для человека, который понимает как работает код и arduino, мне пока это кажется космосом.

b707 пишет:

yauhenibabuk, - честно говоря я не очень понимаю, как у вас работает кнопка в коде. Подозреваю, что там не слишком правильно написано, так что лучше обьясните просто словами, как оно должно работать


Данный код на кнопку был найден на одном из форумов. Все работает исправно, проверено на реальной модели. Получается каждое нажатие на кнопку меняет переменную regim, максимальное значение 9, потом все по новой идет, как и с режимами свечения диодов. Единственное, что она плохо работает при использовании delay, но это логично.

andriano пишет:

yauhenibabuk, во-первых, найдите и тщательно изучите, как работают два варианта кода, которые называются "blink" и "blink without delay". На самом деле тщательно изучите. Если для этого потребуется несколько десятков раз прочитать каждый - не страшно, оно того стоит. Проект следует делать на основе второго, но для этого надо хорошо понимать, как он работает.

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

про blink without delay - принял к сведению, попробую въехать в то, что там написано.

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

ua6em пишет:

вот тут библиотека DetSimen как раз и пригодилась бы


хм, вроде что понял и по-моему смогу попробовать это сделать сам.
Благодарю!

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

Я извиняюсь, сразу вставил сюда не самую актуальную часть кода. Вот как я пытался сделать мигание
часть кода убрал

 

int regim=0;            // объявляем переменную для переключения режимов
int flag=0;             // хз что это
int cabin=10;           // освещение салона 10 пин
int logo=9;             // освещение логотипа 9 пин
int taxi=8;             // рулежная фара 8 пин
int landing=7;          // посадочные фары 7 пин
int anticollision=6;    // мигающие белые (по две вспышки) 6 пин
int beacon=5;           // мигающие красные 5 пин
int nav=4;              // красный_зеленый_белый_ 4 пин
int button=2;           // сенсорная кнопка для переключения режимов
 
int dly = 50 //интервал мигания /10ms

 void setup()   
 {   
  pinMode(cabin,OUTPUT);   
  pinMode(logo,OUTPUT);   
  pinMode(taxi,OUTPUT);
  pinMode(landing,OUTPUT);   
  pinMode(anticollision,OUTPUT);   
  pinMode(beacon,OUTPUT);
  pinMode(nav,OUTPUT);    
 } 
 
 void loop() 
 { 
     if(digitalRead(button)==HIGH&&flag==0)   // не уверен что написан код правильно для переключения, но работает    
     { 
       regim++;   
       flag=1; 
         
        if(regim>9) 
        { 
          regim=1;   
        } 
     } 
      if(digitalRead(button)==LOW&&flag==1)
     { 
          
        flag=0;
     } 
       

  
      
    if(regim==3)    // третий режим_руление
    { 
      digitalWrite(cabin, HIGH);
      digitalWrite(logo, HIGH);
      digitalWrite(taxi, HIGH); 
      digitalWrite(landing, LOW);
      digitalWrite(anticollision, LOW);
digitalWrite(nav, HIGH);
int timer =dly/2;//начинаем с зажженного состояния
while(digitalRead(button)==LOW) //пока кнопка не нажата входим в цикл
{ 
if (timer==dly/2)//если натикала половина периода
{
digitalWrite(beacon, HIGH); // зажигаем
}
if (timer>=dly)//если натикал весь период
{
digitalWrite(beacon, LOW); // гасим
timer =0;//обнуляем счётчик 
}
timer++; //тик
}   
            
    } 
      

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

yauhenibabuk, чтобы Вам помочь, нужно понимать, чего Вы вообще хотите от программы.

В сообщении №2 Вы перечислили огни, которые есть на самолете. При таком подходе было бы логично для каждой из 7 групп написать функции включения и выключения. Проще это будет через классы, т.е. создаете родительский класс и от него 3 наследника: с постоянным включением, с одним миганием и с двойным миганием. Соответственно получается 5 экземпляров первого наследника и по одному - других.

А в loop() по совокупности условий производите включение или выключение соответствующих огней.

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

И как вообще это все понимать? Вы текстом пишете одно, а кодом - совершенно другое.

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

andriano пишет:

yauhenibabuk, чтобы Вам помочь, нужно понимать, чего Вы вообще хотите от программы.

В сообщении №2 Вы перечислили огни, которые есть на самолете. При таком подходе было бы логично для каждой из 7 групп написать функции включения и выключения. Проще это будет через классы, т.е. создаете родительский класс и от него 3 наследника: с постоянным включением, с одним миганием и с двойным миганием. Соответственно получается 5 экземпляров первого наследника и по одному - других.

А в loop() по совокупности условий производите включение или выключение соответствующих огней.

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

И как вообще это все понимать? Вы текстом пишете одно, а кодом - совершенно другое.

а так всегда, идея у автора в голове сидит, он ее понимает отлично, а вот объяснить другим не всегда получается.
Пытался вроде просто написать, попробую еще раз:

Есть самолет (моделька), с кучей диодов в ней. Есть arduino nano, сенсорная кнопка, аккумулятор (со своей отдельной кнопкой, для включения arduino).

Хочу сделать так, чтоб нажатием сенсорной кнопки я мог переключать 9-10 режимов.
В каждом из режимов светодиоды должны гореть по разному и тем самым имитировать один из режимов полета. 

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

но вроде я смог сделать мигание с нужными мне интервалами через millis. Попробую в скором времени запихнуть это все в общий код и проверить.

 

 if (Blink_time > 4000) Blink_start_time = millis();
      Blink_time = millis() - Blink_start_time;
      if ((Blink_time >0) & (Blink_time <250))      digitalWrite(A0,Beacon_Lights); else digitalWrite(A0,false) ;        // светим беконом первые 250 мс из 4000 по циклу                               
      if ((Blink_time >2000) & (Blink_time <2070))  digitalWrite(11,Strobe_Lights); else digitalWrite(11,false) ;        // первая вспышка стробы 
      if ((Blink_time >2350) & (Blink_time <2400))  digitalWrite(11,Strobe_Lights); else digitalWrite(11,false) ;        // вторая вспышка стробы 

Вот чем заставил мигать, осталось научиться включать в нужных режимах это 

5N62V
Offline
Зарегистрирован: 25.02.2016

yauhenibabuk пишет:

Есть самолет (моделька), с кучей диодов в ней. Есть arduino nano, сенсорная кнопка, аккумулятор (со своей отдельной кнопкой, для включения arduino).

Хочу сделать так, чтоб нажатием сенсорной кнопки я мог переключать 9-10 режимов.

Странное решение переключать режимы сенсорной кнопкой .... Почему не с пульта? Или у Вас не летающие модельки?

nik182
Offline
Зарегистрирован: 04.05.2015

Сделайте 7 флагов и соотвественно 7 if к флагам ну или сколько там по количеству Ваших независимых систем ламп. При установке флага система включается и работает и всё равно - просто горит или моргает. Введите массив режимов и пропишите в нем флаги каждого режима - каким системам ламп работать, а каким нет. Этих режимов может быть много. При нажатии кнопки переинициируйте флаги в соответствии с прописанными для следующего режима. И так по кругу. Взяв титановый велосипед для кнопки можно одной кнопкой кроме перключения переходить сразу на наиболее востребованные режимы длинным или двойным нажатием.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

yauhenibabuk, написал для Вас класс бортовых огней с проверкой его функционирования.

Класс содержит инициализацию (указываем нужный пин) и две функции для управления: одна включает/выключает огни, а вторая осуществляет основную работу - ее нужно вызывать как можно чаще, минимум каждый раз при проходе цикла loop().

class aeroLEDGroup  { // класс для группы бортовых огней - обеспечивает вкл/выкл, является родителем для классов с миганием
protected:
  uint8_t pin; // бьез комментариев
  uint8_t state; // состояние: 0 - выключены, >0 - включены, причем: нечетные - горят, четные - потушены (авансом - для мигания)
public:
  aeroLEDGroup(uint8_t _pin) : pin(_pin) { pinMode(pin, OUTPUT); }; // инициализация: указываем управляющий пин
  void virtual setLEDs(bool light) { state = !!light; }; // задание режима: огни включены или выключены
  void virtual run() { digitalWrite(pin, state); }; // эту функцию нужно вызывать регулярно в цикле loop(), именно она обеспечивает работу огней
};

Далее - проверочный код.

Для проверки нам достаточно 4 групп огней, понадобится больше - добавите.

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

const uint8_t numLEDGroups = 4; // очевидно из имени - количество групп огней
aeroLEDGroup AG0(2), AG1(3), AG2(4), AG3(5);
aeroLEDGroup * arrayAG[numLEDGroups] = {&AG0, &AG1, &AG2, &AG3};

В setup() собственно ничего не нужно, вся инициализация происходит в описанных выше объектах, а работа - в loop().

void setup() {
  Serial.begin(115200); // исключительно для отладки, в финальном коде - убрать
}

ну а дальше - сам проверочный код. 

Перебираются все возможные комбинации включения огней. Для 4 групп огней 2^4 = 16 комбинаций.

Проверочный код можно разбить на 3 части:

в первой части с интервалом в полсекунды показывается очередная комбинация огней. Сама комбинация записывается в переменную flags, каждый бит которой соответствует факту включения (1) или выключения (0) соответствующей группы огней.

uint8_t flags; // каждый бит этой переменной отвечает за включение одной группы огней - всего до 8 групп (пока - 4)

void loop() {
  // первая часть - перебор с заданной частотой по всем возможным комбинациям включения огней, при 4 огнях комбинаций 2^4=16
  uint32_t currentMillis = millis();
  static uint32_t previousMillis = 0;
  const uint32_t interval = 500;     // время индикации одной комбинации огней, мс
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    flags = (flags + 1) & 0x0f;
    Serial.println(flags);
  }

Вторая часть - переводит содержимое flags непосредственно в команды управления огнями.

  // вторая часть - "актуализация" флагов командами aeroLEDGroup
  for(byte i = 0; i < numLEDGroups; i++) arrayAG[i]->setLEDs(flags & (1 << i));

И третья часть - вызов функций работы с огнями - вызывать как можно чаще.

  // третья часть - обязательная: функционирование полетных огней
  for(byte i = 0; i < numLEDGroups; i++) arrayAG[i]->run();
}

Первую часть Вам нужно будет заменить на собственную логику включения и выключения разных групп огней. Вы можете использовать для этого либо переменную flags, либо непосредственную работу с классами. В последнем случае как переменную flsgs, так и 2-ю часть можно удалить.

 

Пока - вариант только со стационарными огнями. Когда посмотрите его работу, напишу еще дочерний класс - для двойного мигания. Тогда дополните код и посмотрите, что изменилось.

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

5N62V пишет:

Странное решение переключать режимы сенсорной кнопкой .... Почему не с пульта? Или у Вас не летающие модельки?

Модельки стационарные, размером 20-50 см в длину. И они только могут мечтать о полете. 

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

nik182 пишет:
Сделайте 7 флагов и соотвественно 7 if к флагам ну или сколько там по количеству Ваших независимых систем ламп. При установке флага система включается и работает и всё равно - просто горит или моргает. Введите массив режимов и пропишите в нем флаги каждого режима - каким системам ламп работать, а каким нет. Этих режимов может быть много. При нажатии кнопки переинициируйте флаги в соответствии с прописанными для следующего режима. И так по кругу. Взяв титановый велосипед для кнопки можно одной кнопкой кроме перключения переходить сразу на наиболее востребованные режимы длинным или двойным нажатием.

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

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

andriano пишет:

yauhenibabuk, написал для Вас класс бортовых огней с проверкой его функционирования.

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

Вот, что у меня в данный момент получилось. Код работает, кнопка переключает.

На данный момент из улучшений планирую:
1. разобраться со спящим режимом arduino.
2. ШИМ регулировку яркости на одном и режимов.
3. В первом режиме хочу один раз включить и выключить все диоды по очереди. Как сделать один цикл вкл-выкл? 

 Также есть вопрос, три диода (красный, зеленый, белый) последовательно включены, белый не загорается. Не хватает питания? 

 

int regim = 0;          		// объявляем переменную для переключения режимов
int flag = 0;           		// хз что это
const int Beacon_Lights = A0;         	// мигающие красные A0
int button = 2;         		// сенсорная кнопка для переключения режимов
const int Strobe_Lights = 3;   		// мигающие белые (по две вспышки) 3
int Cabin_Lights = 4;        			// освещение салона 4
int Landing_Lights = 5;      			// посадочные фары 5
int Taxi_Lights = 6;          			// рулежная фара 6
int Nav_Lights = 7;            		// красный_зеленый_белый (не хватает белому напряжения) 7
int Logo_Lights = 8;         			// освещение логотипа 8
long int Blink_start_time;
long int Blink_time;
unsigned long previousMillis = 0;        // will store last time LED was updated
// constants won't change:
const long interval = 1000;   

long int fade_goTime;			// что за хрень появилась?


void setup()
{

  pinMode(A0, OUTPUT);			// Beacon_Lights
  pinMode(2, INPUT);			// button
  pinMode(3, OUTPUT);			// Strobe_Lights
  pinMode(4, OUTPUT);			// Cabin_Lights
  pinMode(5, OUTPUT);			// Landing_Lights
  pinMode(6, OUTPUT);			// Taxi_Lights
  pinMode(7, OUTPUT);			// Nav_Lights
  pinMode(8, OUTPUT);			// Logo_Lights
  fade_goTime = millis();		// хз что это, вроде не нужно
  fade_goTime = millis();		// хз что это, вроде не нужно и почему два раза?               
  Blink_start_time = millis();
  Blink_time = 0;
}

void loop()
{
  if (digitalRead(button) == HIGH && flag == 0) // не уверен что написан код правильно для переключения, но работает
  {
    regim++;
    flag = 1;

    if (regim > 10)
    {
      regim = 1;
    }
  }
  if (digitalRead(button) == LOW && flag == 1)
  {
    flag = 0;
  }



  if (regim == 1) // тестовый (первый) режим, все огни включить поочередно с интервалом и выключить. Один круг вкл - выкл.  
  {
    digitalWrite(Beacon_Lights, HIGH);
    digitalWrite(Strobe_Lights, HIGH);
    digitalWrite(Cabin_Lights, HIGH);
    digitalWrite(Landing_Lights, HIGH);
    digitalWrite(Taxi_Lights, HIGH);
    digitalWrite(Nav_Lights, HIGH);
    digitalWrite(Logo_Lights, HIGH);
   }

ПРОПУСК ОДНОТИПНОГО КОДА

  if (regim == 4) // четвертый режим_взлет
  {
  if (Blink_time > 1500) Blink_start_time = millis();
      Blink_time = millis() - Blink_start_time;
      if ((Blink_time >600) & (Blink_time <700))      digitalWrite(A0,Beacon_Lights); else digitalWrite(A0,false) ;        // светим Beacon_Lights в период 600-700 мс из 1500 по циклу                            
      if ((Blink_time >1300) & (Blink_time <1340))  digitalWrite(3,Strobe_Lights); else digitalWrite(3,false) ;        // первая вспышка стробы 
      if ((Blink_time >1400) & (Blink_time <1440))  digitalWrite(3,Strobe_Lights); else digitalWrite(3,false) ;        // вторая вспышка стробы
    digitalWrite(Cabin_Lights, LOW);		
    digitalWrite(Landing_Lights, HIGH);		// включены взлетно посадочные огни
    digitalWrite(Taxi_Lights, HIGH);		// работает рулежная фара
    digitalWrite(Nav_Lights, HIGH);		// включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
    digitalWrite(Logo_Lights, HIGH);		// работает освещение логотипа на хвосте
  }

ПРОПУСК ОДНОТИПНОГО КОДА


  if (regim == 10) //девятый режим_Off_или как-то реализовать режим сна


}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

yauhenibabuk пишет:

andriano пишет:

yauhenibabuk, написал для Вас класс бортовых огней с проверкой его функционирования.

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

Вы бы собрали код из фрагментов (по сути он приведен в сообщении полностью). Запустили его и посмотрели, как работает. Просто создайте отдельный скетч, не пытаясь интегрировать в существующий у Вас.

Если собранный код поместите на форум, я скажу что куда добавить, чтобы били и режимы с миганием. Поверьте, с объектами работать намного удобнее.

Цитата:

Вот, что у меня в данный момент получилось. Код работает, кнопка переключает.

На данный момент из улучшений планирую:
1. разобраться со спящим режимом arduino.

А зачем это Вам? Тема достаточно сложная и для Вашего проекта совершенно неактуальная. Я бы ее даже не переставил на последнее место, а вообще выкинул из планов.

Цитата:

2. ШИМ регулировку яркости на одном и режимов.

В принципе, ШИМ - это просто. Если нужно просто включать на нужную яркость. Ну а если управление яркостью - то в первую очередь нужно думать о принципах этого управления.

Цитата:

3. В первом режиме хочу один раз включить и выключить все диоды по очереди. Как сделать один цикл вкл-выкл? 
В Вашем исходнике я не ковырялся, а на основе моего это делается легко и непринужденно. Кстати, он и заметно короче Вашего. Менее 40 строк. В варианте с миганием - 62.

Цитата:

 Также есть вопрос, три диода (красный, зеленый, белый) последовательно включены, белый не загорается. Не хватает питания? 

Включены последовательно? Тогда это очень странно. При последовательном соединении через все детали проходит одинаковый ток. Если Вы верно описали проблему, то неисправен (пробит) белый светодиод.
 

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

andriano пишет:

Вы бы собрали код из фрагментов (по сути он приведен в сообщении полностью). Запустили его и посмотрели, как работает. Просто создайте отдельный скетч, не пытаясь интегрировать в существующий у Вас.

Если собранный код поместите на форум, я скажу что куда добавить, чтобы били и режимы с миганием. Поверьте, с объектами работать намного удобнее.


Понимаю, что удобнее. К этому я наверное приду, но думаю не сразу, нет необходимых знаний еще. 
Я попробую разобраться, но ближе к вечеру или завтра. На мобилке писать и загружать в arduino такое себе удовольствие. 

Цитата:

А зачем это Вам? Тема достаточно сложная и для Вашего проекта совершенно неактуальная. Я бы ее даже не переставил на последнее место, а вообще выкинул из планов.

Я Вас услышал, но и да, я с Вами согласен. Зачем? Наверное, чтоб не думать об герконе или выключателе. 

Про ШИМ, я хочу просто в двух режимах уменьшить яркость освещения салона. К примеру  в режиме стоянки - свет 100%, при рулении 50, а при взлете и посадке 10%. Да, я уже разобрался сейчас как это сделать. Осталось добраться до личного компа.
 

Цитата:
В Вашем исходнике я не ковырялся, а на основе моего это делается легко и непринужденно. Кстати, он и заметно короче Вашего. Менее 40 строк. В варианте с миганием - 62.

хм, у меня уже 200. Правда много пробелов для своего удобства и многое можно сократить.

Цитата:

Включены последовательно? Тогда это очень странно. При последовательном соединении через все детали проходит одинаковый ток. Если Вы верно описали проблему, то неисправен (пробит) белый светодиод.


Да, последовательно. Пробовал менять и чередовать диоды (3мм), все рабочие., но вот вместе три не горят. Три белых - без проблем.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

yauhenibabuk пишет:

Про ШИМ, я хочу просто в двух режимах уменьшить яркость освещения салона. К примеру  в режиме стоянки - свет 100%, при рулении 50, а при взлете и посадке 10%. Да, я уже разобрался сейчас как это сделать. Осталось добраться до личного компа.

С классами просто - делается еще один наследник, в который добавляется новый метод - регулировка ШИМ.

Цитата:

Да, последовательно. Пробовал менять и чередовать диоды (3мм), все рабочие., но вот вместе три не горят. Три белых - без проблем.

Так не бывает.

При параллельном соединении без резисторов на каждом - да, белый не должен гореть.

Измерьте ток, напряжение на каждом из диодов. Ну и схему желательно привести.

nik182
Offline
Зарегистрирован: 04.05.2015

Поредактировал Вашу программу под мою идею. Глубоко не копал. Кнопка по минимуму. Ваша проверка всех лампочек - вынес в сетап - один раз при загрузке будут переливаться. Флаг кабины совмещён с яркостью освещения, поэтому в массиве данных режима есть значения 255 - полное освещение, 200 - около 80%, 25 - 10%. Моргание в подпрограммах тоже по минимуму, длительности горит-негорит в массивах. Режимы можно добавлять и убирать методом изменения размерности массива данных или  ещё как. Программа сырая. Собрана на коленке и не проверена. Только иллюстрация идеи. 

int regim = 0;          // объявляем переменную для переключения режимов

int cabin = 10;         // освещение салона 10 пин
int logo = 9;           // освещение логотипа 9 пин
int taxi = 8;           // рулежная фара 8 пин
int landing = 7;        // посадочные фары 7 пин
int strobe = 6;      // мигающие белые (по две вспышки) 6 пин
int beacon = 5;         // мигающие красные 5 пин
int nav = 4;            // красный_зеленый_белый_ 4 пин

int button = 2;         // сенсорная кнопка для переключения режимов

int fLcabin = 0;         // освещение салона 10 пин
int fLlogo = 0;           // освещение логотипа 9 пин
int fLtaxi = 0;           // рулежная фара 8 пин
int fLlanding = 0;        // посадочные фары 7 пин
int fLstrobe = 0;      // мигающие белые (по две вспышки) 6 пин
int fLbeacon = 0;         // мигающие красные 5 пин
int fLnav = 4;            // красный_зеленый_белый_ 4 пин

byte fLdata [10][7] = {{255, 1, 1, 1, 1, 1, 1},
  {255, 0, 0, 0, 0, 0, 0},
  {255, 1, 0, 0, 0, 0, 0},
  {255, 0, 1, 0, 0, 0, 0},
  {255, 0, 0, 1, 0, 0, 0},
  {255, 0, 0, 0, 1, 0, 0},
  {255, 0, 0, 0, 0, 1, 0},
  {255, 0, 0, 0, 0, 0, 1},
  {200, 0, 0, 0, 0, 0, 1},
  {25, 1, 0, 0, 0, 0, 1}
};

int strobetime[4] = {200, 200, 200, 1500};
int nstrobe = 0;
unsigned long strobeoldtime;

int beacontime[4] = {200, 200, 200, 1400};
int nbeacon = 0;
unsigned long beaconoldtime;


void SetRegim(int n)
{
  fLcabin = fLdata[n][0];          // освещение салона
  fLlogo = fLdata[n][1];           // освещение логотипа
  fLtaxi = fLdata[n][2];           // рулежная фара
  fLlanding = fLdata[n][3];        // посадочные фары
  fLstrobe = fLdata[n][4];         // мигающие белые (по две вспышки)
  fLbeacon = fLdata[n][5];         // мигающие красные
  fLnav = fLdata[n][6];            // красный_зеленый_белый_
};

void Substrobe(void)
{
  if (millis() - strobeoldtime > strobetime[nstrobe])
  {
    strobeoldtime = millis();
    nstrobe++;
    digitalWrite(strobe, (nstrobe % 2));
    if (nstrobe > 3) nstrobe = 0;
  }
};

void Subbeacon(void)
{
  if (millis() - beaconoldtime > strobetime[nbeacon])
  {
    beaconoldtime = millis();
    nbeacon++;
    digitalWrite(strobe, (nbeacon % 2));
    if (nbeacon > 3) nbeacon = 0;
  }
};


void setup()
{
  pinMode(cabin, OUTPUT);
  pinMode(logo, OUTPUT);
  pinMode(taxi, OUTPUT);
  pinMode(landing, OUTPUT);
  pinMode(strobe, OUTPUT);
  pinMode(beacon, OUTPUT);
  pinMode(nav, OUTPUT);
  pinMode(button, INPUT);

  digitalWrite(cabin, HIGH);
  delay (500);
  digitalWrite(logo, HIGH);
  delay (500);
  digitalWrite(taxi, HIGH);
  delay (500);
  digitalWrite(landing, HIGH);
  delay (500);
  digitalWrite(strobe, HIGH);
  delay (500);
  digitalWrite(beacon, HIGH);
  delay (500);
  digitalWrite(nav, HIGH);
  delay (500);
  digitalWrite(cabin, LOW);
  delay (500);
  digitalWrite(logo, LOW);
  delay (500);
  digitalWrite(taxi, LOW);
  delay (500);
  digitalWrite(landing, LOW);
  delay (500);
  digitalWrite(strobe, LOW);
  delay (500);
  digitalWrite(beacon, LOW);
  delay (500);
  digitalWrite(nav, LOW);
  regim = 1;  SetRegim(regim);
}

void loop()
{
  if (fLcabin) analogWrite(cabin, fLcabin); else analogWrite(cabin, 0);
  if (fLlogo) digitalWrite(logo, HIGH); else digitalWrite(logo, LOW);
  if (fLtaxi) digitalWrite(taxi, HIGH); else digitalWrite(taxi, LOW);
  if (fLlanding) digitalWrite(landing, HIGH); else digitalWrite(landing, LOW);
  if (fLstrobe) Substrobe; else digitalWrite(strobe, LOW);
  if (fLbeacon) Subbeacon; else digitalWrite(beacon, LOW);
  if (fLnav) digitalWrite(nav, HIGH); else digitalWrite(nav, LOW);

  if (digitalRead(button) == LOW )
  {
    regim++;
    if (regim > 9)  regim = 1;
    SetRegim(regim);
  };
}

 

leons
Offline
Зарегистрирован: 14.10.2019
maks321
Offline
Зарегистрирован: 28.10.2020

maks321
Offline
Зарегистрирован: 28.10.2020

может так стоить имитировать

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

maks321 пишет:

может так стоить имитировать

окей, интересно сколько у вас уйдет времени чтоб подобрать такой интервал мигания?
да и купить arduino nano по цене тоже самое, что купить необходимые компоненты в оффлайн магазине

Beacon_Lights в период 600-650 мс из 1450 по циклу
первая вспышка стробы в период 1300-1340 мс из 1450 по циклу
вторая вспышка стробы в период 1400-1440 мс из 1450 по циклу

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

Вот мой итоговый вариант. Примитивно, просто, но самое главное работает. Надеюсь буду дальше развиваться в этом направлении и конечный результат лучше станет.
Все, что выше предлагали, пробовал разбираться, но пока реально очень трудно дается понимание. Надо наверное брать книгу и читать, а не обрывками искать что значит тот или иной участок в коде. 
Для наглядности видео

int regim = 0;          	            	// объявляем переменную для переключения режимов
int flag = 0;           	            	// хз что это
int button = 2;         	            	// сенсорная кнопка для переключения режимов
int Cabin_Lights = 11;        		    	// освещение салона 4
int Landing_Lights = 5;      			      // посадочные фары 5
int Taxi_Lights = 6;          		    	// рулежная фара 6
int Nav_Lights = 7;            		      // красный_зеленый_белый (не хватает белому напряжения) 7
int Logo_Lights = 8;         			      // освещение логотипа 8
const int Beacon_Lights = A0;           // мигающие красные A0
const int Strobe_Lights = 3;            // мигающие белые (по две вспышки) 3
long int Blink_start_time;
long int Blink_time = 0;

void setup()
{
  pinMode(A0, OUTPUT);			            // Beacon_Lights
  pinMode(2, INPUT);			              // button
  pinMode(3, OUTPUT);			              // Strobe_Lights
  pinMode(11, OUTPUT);		            	// Cabin_Lights
  pinMode(5, OUTPUT);			              // Landing_Lights
  pinMode(6, OUTPUT);			              // Taxi_Lights
  pinMode(7, OUTPUT);		              	// Nav_Lights
  pinMode(8, OUTPUT);		              	// Logo_Lights
  Blink_start_time = millis();
}

void loop()
{
  if (digitalRead(button) == HIGH && flag == 0) // не уверен что написан код правильно для переключения, но работает
  {
    regim++;
    flag = 1;

    if (regim > 10)
    {
      regim = 1;
    }
  }
  if (digitalRead(button) == LOW && flag == 1)
  {
    flag = 0;
  }

  if (regim == 1)                         // Первый режим (тестовый), все огни включить поочередно с интервалом и выключить.
  {
    if (Blink_time > 800) Blink_start_time = millis();
    Blink_time = millis() - Blink_start_time;
    if ((Blink_time > 50) & (Blink_time < 150)) digitalWrite(A0, Beacon_Lights); else digitalWrite(A0, false) ;
    if ((Blink_time > 100) & (Blink_time < 200)) digitalWrite(3, Strobe_Lights); else digitalWrite(3, false) ;
    if ((Blink_time > 150) & (Blink_time < 250)) digitalWrite(11, Cabin_Lights); else digitalWrite(11, false) ;
    if ((Blink_time > 200) & (Blink_time < 300)) digitalWrite(5, Landing_Lights); else digitalWrite(5, false) ;
    if ((Blink_time > 250) & (Blink_time < 350)) digitalWrite(6, Taxi_Lights); else digitalWrite(6, false) ;
    if ((Blink_time > 300) & (Blink_time < 400)) digitalWrite(7, Nav_Lights); else digitalWrite(7, false) ;
    if ((Blink_time > 350) & (Blink_time < 450)) digitalWrite(8, Logo_Lights); else digitalWrite(8, false) ;

    if ((Blink_time > 700) & (Blink_time < 800)) digitalWrite(A0, Beacon_Lights); else digitalWrite(A0, false) ;
    if ((Blink_time > 650) & (Blink_time < 750)) digitalWrite(3, Strobe_Lights); else digitalWrite(3, false) ;
    if ((Blink_time > 600) & (Blink_time < 700)) digitalWrite(11, Cabin_Lights); else digitalWrite(11, false) ;
    if ((Blink_time > 550) & (Blink_time < 650)) digitalWrite(5, Landing_Lights); else digitalWrite(5, false) ;
    if ((Blink_time > 500) & (Blink_time < 600)) digitalWrite(6, Taxi_Lights); else digitalWrite(6, false) ;
    if ((Blink_time > 450) & (Blink_time < 550)) digitalWrite(7, Nav_Lights); else digitalWrite(7, false) ;
    if ((Blink_time > 400) & (Blink_time < 500)) digitalWrite(8, Logo_Lights); else digitalWrite(8, false) ;
  }

  if (regim == 2)                         // Второй режим_самолет на стоянке
  {
    digitalWrite(Beacon_Lights, LOW);
    digitalWrite(Strobe_Lights, LOW);
    analogWrite (Cabin_Lights, 255);	  	// работает освещение салона_макс
    digitalWrite(Landing_Lights, LOW);
    digitalWrite(Taxi_Lights, LOW);
    digitalWrite(Nav_Lights, HIGH);		    // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
    digitalWrite(Logo_Lights, HIGH);	  	// работает освещение логотипа на хвосте
  }

  if (regim == 3)                         // Третий режим_руление
  {
    if (Blink_time > 1450) Blink_start_time = millis();
    Blink_time = millis() - Blink_start_time;
    if ((Blink_time > 600) & (Blink_time < 650)) digitalWrite(A0, Beacon_Lights); else digitalWrite(A0, false) ;    // светим Beacon_Lights в период 600-700 мс из 1500 по циклу
    digitalWrite(Strobe_Lights, LOW);
    analogWrite(Cabin_Lights, 127); 	    // работает освещение салона.  на 50% тусклее
    digitalWrite(Landing_Lights, LOW);
    analogWrite(Taxi_Lights, 255);	  	  // работает рулежная фара, 100%
    digitalWrite(Nav_Lights, HIGH);		    // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
    digitalWrite(Logo_Lights, HIGH);	  	// работает освещение логотипа на хвосте
  }

  if (regim == 4)                         // Четвертый режим_взлет
  {
    if (Blink_time > 1450) Blink_start_time = millis();
    Blink_time = millis() - Blink_start_time;
    if ((Blink_time > 600) & (Blink_time < 650))      digitalWrite(A0, Beacon_Lights); else digitalWrite(A0, false) ;    // светим Beacon_Lights в период 600-700 мс из 1500 по циклу
    if ((Blink_time > 1300) & (Blink_time < 1340))  digitalWrite(3, Strobe_Lights); else digitalWrite(3, false) ;    // первая вспышка стробы
    if ((Blink_time > 1400) & (Blink_time < 1440))  digitalWrite(3, Strobe_Lights); else digitalWrite(3, false) ;    // вторая вспышка стробы
    analogWrite(Cabin_Lights, 10);        //работает освещение салона. 5%
    digitalWrite(Landing_Lights, HIGH);		// включены взлетно посадочные огни
    analogWrite(Taxi_Lights, 60);         // работает рулежная фара, 30%
    digitalWrite(Nav_Lights, HIGH);		    // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
    digitalWrite(Logo_Lights, HIGH);	  	// работает освещение логотипа на хвосте
  }

  if (regim == 5)                         // Пятый режим_полет на эшелоне
  {
    if (Blink_time > 1450) Blink_start_time = millis();
    Blink_time = millis() - Blink_start_time;
    if ((Blink_time > 600) & (Blink_time < 650))      digitalWrite(A0, Beacon_Lights); else digitalWrite(A0, false) ;   // светим Beacon_Lights в период 600-700 мс из 1500 по циклу
    if ((Blink_time > 1300) & (Blink_time < 1340))  digitalWrite(3, Strobe_Lights); else digitalWrite(3, false) ;    // первая вспышка стробы
    if ((Blink_time > 1400) & (Blink_time < 1440))  digitalWrite(3, Strobe_Lights); else digitalWrite(3, false) ;    // вторая вспышка стробы
    digitalWrite(Cabin_Lights, HIGH);		  // работает освещение салона
    digitalWrite(Landing_Lights, LOW);
    digitalWrite(Taxi_Lights, LOW);
    digitalWrite(Nav_Lights, HIGH);		    // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
    digitalWrite(Logo_Lights, HIGH);		  // работает освещение логотипа на хвосте
  }

  if (regim == 6)                         // Шестой (четвертый) режим_посадка
  {
    if (Blink_time > 1450) Blink_start_time = millis();
    Blink_time = millis() - Blink_start_time;
    if ((Blink_time > 600) & (Blink_time < 650))      digitalWrite(A0, Beacon_Lights); else digitalWrite(A0, false) ;    // светим Beacon_Lights в период 600-700 мс из 1500 по циклу
    if ((Blink_time > 1300) & (Blink_time < 1340))  digitalWrite(3, Strobe_Lights); else digitalWrite(3, false) ;    // первая вспышка стробы
    if ((Blink_time > 1400) & (Blink_time < 1440))  digitalWrite(3, Strobe_Lights); else digitalWrite(3, false) ;    // вторая вспышка стробы
    analogWrite(Cabin_Lights, 10);         // работает освещение салона. 5%
    digitalWrite(Landing_Lights, HIGH);    // включены взлетно посадочные огни
    analogWrite(Taxi_Lights, 60);          // работает рулежная фара, 30%
    digitalWrite(Nav_Lights, HIGH);        // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
    digitalWrite(Logo_Lights, HIGH);       // работает освещение логотипа на хвосте
  }

  if (regim == 7)                          // Седьмой (третий)режим_руление
  {
    if (Blink_time > 1450) Blink_start_time = millis();
    Blink_time = millis() - Blink_start_time;
    if ((Blink_time > 600) & (Blink_time < 650)) digitalWrite(A0, Beacon_Lights); else digitalWrite(A0, false) ;    // светим Beacon_Lights в период 600-700 мс из 1500 по циклу
    digitalWrite(Strobe_Lights, LOW);
    analogWrite(Cabin_Lights, 127);       // работает освещение салона.  на 50% тусклее
    digitalWrite(Landing_Lights, LOW);
    analogWrite(Taxi_Lights, 255);        // работает рулежная фара, 100%
    digitalWrite(Nav_Lights, HIGH);       // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
    digitalWrite(Logo_Lights, HIGH);      // работает освещение логотипа на хвосте
  }

  if (regim == 8)                         //  Восьмой режим_самолет на стоянке
  {
    digitalWrite(Beacon_Lights, LOW);
    digitalWrite(Strobe_Lights, LOW);
    analogWrite (Cabin_Lights, 255);      // работает освещение салона_макс
    digitalWrite(Landing_Lights, LOW);
    digitalWrite(Taxi_Lights, LOW);
    digitalWrite(Nav_Lights, HIGH);       // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
    digitalWrite(Logo_Lights, HIGH);      // работает освещение логотипа на хвосте
  }

  if (regim == 9)                        // Девятый режим_новогодняя елка_все включено и мигает
  {
    if (Blink_time > 1450) Blink_start_time = millis();
    Blink_time = millis() - Blink_start_time;
    if ((Blink_time > 600) & (Blink_time < 650))      digitalWrite(A0, Beacon_Lights); else digitalWrite(A0, false) ;    // светим Beacon_Lights в период 600-700 мс из 1500 по циклу
    if ((Blink_time > 1300) & (Blink_time < 1340))  digitalWrite(3, Strobe_Lights); else digitalWrite(3, false) ;    // первая вспышка стробы
    if ((Blink_time > 1400) & (Blink_time < 1440))  digitalWrite(3, Strobe_Lights); else digitalWrite(3, false) ;    // вторая вспышка стробы
    digitalWrite(Cabin_Lights, HIGH);
    digitalWrite(Landing_Lights, HIGH);		// включены взлетно посадочные огни
    digitalWrite(Taxi_Lights, HIGH);		  // работает рулежная фара
    digitalWrite(Nav_Lights, HIGH);		    // включены красный и зеленый диоды на крыле, белый диод в задней части фюзеляжа
    digitalWrite(Logo_Lights, HIGH);	  	// работает освещение логотипа на хвосте
  }
  if (regim == 10) // Десятый режим_Off
  {
    digitalWrite(Beacon_Lights, LOW);
    digitalWrite(Strobe_Lights, LOW);
    digitalWrite(Cabin_Lights, LOW);
    digitalWrite(Landing_Lights, LOW);
    digitalWrite(Taxi_Lights, LOW);
    digitalWrite(Nav_Lights, LOW);
    digitalWrite(Logo_Lights, LOW);
  }

}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ужоснах. 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

DetSimen пишет:

ужоснах. 

Зря Вы, сэр - человек старался. Но не получилось...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Дак я и не сэр. :-)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

DetSimen пишет:

Дак я и не сэр. :-)

Дык и не получилось...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Не знаю, будет и полезно ТС, но,, раз обещал, выкладываю вариант с двойным миганием:

class aeroLEDGroup  { // класс для группы бортовых огней - обеспечивает вкл/выкл, является родителем для классов с миганием
protected:
  uint8_t pin; // бьез комментариев
  uint8_t state; // состояние: 0 - выключены, >0 - включены, причем: нечетные - горят, четные - потушены (авансом - для мигания)
public:
  aeroLEDGroup(uint8_t _pin) : pin(_pin) { pinMode(pin, OUTPUT); }; // инициализация: указываем управляющий пин
  void virtual setLEDs(bool light) { state = !!light; }; // задание режима: огни включены или выключены
  void virtual run() { digitalWrite(pin, state); }; // эту функцию нужно вызывать регулярно в цикле loop(), именно она обеспечивает работу огней
};

class aeroLEDGroup2 : public aeroLEDGroup { // дочерний класс с двойным миганием
  const uint32_t intervals[4] = {40, 40, 40, 240}; // задаются длительности каждой фазы в мс
  uint32_t previousMillis; // для отсчета времени
public:
  aeroLEDGroup2(uint8_t _pin) : aeroLEDGroup(_pin), previousMillis(0) {}; // аналогично родительскому классу
  void virtual setLEDs(bool light) { 
    if(!light) { state = 0; } // тушим огни
    else if(!state) {  // включаем огни, только если они были до того выключены, иначе - ничего не изменяем. Начинаем отсчет времени мигания.
      state = 1;
      previousMillis = millis();
    }
  };
  void virtual run() { // собственно, именно эта функция и обеспечивает мигание. Вызывать как можно чаще.
    uint32_t currentMillis = millis();
    if(state) {
      if (currentMillis - previousMillis >= intervals[state-1]) {
        previousMillis = currentMillis;
        state = (state & 3) + 1;
      };
    };
    digitalWrite(pin, state & 1); 
  };
};

const uint8_t numLEDGroups = 4; // очевидно из имени - количество групп огней
aeroLEDGroup AG0(2), AG1(3);
aeroLEDGroup2 AG2(4), AG3(5);
aeroLEDGroup * arrayAG[numLEDGroups] = {&AG0, &AG1, &AG2, &AG3};

void setup() {
  Serial.begin(115200); // исключительно для отладки, в финальном коде - убрать
}

uint8_t flags; // каждый бит этой переменной отвечает за включение одной группы огней - всего до 8 групп (пока - 4)

void loop() {
  // первая часть - перебор с заданной частотой по всем возможным комбинациям включения огней, при 4 огнях комбинаций 2^4=16
  uint32_t currentMillis = millis();
  static uint32_t previousMillis = 0;
  const uint32_t interval = 500;     // время индикации одной комбинации огней, мс
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    flags = (flags + 1) & 0x0f;
    Serial.println(flags);
  }
  
  // вторая часть - "актуализация" флагов командами aeroLEDGroup
  for(byte i = 0; i < numLEDGroups; i++) arrayAG[i]->setLEDs(flags & (1 << i));

  // третья часть - обязательная: функционирование полетных огней
  for(byte i = 0; i < numLEDGroups; i++) arrayAG[i]->run();
}

Чтобы добавить одиночное мигание, по образу и подобию aeroLEDGroup2 делается aeroLEDGroup1. Описываются соответствующие объекты и включаются в общий массив.

Кстати, вариант с использованием переменной flags очень плодотворен в данном случае: позволяет одной строкой ввести массив режимов - битовых масок, а второй  строкой - заменить строки с 65 по 177 из поста №27.

Правда, из общей картины выпадает т.н. режим 1, т.к. он на самом деле не режим - а последовательный перебор нескольких режимов. Но и он записывается намного короче - по сути в фрагменте строк 51-53 настоящего поста нужно заменить сложение на сдвиг влево.

 

PS. Кстати, ТС, в строках 46-62 у Вас какая-то лажа творится в digitalWrite.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

andriano пишет:

Не знаю, будет и полезно ТС,

Правда, из общей картины выпадает т.н. режим 1...

Не пойиуть... ИМХО. Проще надо, мягче.

yauhenibabuk
Offline
Зарегистрирован: 06.10.2020

andriano пишет:

Не знаю, будет и полезно ТС, но,, раз обещал, выкладываю вариант с двойным миганием:

Чтобы добавить одиночное мигание, по образу и подобию aeroLEDGroup2 делается aeroLEDGroup1. Описываются соответствующие объекты и включаются в общий массив.

Кстати, вариант с использованием переменной flags очень плодотворен в данном случае: позволяет одной строкой ввести массив режимов - битовых масок, а второй  строкой - заменить строки с 65 по 177 из поста №27.

Правда, из общей картины выпадает т.н. режим 1, т.к. он на самом деле не режим - а последовательный перебор нескольких режимов. Но и он записывается намного короче - по сути в фрагменте строк 51-53 настоящего поста нужно заменить сложение на сдвиг влево.

 

PS. Кстати, ТС, в строках 46-62 у Вас какая-то лажа творится в digitalWrite.

Ваши сообщения, как и многие другие здесь я уже сохранил, в будущем к ним вернусь 100%. Учитывая, что я первый раз столкнулся с arduino да и вообще с этой тематикой - для меня многие слова до сих пор не понятные.

А строки 46-62... работает ну и ладно.
 

mykaida пишет:

Зря Вы, сэр - человек старался. Но не получилось...


почему не получилось, мою задачу выполняет уже. Переключение есть, мигание есть. 

p.s. не могу реализовать через ШИМ такое действие:

диод горит на 50% к примеру и потом он на 100мс загорается на 100% и снова горит на 50%. 
Пробовал через ШИМ делать, но в режиме 50% горения он мерцает сильно.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

yauhenibabuk пишет:

диод горит на 50% к примеру и потом он на 100мс загорается на 100% и снова горит на 50%. 

Пробовал через ШИМ делать, но в режиме 50% горения он мерцает сильно.

А чем Вас корёжит analogWrite()? Ну да, не на всех пинах корректно работает, так Вам не на всех и надо. 

А если сильно мерцает - добавьте конденсатор.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Хотя туплю - более 100Гц человеческий глаз не видит. А тута - килогерцы.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

yauhenibabuk пишет:

Пробовал через ШИМ делать, но в режиме 50% горения он мерцает сильно.

Что-то Вы не то делаете.