Библиотека Rc switch отображает полученные значения только один раз с помощью serial monitor

Я использую библиотеку Rc-коммутаторов для передачи и приема данных. Это работает нормально.

Часть , которая отправляет данные , выглядит следующим образом :

#include <Arduino.h>
#include <RCSwitch.h>

RCSwitch transmitter = RCSwitch();

void setup()
{
    Serial.begin(9600);
    transmitter.enableTransmit(10);
}

void loop()
{
    /* Отправка данных в двоичном формате */

    // Идите направо
    transmitter.send("010101010101010100000011");
    delay(1000);

    // Идти налево
    transmitter.send("010101010101010100001100");
    delay(1000);
}

А принимающая часть выглядит так:

#include <RCSwitch.h>

RCSwitch receiver = RCSwitch();
int rightLED = 4;
int leftLED = 7;
unsigned long receivedValue;
unsigned long goRight = 5592323;
unsigned long goLeft = 5592332;

void setup()
{
    Serial.begin(9600);
    receiver.enableReceive(0); // Приемник при прерывании 0
    pinMode(rightLED, OUTPUT);
    pinMode(leftLED, OUTPUT);
}

void moveRight()
{
    Serial.println("I'm going right");
}

void moveLeft()
{
    Serial.println("I'm going left");
}

void loop()
{
    if (receiver.available())
    {
        receivedValue = receiver.getReceivedValue();
        if (receivedValue == goRight)
        {
            moveRight();
        }
        if (receivedValue == goLeft)
        {
            moveLeft();
        }
        receiver.resetAvailable();
    }
}

Проблема в том, что когда я открываю последовательный монитор и просматриваю выходные данные полученных значений, функции moveRight и moveLeft вызываются несколько раз.

I'm going right
I'm going right
I'm going right
I'm going right
I'm going left
I'm going left
I'm going left
I'm going left
I'm going right
I'm going right
I'm going right
I'm going right

Какие изменения я должен внести в часть приемника, чтобы функции moveRight и moveLeft вызывались только один раз.

I'm going right
I'm going left
I'm going right

, 👍1


2 ответа


Лучший ответ:

2

Вы можете сохранить предыдущее полученное значение и печатать только в том случае, если оно отличается от того, что вы только что получили.

Что-то вроде этого:

// рядом с верхним
const int rightLED = 4;
const int leftLED = 7;
const unsigned long goRight = 5592323;
const unsigned long goLeft = 5592332;

// для сохранения состояния
unsigned long previousValue = 0;

// ...

// код цикла
void loop()
{
  if (receiver.available())
  {
    unsigned long receivedValue = receiver.getReceivedValue();
    if (receivedValue != previousValue) {
      // что-то изменилось
      if (receivedValue == goRight)
      {
        moveRight();
      }
      if (receivedValue == goLeft)
      {
        moveLeft();
      }
      // запомнить текущее значение
      previousValue = receivedValue;
    }
    receiver.resetAvailable();
  }
}
,

В зависимости от вашего приложения вы также можете захотеть сохранить время последнего полученного значения и сравнить его. В противном случае при повторном нажатии одной и той же кнопки последнее нажатие будет проигнорировано., @Gerben


2

Старый пост, я знаю, но мне нужно к нему добавить. Оператор «transmitter.enableTransmit(10);» заставляет библиотеку RCSwitch отправить сообщение 10 раз. Вы получаете 4 сообщения; вы должны получить 10. Я обнаружил, что при использовании "receiver.available()" Я также получаю примерно половину ожидаемого. Это всего лишь догадка, но я думаю, что функция "receiver.available()" получает каждое второе сообщение. Библиотека RCSwitch может иметь период ожидания после получения сообщения, который удерживает получателя в напряжении, в результате чего все остальные сообщения теряются. «Serial.begin(9600)»; также немного медленно, но я думаю, что буфер с этим справится.

На прикрепленном изображении показано энергопотребление моего передатчика. Вы можете видеть, что 10 сообщений отправляются примерно за 200 мс. Ваша задержка (1000) оставляет достаточно времени для завершения всех полученных сообщений.

transmitterPowerDemand

,