Вопрос по программированию Ардуино

JesterKING
Offline
Зарегистрирован: 09.03.2021

Здравствуйте. Подскажите, пожалуйста, как дописать в этот код режим удержания кнопки? То есть, при нажатии кнопки сигнал есть, при отпускании сигнала нет

#include "IRremote.h"
IRrecv irrecv(6); // указываем вывод, к которому подключен приемник
decode_results results;
int in1 = 2;
int in2 = 3;
int in3 = 4;
int in4 = 5;
byte ad = 0;
void setup() {
  irrecv.enableIRIn();
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  
}

void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
  if (results.value ==0xE0E048B7){
        if (ad != 0){
        digitalWrite(in1, 1);
        digitalWrite(in2, 0);
        digitalWrite(in3, 1);
        digitalWrite(in4, 0);}}
    case 0xE0E008F7:
        digitalWrite(in1, 0);
        digitalWrite(in2, 1);
        digitalWrite(in3, 0);
        digitalWrite(in4, 1);
        break;
    case 0xE0E058A7:
        digitalWrite(in1, 0);
        digitalWrite(in2, 0);
        digitalWrite(in3, 0);
        digitalWrite(in4, 0);
        break;
    case 0xE0E0D02F:
        digitalWrite(in1, 1);
        digitalWrite(in2, 0);
        digitalWrite(in3, 0);
        digitalWrite(in4, 0);
        break;
    case 0xE0E0E01F:
        digitalWrite(in1, 0);
        digitalWrite(in2, 0);
        digitalWrite(in3, 1);
        digitalWrite(in4, 0);
        break;

    }    
    irrecv.resume(); // принимаем следующую команду
  }
}

 

JesterKING
Offline
Зарегистрирован: 09.03.2021

КОД ВОТ ЭТОТ

#include "IRremote.h"
IRrecv irrecv(6); // указываем вывод, к которому подключен приемник
decode_results results;
int in1 = 2;
int in2 = 3;
int in3 = 4;
int in4 = 5;

void setup() {
  irrecv.enableIRIn();
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  
}

void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0xE0E048B7:
        digitalWrite(in1, 1);
        digitalWrite(in2, 0);
        digitalWrite(in3, 1);
        digitalWrite(in4, 0)
        break;
    case 0xE0E008F7:
        digitalWrite(in1, 0);
        digitalWrite(in2, 1);
        digitalWrite(in3, 0);
        digitalWrite(in4, 1);
        break;
    case 0xE0E058A7:
        digitalWrite(in1, 0);
        digitalWrite(in2, 0);
        digitalWrite(in3, 0);
        digitalWrite(in4, 0);
        break;
    case 0xE0E0D02F:
        digitalWrite(in1, 1);
        digitalWrite(in2, 0);
        digitalWrite(in3, 0);
        digitalWrite(in4, 0);
        break;
    case 0xE0E0E01F:
        digitalWrite(in1, 0);
        digitalWrite(in2, 0);
        digitalWrite(in3, 1);
        digitalWrite(in4, 0);
        break;

    }    
    irrecv.resume(); // принимаем следующую команду
  }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А где тут сигнал?

JesterKING
Offline
Зарегистрирован: 09.03.2021

Извиняюсь, не сигнал

У меня с ик датчиком соединены моторы

Я имел ввиду, что бы при удержании кнопки на пульте срабатывал ряд условий:( к примеру)

Если нажал и держишь кнопку,  моторы крутятся, если кнопку отпустил, то моторы останавливаются

kalapanga
Offline
Зарегистрирован: 23.10.2016

Для начала не грех бы выяснить, что передаёт Ваш пульт при удержании кнопки...

JesterKING
Offline
Зарегистрирован: 09.03.2021

При удержании кнопки выводит:

FFA857
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFA857
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
254C6A54
5ADDC00
A5E0B850
14A16EAD
EC8BD04
24467215
F3EAEB57
4CB0FADD
FFFFFFFF
F5EAEE7C
22AE7A28
4CB0FADD
4CB0FADD
94B7E08C
FCABFFBF
25FECBF2
31F635CC
4CB0FADD
5254D2D2
3ABA2D47
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
4AB0F7B7
FFFFFFFF
98AEB0C
4AB0F7B6
D082EA55
FB86FA93
1A6EFE49
70B85058
BC308C33
13E04A06
B2301B46
EA72ACEE
EC0665FB
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF

 

b707
Offline
Зарегистрирован: 26.05.2017

запомнить последнюю пришедшую команду и при приходе "FFFFFFFF" повторять ее

JesterKING
Offline
Зарегистрирован: 09.03.2021

Последняя пришедшая команда это к примеру строчка 61?

sadman41
Offline
Зарегистрирован: 19.10.2016

if (results.value != 0xFFFFFFFF) { lastCommand = results.value; }

 

 

JesterKING
Offline
Зарегистрирован: 09.03.2021

И в этом же условии я прописываю то, что хочу?

sadman41
Offline
Зарегистрирован: 19.10.2016

А вы подумайте - можно ли обойтись без "прописывания в условии". 

По мне так - осталось поменять одну строчку в исходнике.

JesterKING
Offline
Зарегистрирован: 09.03.2021

Поменять так? Через условие?

if (results.value == 0xFF38C7){
      lastCommand = results.value;
      digitalWrite(in1,1);
      digitalWrite(in2,0);
      digitalWrite(in3,1);
      digitalWrite(in4,0);}

 

b707
Offline
Зарегистрирован: 26.05.2017

JesterKING пишет:

Через условие?

Сами думать упорно не хотите? обязательно надо чтобы старший по головке погладил и сказал "все верно"?

Что значит "через условие"? А не через условие - это как?

JesterKING
Offline
Зарегистрирован: 09.03.2021

Если пишу вот так, то вообще ничего не работает

include "IRremote.h"

IRrecv irrecv(6); 

decode_results results;
unsigned long lastCommand;
int in1 = 2;
int in2 = 3;
int in3 = 4;
int in4 = 5;
void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}

void loop() {
  if ( irrecv.decode( &results ))
  { 
 
  if (results.value != 0xFFFFFFFF){
     results.value  = lastCommand; }
  
  if (results.value == 0xFF38C7){
      lastCommand = results.value;
      digitalWrite(in1,1);
      digitalWrite(in2,0);
      digitalWrite(in3,1);
      digitalWrite(in4,0);}
  if (results.value == 0xFFB04F){
      lastCommand = results.value;
      digitalWrite(in1,1);
      digitalWrite(in2,0);
      digitalWrite(in3,1);
      digitalWrite(in4,0);}
      irrecv.resume(); 
  }
}

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Логично. У Вас, когда приходит символ повтора, ничего и не делается. Надо всё наоборот.

Если получили значение с кодом кнопки, то делать ничего не надо, только его запомнить. А вот если получили код повтора, то в зависимости от последней ззапомненной команды выполнять те или иные действия.

Ну и irrecv.resume(); не на месте стоит. Почему он только в случае одной конкретной кнопки вызывается? Всегда должен.

sadman41
Offline
Зарегистрирован: 19.10.2016

Не надо в моей строке местами переменные переставлять.

Просто поразмышляйте над ним: если принятый код не является кодом повтора, то последней командой считается вновь принятый код.
Пока прилетает ffffff - в lastCommand продолжает лежать последний код и он - не "повтор".

Как дальше поступить с командой? Подсказываю ещё раз: решение в изменении одной строке первоначального кода.

JesterKING
Offline
Зарегистрирован: 09.03.2021

Я правильно понимаю? Нужно использовать millis, то есть найти время с момента получения последнего кода повтора

sadman41
Offline
Зарегистрирован: 19.10.2016

Вам какое действие необходимо сделать, опираясь на полученный код? В какой строке осуществляется выбор действия?

JesterKING
Offline
Зарегистрирован: 09.03.2021

Я сделал, большое спасибо за помощь!