Доброго времени суток форумчане.
Я немного продвинулся в своих навыках в освоении Arduino. Как и писал ранее, предыдущий скетч меня не очень устраивал по причине невозможности им управлять (так сказать поиграться). Я решил его переделать. Реализовать все функции при помощи ИК пульта. Хочу поделится своим результатом. Ну и выслушать замечания и критику. 
// Скет для демонстрационного показа светотехники на коллекционных и масштабных моделях автомобилей 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 и наоборот
}
}
}