Как два одинаковых значения с пульта воспринимать, как одно?

Прошу помощи как новичок, который ранее максимум собирал какие-то простые готовые гайверовские проекты
Суть такова, есть двухканальный led драйвер с возможностью регулировки яркости и цветовой температуры с пульта 433 все бы ничего, но он имеет ужасный свист на 7кгц, были попытки это исправить физически, эффекта не дало, был проведен частичный реверс инжиниринг и выяснилось, что схема там такая - приемник 433-> -мк с затертой маркировкой → выход шима на управляющие ноги двух драйверов, в связи с простотой схемы была предпринята попытка заменить родной контроллер на arduino nano с разогнанным шимом через какой-то регистр до 30кгц +, что гарантированно увело бы писк и свист за слышимый диапазон, сама замена прошла успешно, но встал вопрос восстановления функционала пульта, т.е. бинд кнопок и их функий, сам процесс идет, но встала проблема, родной пульт (а заменить его не просто, тк обычный приемник на 433 его не ловит, в пульте какой-то кварц на ~13мгц) имеет одну упоротую особенность, за одно нажатие он отсылает 2 одинаковых кода, то есть одно нажатие код воспринимает как два, попытки отфильтровать это добавив задержку не увенчались успехом тк управление становилось тормознутым либо был режим стробоскопа, нужно каким-то образом заставить 2 последних одинаковых полученных значения воспринимать как одно, но я без понятия как это сделать с чем и прошу помощи

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

int pwm_y = 0;
int pwm_w = 0;
int pwm_y_last = 255;
int pwm_w_last = 255;
float k_temp[6]={0.0,0.1,0.25,0.5,0.75,1.0};
int i_y = 5; 
int i_w = 5;
int max_bright = 255;
void setup() {
  TCCR2B = 0b00000001;
  mySwitch.enableReceive(0); // Указываем пин для приема сигнала rc-switch
  pinMode(3, OUTPUT); // Пины шима
  pinMode(11, OUTPUT);
   Serial.begin(9600); // 

}
void loop() {
  if (mySwitch.available()) {
    long value = mySwitch.getReceivedValue();
    Serial.print("Received value: ");
    Serial.println(value); // Выводим принимаемые значения в монитор порта
    if (pwm_y == 0 && pwm_w == 0) //Проверяем, что панель выключена
      {
        if (value == 6127871) // Кнопка Вкл
        {
        pwm_y = pwm_y_last;
        pwm_w = pwm_w_last;
        }
      }
    else //Если панель уже работает
    {
      switch (value) {
        case 6127617: // Кнопка Выкл 
          if (pwm_y != 0 || pwm_w != 0)
           {
            pwm_y_last = pwm_y;
            pwm_w_last = pwm_w;
           }
          pwm_y = 0;
          pwm_w = 0;
          break;
        case 6127616: // Кнопка Вверх яркость
          max_bright = min(max_bright+255/10,255);
          pwm_y = max_bright*k_temp[i_y];
          pwm_w = max_bright*k_temp[i_w]; 
          break;
        case 6127629: //Кнопка Вниз яркость
          max_bright = max(max_bright-255/10,25);
          pwm_y = max_bright*k_temp[i_y];
          pwm_w = max_bright*k_temp[i_w]; 
          break;
        case 6127625: // Кнопка Влево теплее
          if (i_w == 5 && i_y < 5)
          {
            i_y += 1; }
          else if (i_w <= 5 && i_y == 5 && i_w - 1 >= 0)
          {
            i_w -= 1; }
          pwm_y = max_bright*k_temp[i_y];
          pwm_w = max_bright*k_temp[i_w]; 
          break;
        case 6127637: //Кнопка Вправо холоднее
          if (i_y == 5 && i_w < 5)
          {
            i_w += 1; }
          else if (i_y <= 5 && i_w == 5 && i_y - 1 >= 0)
          {
            i_y -= 1; }
          pwm_y = max_bright*k_temp[i_y];
          pwm_w = max_bright*k_temp[i_w];
          break;
        /*case 6127622: // Кнопка Луна пресет заменить
          pwm_w -= 36;
          pwm_w = max(pwm_w, 255); // 
          break;
        case 6127626: // Кнопка Солнце пресет заменить
          pwm_w -= 36;
          pwm_w = max(pwm_w, 255); // 
        break;
        case 6127638: // Кнопка Ct- только холодный
          pwm_y = 0;
          pwm_w = 255; // 
          break;
        case 6127636: // Кнопка Ct+ только теплый
          pwm_y = 255;
          pwm_w = 0; // */
        }
    }
    mySwitch.resetAvailable();
  }
  analogWrite(11, pwm_y); // Управляем ШИМ-сигналом для теплого
  analogWrite(3, pwm_w); // Управляем ШИМ-сигналом для холодного
}
 

ээм как насчет вначале принять минимум 2 значения (передатчик отправляет всегда 2 ) но обрабтывать только 1 ?или каждое второе.
типа

if (mySwitch.available() == 2) {
    long value1 = mySwitch.getReceivedValue();
    long value2 = mySwitch.getReceivedValue();
...
}
1 лайк

Если в тупую поменять на это, то не работает, в сериал ничего не выводит

покажите ваш код котрый применили и ссылку откуда ставили библиотеку <RCSwitch.h>
если скажете что библиотека стандартная , я скажу что у меня все работает.

1 лайк

Библиотека была скачана отсюда rc-switch - Arduino Reference
Сейчас для теста использовал этот код в другом скетче, но опять же значения не выводит

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available() == 2) {
    long value1 = mySwitch.getReceivedValue();
    long value2 = mySwitch.getReceivedValue();
    
    Serial.print(value2);
    Serial.print(" ");
    Serial.print(value1);
    Serial.println();
    
    mySwitch.resetAvailable();
  }
}

Допускаю, что я очень сильно туплю, но не пойму где именно

понятно , моя ошибка , думал mySwitch.available() возвращает количесво кодов.

а если так :

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
bool first_code = false;

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2
}
void loop() {
  if (mySwitch.available() && first_code == false)
  {
      long value = mySwitch.getReceivedValue(); // не факт что надо
      mySwitch.resetAvailable();                               // не факт что надо
      first_code = true;
  }
  if (mySwitch.available() && first_code == true) {
    first_code = false;
    long value = mySwitch.getReceivedValue();
    
    Serial.print(value);
    Serial.println();
    
    mySwitch.resetAvailable();
  }
}
1 лайк

Элементарно:
Представьте себя на месте Ардуины. Это именно Вы принимаете сигналы от пульта. Вот как лично Вы будете это делать, если Вам нужно “2 последних одинаковых полученных значения воспринимать как одно”?
Напишите это подробно по-русски. А затем просто перепишите на Си.

Поделюсь страшной тайной: в большинстве случаев контроллер может поступить именно так, как делал бы человек на его месте. И именно из этого нужно исходить, когда составляете пргограмму.

этот код не делает того, что оговорено в ТЗ - то есть не воспринимает два одинаковых кода как один.
Вместо этого программа просто отбрасывает каждый второй код и все. Это совершенно иная логика…

Мой ошибочный код удален

Дело не в том, что Ваш код “ошибочный” - вполне возможно он работает, просто он не соответствует тому ТЗ, что Вы сформулировали в начале ветки.