Светодиодный маяк на Nano

Здравствуйте!
Собрал маяк-конструктор из фанеры, и теперь хочу его подсветить светодиодами изнутри Ардуиной Nano. Да не просто так, а в двух режимах: 1-й режим, “Ночник” - все три диода горят постоянно, 2-й режим, “Маяк” - один диод плавно включается, горит 5 сек, плавно выключается, не горит 3 сек, дальше по циклу, а в это же время два других диода имитируют жилую постройку рядом с маяком и рандомно включаются и выключаются, но не чаще раза в 10 секунд. И всё это добро должно управляться ИК-пультом (в наличии): ВКЛ/ВЫКЛ одной кнопкой, и еще две кнопки - на два режима.

Замучил уже ChadAI и другие ИИ, никто толком ничего не кодит. Всё время что-то не работает. Пока совместными усилиями придумали вот такое, чтобы хотя бы один режим наладить ради эксперимента:

#include <IRremote.h>

const int led1Pin = 9; // Первый светодиод
const int led2Pin = 10; // Второй светодиод
const int led3Pin = 11; // Третий светодиод
IRrecv irrecv(2); // Подключаем ИК-приемник к пину 2
decode_results results;

bool isOn = false; // Состояние системы
int brightness = 0; // Яркость для плавного изменения
int fadeAmount = 5; // Сколько увеличивать или уменьшать яркость

void setup() {
Serial.begin(9600); // Инициализация последовательного монитора
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, LOW);
irrecv.enableIRIn(); // Включаем ИК-приемник
}

void loop() {
// Проверяем наличие сигнала от ИК-пульта
if (irrecv.decode(&results)) {
Serial.print("Received code: ");
Serial.println(results.value); // Вывод кода кнопки
handleIRInput(results.value);
irrecv.resume(); // Ждем следующего сигнала
}

// Управляем мигающим светодиодом, если система включена
if (isOn) {
controlBeacon();
}
}

void handleIRInput(unsigned long code) {
// Код кнопки включения
if (code == 16753245) { // Код первой кнопки
Serial.println(“Turning on the system.”);
isOn = true;
// Включаем все светодиоды
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, HIGH);
digitalWrite(led3Pin, HIGH);
}
/*
// Код кнопки выключения
else if (code == 16736925) { // Код второй кнопки
Serial.println(“Turning off the system.”);
isOn = false;
// Выключаем все светодиоды
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, LOW);
}*/
}

void controlBeacon() {
// Включаем светодиод плавно
for (brightness = 0; brightness <= 255; brightness += fadeAmount) {
analogWrite(led1Pin, brightness);
delay(20); // Задержка для плавности
// Проверяем входящие команды, чтобы избежать блокировки
if (irrecv.decode(&results)) {
Serial.println(results.value);
if (results.value == 16736925) {
isOn = false;
digitalWrite(led1Pin, LOW);
analogWrite(led2Pin, 0);
analogWrite(led3Pin, 0);
Serial.println(“Turning off the system.”);
irrecv.resume();
return; // Выходим из функции, чтобы остановить мигание
}
irrecv.resume();
}
}
delay(5000); // Горит 5 секунд

// Выключаем светодиод плавно
for (brightness = 255; brightness >= 0; brightness -= fadeAmount) {
analogWrite(led1Pin, brightness);
delay(20); // Задержка для плавности
// Проверяем входящие команды
if (irrecv.decode(&results)) {
Serial.println(results.value);
if (results.value == 16736925) {
isOn = false;
digitalWrite(led1Pin, LOW);
analogWrite(led2Pin, 0);
analogWrite(led3Pin, 0);
Serial.println(“Turning off”);
irrecv.resume();
return; // Выходим из функции, чтобы остановить мигание
}
irrecv.resume();
}
}
delay(3000); // Не горит 3 секунды
}

Но всё равно во время выполнения функции controlBeacon система не принимает сигналы с пульта.
Как победить? И вообще, какие мысли по поводу реализации моей затеи?

Положительные. Когда есть хобби - оно завсегда лучше.

7 лайков

Еще ЧатЖиПиТИ и ДипСик надо задрочить хотелками. Рано или поздно повезет

1 лайк

ИИ пока не умеют читать мысли, увы. Поэтому бумажка, ручка, алгоритмы, блок-схемы…

Так никто не умеет, даже КОТ (кошка прикидывается, что умеет, на самом деле - нет)…

1 лайк

зато бесплатно

1 лайк

И самому думать не нужно ))

2 лайка