Добрый день.Помогите пожалуйста с написанием скетча.Мне необходимо, что-бы светодиод загарался только при нажатии кнопки на пульте.Смог написать следующий скеч ̀̀̀ #include “IRremote.h”
IRrecv irrecv(2);
decode_results results;
int led1 = 0;
int led2 = 0;
int led3 = 0;
int led4 = 0;
int led5 = 0;
int led6 = 0;
int led7 = 0;
Потрудитесь привести в порядок форматирование кода и оформление в вашем вопросе.
Копипаста - зло! Используйте циклы, списки, массивы, структуры. Куча вариантов, как сократить эту лапшу в разы.
По вашему вопросу, на вскидку (не проверял):
void loop()
{
if (irrecv.decode(&results)) {
if (results.value == 0x5EA1B04F) {
digitalWrite(4, HIGH);
// results.value = 0; // это зачем вообще?
} else digitalWrite(4, LOW);
// ...аналогичные блоки if..else для каждого светодиода
irrecv.resume();
}
}
Смысл написанного: с каждой итерацией проверяем, какой сигнал получили с пульта. Если подходит для конкретного диода - зажигаем его, если нет - тушим. Так будут тухнуть все непричастные. И если кнопу на пульте отпустить, то и соответствующий ей диод потухнет.
Переменные led1...led7 будут не нужны.
Можно более лаконично исполнить. Получить сигнал, определить, на какой пин будем подавать HIGH (тут нужна карта). В цикле перебрать массив пинов и внутри проверять условием, какой зажечь, остальные выключать. Тут есть место для фантазии.
Я понял, зачем это. Сразу не увидел. Эту строку нужно в конце внешнего блока if прописать один раз.
Все - фигня! Придумал, как нужно
uint8_t previousPinOn = 0;
uint8_t pinOn = 0;
void loop()
{
if (irrecv.decode(&results)) {
switch (results.value) {
case 0x5EA1B04F:
pinOn = 4;
break;
case 0x5EA130CF:
pinOn = 5;
break;
// все остальные сигналы...
default:
pinOn = 0;
}
if (previousPinOn != pinOn) {
if (previousPinOn != 0) {
digitalWrite(previousPinOn, LOW);
}
if (pinOn != 0) {
digitalWrite(pinOn, HIGH);
}
previousPinOn = pinOn;
}
results.value = 0;
irrecv.resume();
}
}
В конкретный момент времени может гореть только один светодиод, максимум. Поэтому достаточно запоминать, на каком пине зажгли диод и если с очередной итерацией сигнал с пульта поменялся, текущий диод потушить и возможно зажечь другой.
И не нужны тут циклы с выключением всех светодиодов, это я думать не хотел.
Спасибо, но я возможно плохо конкретизировал задачу.Светодиод должен при нажатии загорается, и гореть, лишь пока кнопка удерживается.При отпускании кнопки должен гаснуть.И так для каждой кнопки ИК пульта
Для начала нужно уточнить, что Ваш пульт шлёт при удержании кнопки. Скорее всего он один раз шлёт код кнопки, а потом до отпускания специальный код повторения (но это не обязательно так). Это надо учесть при составлении алгоритма работы.
В остальном вроде ничего сложного не должно быть.
Написал следующее #include “IRremote.h”
IRrecv irrecv(2);
decode_results results;
int led1 = 0;
int led2 = 0;
int led3 = 0;
int led4 = 0;
int led5 = 0;
int led6 = 0;
int led7 = 0;
Извините,
C:\Users\s001\Documents\Arduino\Akai635_weiter\Akai635_weiter.ino: In function ‘void loop()’:
C:\Users\s001\Documents\Arduino\Akai635_weiter\Akai635_weiter.ino:36:11: error: duplicate case value
case 0x5EA1B04F:
^~~~
C:\Users\s001\Documents\Arduino\Akai635_weiter\Akai635_weiter.ino:33:11: note: previously used here
case 0x5EA1B04F:
^~~~
C:\Users\s001\Documents\Arduino\Akai635_weiter\Akai635_weiter.ino:42:9: error: duplicate case value
case 0x5EA1B04F:
^~~~
C:\Users\s001\Documents\Arduino\Akai635_weiter\Akai635_weiter.ino:33:11: note: previously used here
case 0x5EA1B04F:
^~~~
C:\Users\s001\Documents\Arduino\Akai635_weiter\Akai635_weiter.ino:45:9: error: duplicate case value
case 0x5EA130CF:
^~~~
C:\Users\s001\Documents\Arduino\Akai635_weiter\Akai635_weiter.ino:39:9: note: previously used here
case 0x5EA130CF:
^~~~