Демонстрация светотехники масштабной модели на Arduino

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

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

PS. Если Вы думаете, что это шутка, то - нет.
На примере собственных проектов я убедился, что примерно лишь 10% кода входит в финальный скетч, а 90% - используется для вспомогательных целей.

PPS. Вот лично я вообще не наблюдаю на дорогах кортежей. А с мерцающими “головными фарами” - и подавно.

Товарищ, наверное, имеет ввиду маячок. Или “люстру”, как ее в простонародьи зовут.
Хотя, я припоминаю из американских кинофильмов такую хреновину в районе решётки радиатора в виде пары белых ламп, которые по-очереди вспыхивают быстро раза по три каждая.

Это явно не про стробоскоп - у стробоскопа есть определенная частота.
И ТС дважды подтвердил это в сообщении №58.

насчет американских фильмов не скажу, но на спец авто сия иллюминация есть )))

Плохо или хорошо вышло можно будет судить на готовой модели, а пока она, так сказать, в процессе стройки.
Что касается овладевать в масштабе 1:1, тут не поспоришь.

Благодарю за совет. Я обязательно им воспользуюсь.

Я предлагаю отказаться от термина “Стробоскоп” и использовать термин “Спец сигнал”. В своем проекте я хотел реализовать спец сигнал.

“стробоскопы” в фарах запрещены ПДД лет десять как уже. И на дорогах они не попадались примерно столько же

это короткие импульсы, короче 1/250 секунды

В таком случае на характеристики сигнала должен быть ГОСТ. Я думаю, разумнее всего именно Вам (как лицу заинтересованному) найти этот ГОСТ и выложить сюда выписанные из него характеристики сигнала.

Что касается ГОСТа, то он существует. ГОСТ Р 50574-2019. Кому интересно могут ознакомится, конкретно пункт №6. Только в нем нет никаких характеристик, которые описывали световые импульсы. Есть ссылка на документ ЕЭК ООН №65, но данный документ в открытом доступе мне найти не удалось.

Доброго времени суток форумчане.

Я немного продвинулся в своих навыках в освоении Arduino. Как и писал ранее, предыдущий скетч меня не очень устраивал по причине невозможности им управлять (так сказать поиграться). Я решил его переделать. Реализовать все функции при помощи ИК пульта. Хочу поделится своим результатом. Ну и выслушать замечания и критику. :wink:

// Скет для демонстрационного показа светотехники на коллекционных и масштабных моделях автомобилей c применением ИК пульта.
// Скетч создавался для моделей масштаба 1/24 и 1/18.
// Данный скетч использует библиотеку NecDecoder v 2.1

#include <NecDecoder.h>
NecDecoder ir;

// Пины для подключения светодиодов
const int ledPin_1 = 3;  // пин подключения 3. Правый поворотник
const int ledPin_2 = 4;  // пин подключения 4. Левый поворотник
const int ledPin_3 = 5;  // пин подключения 5. Правая противотуманка
const int ledPin_4 = 6;  // пин подключения 6. Левая противотуманка
const int ledPin_5 = 7;  // пин подключения 7. Габаритные огни
const int ledPin_6 = 8;  // пин подключения 8. Стоп-сигналы

// Переменные для управления состоянием светодиодов
bool ledState1 = false;  // Флаг для отслеживания состояния светодиода 1 (включен/выключен)
bool ledState2 = false;  // Флаг для отслеживания состояния светодиода 2 (включен/выключен)
bool ledState3 = false;  // Флаг для отслеживания состояния светодиода 3 (включен/выключен)
bool ledState4 = false;  // Флаг для отслеживания состояния светодиода 4 (включен/выключен)
bool ledState5 = false;  // Флаг для отслеживания состояния светодиода 5 (включен/выключен)
bool ledState6 = false;  // Флаг для отслеживания состояния светодиода 6 (включен/выключен)
bool status = true;      // Флаг для отслеживания состояния светодиода 3 и 4 (мигане)
bool open = true;        // Флаг для отслеживания состояния светодиода 3 и 4 (мигание)

unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
const long interval_1 = 650;                     // Интервал для мигания светодиодов 1 и 2 (в миллисекундах)
int interval[6] = { 25, 60, 45, 100, 75, 325 };  // Интервал для мигания светодиодов 3 и 4 (в миллисекундах)

bool isBlinking1 = false;  // Флаг для определения, запущено ли одновременное мигание светодиодов 1 и 2
bool isBlinking2 = false;  // Флаг для определения, запущено ли мигание светодиодов 3 и 4

void setup() {
  Serial.begin(9600);
  pinMode(ledPin_1, OUTPUT);  // Установка пина светодиода 1 на выход
  pinMode(ledPin_2, OUTPUT);  // Установка пина светодиода 2 на выход
  pinMode(ledPin_3, OUTPUT);  // Установка пина светодиода 3 на выход
  pinMode(ledPin_4, OUTPUT);  // Установка пина светодиода 4 на выход
  pinMode(ledPin_5, OUTPUT);  // Установка пина светодиода 5 на выход
  pinMode(ledPin_6, OUTPUT);  // Установка пина светодиода 6 на выход

  digitalWrite(ledPin_1, LOW);  // Изначально светодиода 1 выключен
  digitalWrite(ledPin_2, LOW);  // Изначально светодиода 2 выключен
  digitalWrite(ledPin_3, LOW);  // Изначально светодиода 3 выключен
  digitalWrite(ledPin_4, LOW);  // Изначально светодиода 4 выключен
  digitalWrite(ledPin_5, LOW);  // Изначально светодиода 5 выключен
  digitalWrite(ledPin_6, LOW);  // Изначально светодиода 6 выключен

  // ИК приемник подключен к пин 2
  attachInterrupt(0, irIsr, FALLING);
}

// Функция для управления светодиодом 1
void controlLED1(bool state) {
  ledState1 = state;
  digitalWrite(ledPin_1, ledState1 ? HIGH : LOW);
}

// Функция для управления светодиодом 2
void controlLED2(bool state) {
  ledState2 = state;
  digitalWrite(ledPin_2, ledState2 ? HIGH : LOW);
}

// Функция для управления светодиодом 3
void controlLED3(bool state) {
  ledState3 = state;
  digitalWrite(ledPin_3, ledState3 ? HIGH : LOW);
}

// Функция для управления светодиодом 4
void controlLED4(bool state) {
  ledState4 = state;
  digitalWrite(ledPin_4, ledState4 ? HIGH : LOW);
}

// Функция для управления светодиодом 5
void controlLED5(bool state) {
  ledState5 = state;
  digitalWrite(ledPin_5, ledState5 ? HIGH : LOW);
}

// Функция для управления светодиодом 6
void controlLED6(bool state) {
  ledState6 = state;
  digitalWrite(ledPin_6, ledState6 ? HIGH : LOW);
}

// в прерывании вызываем tick()
void irIsr() {
  ir.tick();
}

void loop() {
  // если пакет успешно принят
  if (ir.available()) {
    uint32_t value = ir.readPacket();
    // выводим весь пакет (32 бита)
    Serial.print("0x");
    Serial.println(value, HEX);

    // Проверяем, является ли принятый код кнопкой №1
    if (value == 0xFF30CF) {
      // Отключаем цикл 2 и одновременное мигание при активации цикла 1
      controlLED2(false);
      isBlinking1 = false;
      // Если светодиод 1 выключен, включаем его, и наоборот
      controlLED1(!ledState1);
    }

    // Проверяем, является ли принятый код кнопкой №2
    if (value == 0xFF18E7) {
      // Отключаем цикл 1 и одновременное мигание при активации цикла 2
      controlLED1(false);
      isBlinking1 = false;
      // Если светодиод 2 выключен, включаем его, и наоборот
      controlLED2(!ledState2);
    }

    // Проверяем, является ли принятый код кнопкой №3
    if (value == 0xFF7A85) {
      // Отключаем оба цикла при активации цикла 3
      controlLED1(false);
      controlLED2(false);
      // Включаем или выключаем одновременное мигание диодов 1 и 2
      isBlinking1 = !isBlinking1;
      if (isBlinking1) {
        previousMillis1 = 0;
        previousMillis2 = 0;
      } else {
        digitalWrite(ledPin_1, LOW);
        digitalWrite(ledPin_2, LOW);
      }
    }

    // Проверяем, является ли принятый код кнопкой №4
    if (value == 0xFF10EF) {
      // Включаем или выключаем мигание диодов 3 и 4
      isBlinking2 = !isBlinking2;
      if (isBlinking2) {
        previousMillis3 = 0;
      } else {
        digitalWrite(ledPin_3, LOW);
        digitalWrite(ledPin_4, LOW);
      }
    }
    
    // Проверяем, является ли принятый код кнопкой №5
    if (value == 0xFF38C7) {
      controlLED3(!ledState3);
      controlLED4(!ledState4);
    }
    
    // Проверяем, является ли принятый код кнопкой №6
    if (value == 0xFF5AA5) {
      // Включаем или выключаем светодиод 5
      controlLED5(!ledState5);
    }
    
    // Проверяем, является ли принятый код кнопкой №7
    if (value == 0xFF42BD) {
      // Включаем или выключаем светодиод 6
      controlLED6(!ledState6);
    }
  }

  // Цикл №3. Одновременное мигание диодов 1 и 2
  if (isBlinking1) {
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis1 >= interval_1) {
      previousMillis1 = currentMillis;
      digitalWrite(ledPin_1, !digitalRead(ledPin_1));
    }
    if (currentMillis - previousMillis2 >= interval_1) {
      previousMillis2 = currentMillis;
      digitalWrite(ledPin_2, !digitalRead(ledPin_2));
    }
  } else {
    // Цикл №1: Мигание светодиода 1 с интервалом 650 миллисекунд
    if (ledState1) {
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis1 >= interval_1) {
        previousMillis1 = currentMillis;
        digitalWrite(ledPin_1, !digitalRead(ledPin_1));
      }
    }

    // Цикл №2: Мигание светодиода 2 с интервалом 650 миллисекунд
    if (ledState2) {
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis2 >= interval_1) {
        previousMillis2 = currentMillis;
        digitalWrite(ledPin_2, !digitalRead(ledPin_2));
      }
    }
  }

  // Цикл №4: Мигания светодиодов 3 и 4 с интервалом 25, 60, 45, 100, 75, 325 миллисекунд
  if (isBlinking2) {
    for (int x = 0; x < 6; x++) { //Цикл 6 проходов
      if (open) { // если true
        digitalWrite(status ? ledPin_3 : ledPin_4, HIGH); // если status == false то падаем на пин 5 иначе на пин 6
      } else { // иначе
        digitalWrite(status ? ledPin_3 : ledPin_4, LOW); // если status == false то падаем на пин 5 иначе на пин 6
      }
      delay(interval[x]); // Ждем
      if (x == 5) { // если последний проход по циклу
        status = !status; // передаем слово (меняем текущий пин) меняем false на true и наоборот
      }
      open = !open; //меняем false на true и наоборот
    }
  }
}

Комментарии есть - уже хорошо.
Строки 9-14 - описано назначение светодиодов - совсем хорошо.
Строки 17-22 - привязка не к назначению, а к номеру светодиода. Зачем нам этот номер? Осмысленные номера даются именно затем, чтобы проще было анализировать код, а совсем не для того, чтобы заменить одни номера на другие.
Попутно возвращаемся к строкам, начиная с 9-й. Названия должны быть привязаны не к абстрактным номерам, а к конкретным функциям. Иначе анализ исходника станет мучением (*).
Строки 44-49 лишние. Совсем лишние.
Строки 55-89 - все это следовало бы поместить в единственную функцию с двумя параметрами.
Строки с 104, 106, 109 и ниже - это комментарии не несущие вообще никакой информации. Они просто загромождают код, повторяя то, что и без них содержится в коде. Комментарии должны не повторять код, а объяснять его. Т .е. писать следует не что делается, а зачем (**).
Ну и дальше: в коде имеется масса сходных фрагментов, которые на мой взгляд имело бы смысл оформить в виде отдельных функций. Но по причинам (*) и (**) код анализировать практически невозможно, поэтому делать этого не стал.

У меня еще возникли некоторые вопросы.
Строки 11-12 - у нас правда правые и левые противотуманки или они на самом деле передние и задние?
Строки 26-30 - у нас разве не единый цикл мигания всей светотехники? Объясните, что происходит и зачем.

Строки 17-22 я так обозначал для себя в процессе написания кода. Конкретно строки 17-19 разделены были мной для реализации следующей задачи. При нажатии кнопки ИК пульта 1, мигает правый поворот, цикл мигания правого поворота длится пока не будет нажата кнопка ИК пульта 1. И мне пришла идея, в момент тестирования работы цикла, что хорошо бы было заканчивать цикл нажатием любой кнопки (1 или 2 или 3) и запускать цикл соответствующий нажатой кнопке. Мне просто так было проще понимать в процессе написания кода.
Строки 44-49 лишние. Согласен. О том что изначально светодиоды выключены я прописал дважды.
Строки 55-89. Я реализовывал задачу согласно своих знаний. Буду изучать дальше и смогу поместить это в одну функцию.
По поводу комментариев о получении кода кнопки я оставлял для себя, в момент написания кода я сам стал теряться в этих кнопка вот и оставлял эти комментарии. Убрать всегда легче чем добавить.
Диоды противотуманок действительно левый и правый. Они выполняют два цикла. Мигание от кнопки ИК пульта 4, и постоянное свечение от кнопки ИК пульта 5.

Вот изначальные условия задачи на которых строился код программы:

  1. “Кнопка ИК пульта 1(Код кнопки 1: 0xFF30CF)” включает"Светодиод 1". “Светодиод 1” мигает с интервалом 700 миллисекунд. “Кнопка ИК пульта 1(Код кнопки 1: 0xFF30CF)” выключает"Светодиод 1" диод потух.

  2. “Кнопка ИК пульта 2(Код кнопки 2: 0xFF18E7)” включает “Светодиод 2”. “Светодиод 2” мигает с интервалом 700 миллисекунд. “Кнопка ИК пульта 2(Код кнопки 2: 0xFF18E7)” выключает “Светодиод 2” диод потух.

  3. “Кнопка ИК пульта 3(Код кнопки 3: 0xFF7A85)” включает “Светодиод 1” и “Светодиод 2”. “Светодиод 1” и “Светодиод 2” мигают одновременно с интервалом 700 миллисекунд. “Кнопка ИК пульта 3(Код кнопки 3: 0xFF7A85)” выключает “Светодиод 1” и “Светодиод 2” диоды потухли.

  4. “Кнопка ИК пульта 4(Код кнопки 4: 0xFF10EF)” включает “Светодиод 3” и “Светодиод 4”. “Светодиод 3” мигают с интервалом 25, 60, 45, 100, 65, 325 миллисекунд,потом “Светодиод 4” мигают с интервалом 25, 60, 45, 100, 65, 325 миллисекунд. “Кнопка ИК пульта 4(Код кнопки 4: 0xFF10EF)” выключает “Светодиод 3” и "Светодиод 4"диоды потухли.

  5. “Кнопка ИК пульта 5(Код кнопки 5: 0xFF38C7)” включает “Светодиод 3” и Светодиод 4" диоды постоянно горят. “Кнопка ИК пульта 5(Код кнопки 5: 0xFF38C7)” выключает “Светодиод 3” и Светодиод 4" диоды потухли.

  6. “Кнопка ИК пульта 6 (Код кнопки 6: 0xFF5AA5)” включает “Светодиод 5”. “Светодиод 5” должен гореть до нажатия кнопки 6 на ИК пульте.

  7. “Кнопка ИК пульта 7 (Код кнопки 7: 0xFF42BD)” включает “Светодиод 6”. “Светодиод 6” должен гореть до нажатия кнопки 7 на ИК пульте.

А нельзя как-то так:

#define RightTurnCode 0xFF30CF
#define RightTurnButton 3
#bool RightTurnState = false;

И забыть обо всех этих кнопка 1, кнопка 2, кнопка 3 как о кошмарном сне?

Если я правильно понимаю, то данная директива позволит одной кнопкой пульта переключать три цикла?

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