ARDUINO Поворотники с ИК-пульта

154Igor154

✩✩✩✩✩✩✩
13 Апр 2024
1
0
Здравствуйте! В Ардуино я "дерево", как и в целом в программировании. Решил электрофицировать модель автомобиля и чтобы управление было с пульта. Принцип работы, чтобы при нажатии условно клавиши "1" загорались левые поворотники и при повторном нажатии этой же клавиши выключались, точно так же и правые, при нажатии другой клавиши уже. Столкнулся с проблемой, что я никак не могу правильно вставить часть кода, который отвечает за моргание светодиода в общий скетч. Один раз я только добился результата, нажимаю клавишу, светодиод - включается 0.5 сек. горит, выключается 0.5 сек. не горит, но цикл больше не запускается, а мне нужно, чтобы он бесконечно моргал, пока я сам не подам сигнал с пульта о его выключении. Но скетч я тот потерял, да и он явно неверный, ибо я просто вставил delay между строк о нажатии кнопки. Уже использовал скетч, чтобы с одной кнопки включать, а с другой выключать, думал, что может быть там смогу, что-то намудрить, но ничего. С простыми фарами вроде как разобрался, проблема только в поворотниках, они никак не хотят работать с пульта.
P.s. приложил 2 кода, один просто включает/выключает с клавиши светодиоды, второй код же само моргание светодиода.
Помогите пожалуйста, как-то соединить эти 2 скетча между собой!

C++:
#include "IRremote.h"
IRrecv irrecv(9);
decode_results results;
int led1=0;
int led2=0;
void setup() {
  pinMode(8,OUTPUT);
  pinMode(2,OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn();
}
void loop() {
  if ( irrecv.decode( &results )) {
    Serial.println(results.value, HEX);
    
if (results.value==0xFF30CF&&led1==0){
  digitalWrite( 8, HIGH );led1=1;results.value=0;
}
if (results.value==0xFF30CF&&led1==1){
  digitalWrite( 8, LOW );led1=0;results.value=0;
}   

if (results.value==0xFF18E7&&led2==0){
  digitalWrite( 2, HIGH );led2=1;results.value=0;
}
if (results.value==0xFF18E7&&led2==1){
  digitalWrite( 2, LOW );led2=0;results.value=0;
}
 irrecv.resume();   
  }
 
}
C++:
void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, INPUT);
  digitalWrite(3, HIGH);
}

void loop() {
  if (digitalRead(3) == 0)
  {
    digitalWrite(2, HIGH);
    delay(500);
    digitalWrite(2, LOW);
    delay(500);
  }
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,284
1,304
Москва
Ну если в 2-х словах, то хромает логика.
У Вас по коду изменение состояния светодиода происходит только если пришла какая то команда с пульта. А если нет, то ничего и не делается.
Должно быть примерно так:
Есть состояние поворотника - начальное выключено.
Если пришла команда - изменить состояние поворотника, если надо -выключить светодиоды.
Если состояние поворотника влево - мигать левыми.
Если состояние поворотника вправо- мигать правыми.
 
  • Лойс +1
Реакции: 154Igor154

poty

★★★★★★✩
19 Фев 2020
3,278
951
@154Igor154, по факту, расшифровывая ответ @Старик Похабыч, нужно ввести ещё одну переменную, например, povorotnik, и изменять, помимо состояния светодиода (led1, led2) состояние этой переменной. Если эта переменная находится в состоянии 0, то ничего не делать, а в состоянии 1 - выполнять моргание. Код, приведённый Вами для моргания, не подойдёт, нужно использовать неблокирующий. Взять можно из специальной ветки @Старик Похабыч, где он разъясняет как это сделать.

P.S. так как поворотников два, то и переменных должно быть две.
 
Изменено:
  • Лойс +1
Реакции: 154Igor154