Добавляем новые переменные в библиотеку RCSwitch

alexval2007
Offline
Зарегистрирован: 10.11.2012

Всем доброго дня.

Возникла нужда добавить новые переменные в библиотеку RCSwitch.

Сама библиотека была урезана до минимального необходимого рабочего функционала

   с библиотекой используется такой радиопульт с алиэкспрэс на 433мгц.

   И модуль приёмника 433мгц.

   Хочу подключить данный пульт к гирлянде на WS2812 но мне необходимо вывести переменную которая будет сигнализировать о том что данный приняты и можно выводить данные на гирлянду. А когда поступают данные с пульта остонавливать вывод на гирлянду обработать команды с пульта и только потом вернутся к выводу на гирлянду.

//скетч
//RF_remote
#include "RCSwitch_mini.h"
RCSwitch_mini mySwitch = RCSwitch_mini();
//--------------------------------------------------------------------
void setup() 
{
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // прерывание по приёму данных по RF INT0(pin2).
}
//--------------------------------------------------------------------
void loop() 
{
  if (mySwitch.available()) 
  {
    int value1 = mySwitch.getReceivedValue();
    if (value1) 
    {
      
      Serial.println(mySwitch.getReceivedValue());
      
      if (mySwitch.flag)
      {
         Serial.println("010");
      }
    }
  }
    mySwitch.resetAvailable();
}
//RCSwitch_mini.cpp
/*
  RCSwitch_mini
*/
#include "RCSwitch_mini.h"
boolean rf_flag1;
unsigned long RCSwitch_mini::nReceivedValue = NULL;
unsigned int RCSwitch_mini::nReceivedBitlength = 0;
unsigned int RCSwitch_mini::nReceivedDelay = 0;
unsigned int RCSwitch_mini::nReceivedProtocol = 0;
int RCSwitch_mini::nReceiveTolerance = 60;
unsigned int RCSwitch_mini::timings[RCSWITCH_MAX_CHANGES];
//-------------------------------------------------------------------------
RCSwitch_mini::RCSwitch_mini() 
{
  this->nReceiverInterrupt = -1;
  this->setReceiveTolerance(60);
  RCSwitch_mini::nReceivedValue = NULL;
}
//-------------------------------------------------------------------------
// Set Receiving Tolerance
void RCSwitch_mini::setReceiveTolerance(int nPercent) 
{
  RCSwitch_mini::nReceiveTolerance = nPercent;
}
//-------------------------------------------------------------------------
//Enable receiving data
void RCSwitch_mini::enableReceive(int interrupt) 
{
  nReceiverInterrupt = interrupt;
  if (this->nReceiverInterrupt != -1) 
  {
    RCSwitch_mini::nReceivedValue = NULL;
    RCSwitch_mini::nReceivedBitlength = NULL;
    attachInterrupt(this->nReceiverInterrupt, handleInterrupt, CHANGE);
  }
}
//-------------------------------------------------------------------------
bool RCSwitch_mini::available() 
{
  return RCSwitch_mini::nReceivedValue != NULL;
}
//-------------------------------------------------------------------------
void RCSwitch_mini::resetAvailable() 
{
  RCSwitch_mini::nReceivedValue = NULL;
}
//-------------------------------------------------------------------------
unsigned long RCSwitch_mini::getReceivedValue() 
{
    return RCSwitch_mini::nReceivedValue;
}
//-------------------------------------------------------------------------
bool RCSwitch_mini::receiveProtocol(unsigned int changeCount)
{
      unsigned long code = 0;
      unsigned long delay = RCSwitch_mini::timings[0] / 31;
      unsigned long delayTolerance = delay * RCSwitch_mini::nReceiveTolerance * 0.01;    

      for (int i = 1; i<changeCount; i = i + 2) 
      {
          if (RCSwitch_mini::timings[i] > delay-delayTolerance && RCSwitch_mini::timings[i] < delay+delayTolerance && RCSwitch_mini::timings[i+1] > delay*3-delayTolerance && RCSwitch_mini::timings[i+1] < delay*3+delayTolerance) 
          {
            code = code << 1;
          } 
          else if (RCSwitch_mini::timings[i] > delay*3-delayTolerance && RCSwitch_mini::timings[i] < delay*3+delayTolerance && RCSwitch_mini::timings[i+1] > delay-delayTolerance && RCSwitch_mini::timings[i+1] < delay+delayTolerance) 
          {
            code += 1;
            code = code << 1;
          } 
          else 
          {
            // Failed
            i = changeCount;
            code = 0;
          }
      }      
      code = code >> 1;
      
    if (changeCount > 6) 
    {    // ignore < 4bit values as there are no devices sending 4bit values => noise
      RCSwitch_mini::nReceivedValue = code;
      RCSwitch_mini::nReceivedBitlength = changeCount / 2;
      RCSwitch_mini::nReceivedDelay = delay;
      RCSwitch_mini::nReceivedProtocol = 1;
    }

    if (code == 0)
    {
        flag = false;
        return false;
    }
    else if (code != 0)
    {
        flag = true;
        return true;
    }
}
//-------------------------------------------------------------------------
void RCSwitch_mini::handleInterrupt() //Прерывание по приходу данных по RF
{
  static unsigned int duration;
  static unsigned int changeCount;
  static unsigned long lastTime;
  static unsigned int repeatCount;
  long time = micros();
  duration = time - lastTime;
 
  if (duration > 5000 && duration > RCSwitch_mini::timings[0] - 200 && duration < RCSwitch_mini::timings[0] + 200) 
  {
    repeatCount++;
    changeCount--;
    if (repeatCount == 2) 
    {
      if (receiveProtocol(changeCount) == false){ }
      repeatCount = 0;
    }
    changeCount = 0;
  } 
  else if (duration > 5000) 
  {
    changeCount = 0;
  }
 
  if (changeCount >= RCSWITCH_MAX_CHANGES) 
  {
    changeCount = 0;
    repeatCount = 0;
  }
  RCSwitch_mini::timings[changeCount++] = duration;
  lastTime = time;  
}
//-------------------------------------------------------------------------
//RCSwitch_mini.h
/*
  RCSwitch_mini
*/
#ifndef _RCSwitch_mini_h
#define _RCSwitch_mini_h

#if defined(ARDUINO) && ARDUINO >= 100
    #include "Arduino.h"
#else
    #include "WProgram.h"
#endif

// Number of maximum High/Low changes per packet.
// We can handle up to (unsigned long) => 32 bit * 2 H/L changes per bit + 2 for sync
#define RCSWITCH_MAX_CHANGES 67

class RCSwitch_mini 
{
  public:
    RCSwitch_mini();  
    void enableReceive(int interrupt);
    void enableReceive();
    void disableReceive();
    bool available();
    void resetAvailable();
    unsigned long getReceivedValue();
    void setReceiveTolerance(int nPercent);
    volatile boolean flag;
    
  private:    
    static void handleInterrupt();
    static bool receiveProtocol(unsigned int changeCount);
    int nReceiverInterrupt;
    int nPulseLength;
    int nRepeatTransmit;
    char nProtocol;
    static int nReceiveTolerance;
    static unsigned long nReceivedValue;
    static unsigned int nReceivedBitlength;
    static unsigned int nReceivedDelay;
    static unsigned int nReceivedProtocol;
    // timings[0] contains sync timing, followed by a number of bits
    static unsigned int timings[RCSWITCH_MAX_CHANGES];  
};
#endif

Вот кусочек кода откуда я хочу получить в скетч состояние переменной Flag

    if (code == 0)
    {
        flag = false;
        return false;
    }
    else if (code != 0)
    {
        flag = true;
        return true;
    }

 

autonomsystems
Offline
Зарегистрирован: 16.12.2018

Добрый день. Вы урезали RCSwitch? Он у вас работает на Tinny?

autonomsystems
Offline
Зарегистрирован: 16.12.2018

Читал на форумах что надо переделывать библиотку RF. Я как раз занимаюсь этой проблемой. У меня скетч реле работающего от пульта отказывается работать на тиньке вот и грешу на RCSwhich либо на milllis.

autonomsystems
Offline
Зарегистрирован: 16.12.2018

Через блокнот создал вашу библиотеку, переписал свой код под нее но увы не работает: Arduino: 1.8.8 (Windows 7), Плата:"Arduino/Genuino Uno"

C:\Users\\Documents\Arduino\libraries\RCSwitch_mini\RCSwitch_mini.cpp: In static member function 'static bool RCSwitch_mini::receiveProtocol(unsigned int)':

C:\Users\\Documents\Arduino\libraries\RCSwitch_mini\RCSwitch_mini.cpp:90:9: error: invalid use of member 'RCSwitch_mini::flag' in static member function

flag = false;

^

In file included from C:\Users\Брагин Егор\Documents\Arduino\libraries\RCSwitch_mini\RCSwitch_mini.cpp:5:0:

C:\Users\\Documents\Arduino\libraries\RCSwitch_mini\RCSwitch_mini.h:29:22: note: declared here

volatile boolean flag;

^

C:\Users\\Documents\Arduino\libraries\RCSwitch_mini\RCSwitch_mini.cpp:95:9: error: invalid use of member 'RCSwitch_mini::flag' in static member function

flag = true;

^

In file included from C:\Users\Брагин Егор\Documents\Arduino\libraries\RCSwitch_mini\RCSwitch_mini.cpp:5:0:

C:\Users\\Documents\Arduino\libraries\RCSwitch_mini\RCSwitch_mini.h:29:22: note: declared here

volatile boolean flag;

^

exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

autonomsystems
Offline
Зарегистрирован: 16.12.2018

Может он идет только компилированным под тиньку?

autonomsystems
Offline
Зарегистрирован: 16.12.2018

Вот нашел ответы на некоторые мои вопросы. Изначально библиотека на тиньке работать не будет.https://arduino.stackovernet.com/ru/q/3621

b707
Онлайн
Зарегистрирован: 26.05.2017

autonomsystems пишет:
Вот нашел ответы на некоторые мои вопросы. Изначально библиотека на тиньке работать не будет.https://arduino.stackovernet.com/ru/q/3621

вам уже на форуме несколько человек это писали, я в том числе - но вы видно не читатель

В процитированной вами ссылке последним ответом - рецепт как заставить RCSwitch работать на тиньке. У меня по этому коду работает.

autonomsystems
Offline
Зарегистрирован: 16.12.2018

Как раз сейчас это и делаю спасибо.

autonomsystems
Offline
Зарегистрирован: 16.12.2018

А я и пишу что как раз работаю над этим. Это вам по видимому хватает времени на програмирование а мне совершенно некогда я уже на работе отвлекаюсь