rcswitch автоповтор

maloicds
maloicds аватар
Offline
Зарегистрирован: 21.03.2013

Принимаю код от брелка через библиотеку rcswitch. Проблема в том, что при разовом нажатии кнопки приходят 2 и более одинаковых значений кода. Как сделать чтоб при одинарном нажатии фиксировалось одно значение?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Придёт в любом случае столько, сколько пошлёт Вам брелок и на это Вы повлиять не можете. Всё, что Вы можете - лишнее игнорировать, например, если пришло "тоже самое" и интервал времени не превысил некоторого порогового, то считать это "дребезгом" и игнорировать.

maloicds
maloicds аватар
Offline
Зарегистрирован: 21.03.2013

ЕвгенийП пишет:

Придёт в любом случае столько, сколько пошлёт Вам брелок и на это Вы повлиять не можете. Всё, что Вы можете - лишнее игнорировать, например, если пришло "тоже самое" и интервал времени не превысил некоторого порогового, то считать это "дребезгом" и игнорировать.

Можно в коде увидеть? :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Напишите - увидите. А если не будет получаться, выкладывайте, поможем.

maloicds
maloicds аватар
Offline
Зарегистрирован: 21.03.2013
void loop()
{
  if (mySwitch.available() && millis() - time > debounce)
  {
     val=mySwitch.getReceivedValue();
      Serial.println( val );
      time = millis();

  }
 mySwitch.resetAvailable();  
}

пока только так, но не особо помогает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, я не знаю что здесь написано, описаний переменных нет, инициализации нет, Бог его знает о чём это.

maloicds
maloicds аватар
Offline
Зарегистрирован: 21.03.2013
#include <RCSwitch.h>
long time = 0;
long debounce = 300;
long val=0; 
RCSwitch mySwitch = RCSwitch();
// code
// left   1832402
// right  1832404
// two    1832406
//------------------------------------------
void setup()
{
  Serial.begin(19200);
  mySwitch.enableReceive(0);  // D2 pin
}
//------------------------------------------
void loop()
{
  if (mySwitch.available() && millis() - time > debounce)
  {
     val=mySwitch.getReceivedValue();
      Serial.println( val );
      time = millis();

  }
 mySwitch.resetAvailable();  
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы читали, что я писал в посте №1 или я зря пальцы бил?

Вы должны

1. принять сигналэ

2. сравнить с предыдущим

3. Если не равно. то обрабатывать новый сигнал (и запомнить его, т.к. в следующий раз он станет предыдущим)

4. Если же равно, то посмотреть сколько времени прошло с принятия предыдцщего. если больше порогоа, то считать это новым сигналом, а если меньше, то просто запомнить время для дальнгейшего сравнения.

Вот это и напишите прямо построчно, комменятирую строки.

maloicds
maloicds аватар
Offline
Зарегистрирован: 21.03.2013

Помогли бы кодом и пальцы не пришлось бы бить

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понимаете, я готов помочь тому, кто делает сам. Ведь то, что писал как надо делать - это же тоже помощь. Если же нужно просто сделать для Вас код, то ... это не ко мне ... Бесплатно делать - с чего бы? За разумные деньги - не хочу, мне не надо. А за неразумные Вы не согласитесь, т.к. просчитаете это грабежом и будете правы.

Но Вы зайдите в раздел "Ищу исполнителя", там есть ребята и они сделают.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*
*/
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
long read() {
  long val = 0;
  if (mySwitch.available()) {
    val = mySwitch.getReceivedValue();
    mySwitch.resetAvailable();
  }
  return val;
};
long val;
long val_old;
bool debounce;
const long code_left = 1832402;
const long code_right = 1832404;
const long code_two = 1832406;
void func_left() {
  Serial.println( "func_left" );
};
void func_right() {
  Serial.println( "func_right" );
};
void func_two() {
  Serial.println( "func_two" );
};
//------------------------------------------
void setup() {
  Serial.begin(19200);
  mySwitch.enableReceive(0);  // D2 pin
  val_old = read();
  debounce = 0;
}
//------------------------------------------
void loop() {
  static uint32_t past = 0;
  val = read();
  if (val != 0 && !debounce) {
    debounce = 1;
    past = millis();
    if ( val_old == 0) {
      if (val == code_left) {
        func_left();
      }
      if (val == code_right) {
        func_right();
      }
      if (val == code_two) {
        func_two();
      }
    }
  }
  if (debounce && past - millis() > 500) {
    debounce = 0;
  }
  val_old = val;
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а я так принимаю )))
 

#include "IRremote.h"
IRrecv irrecv(11);          // Указываем пин, к которому подключен приемник
decode_results results;
long keyCode;
unsigned long last = millis();
 
void setup()
{
  Serial.begin(9600); // Выставляем скорость COM порта
  irrecv.enableIRIn(); // Запускаем прием
}
 
void loop() {

  /*
  if (irrecv.decode(&results)) // Если данные пришли 
  {
    Serial.println(results.value, HEX); // Отправляем полученную данную в консоль
    irrecv.resume(); // Принимаем следующую команду
  } */

  if (irrecv.decode(&results)) {
  if (millis() - last > 250) {
  keyCode = results.value;
  Serial.println(keyCode, HEX);
  }
  last = millis();
  irrecv.resume();
}
}                        

 

maloicds
maloicds аватар
Offline
Зарегистрирован: 21.03.2013

qwone, автоповтор работает :(

maloicds
maloicds аватар
Offline
Зарегистрирован: 21.03.2013

ua6em, спасибо!!!! то что нужно! тема закрыта

maloicds
maloicds аватар
Offline
Зарегистрирован: 21.03.2013
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
unsigned long last = millis();
void func_left() {
  Serial.println( "func_left" );
};
void func_right() {
  Serial.println( "func_right" );
};
void func_two() {
  Serial.println( "func_two" );
};
//------------------------------------------
void setup()
{
  Serial.begin(19200);
  mySwitch.enableReceive(0);  // D2 pin
}
//------------------------------------------
void loop()
{
  if (mySwitch.available())
  {
   if (millis() - last > 250)
    {
     switch (mySwitch.getReceivedValue())
     {
      case 1832402:
       func_left();
      break;
      case 1832404:
       func_right();
      break;
      case 1832406:
       func_two();
      break;
     }
    }
  last = millis();
  mySwitch.resetAvailable();  
  }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

maloicds пишет:

ua6em, спасибо!!!! то что нужно! тема закрыта

Не за что!
Я сам буквально с августа только учусь )))