Расширение фотодиодного детектора для поддержки нескольких датчиков - PullRequest
0 голосов
/ 02 ноября 2018

Я довольно новичок в C ++, поэтому я надеялся, что кто-нибудь может помочь мне ответить на мой вопрос. Я строю встроенную систему, используя Arduino.

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

Следующий код - моя попытка реализовать это для одного фотодиодного датчика ( Примечание: Я еще не пытался его скомпилировать, могут быть некоторые ошибки). Однако как я могу расширить это для поддержки нескольких датчиков.

Вот код:

struct DiodeResult {
  bool diodePassed;
  unsigned long timeOfSet;
}


void loop() {
  static DiodeResult diodeResult;

  bool diodePassed = readDiode();
  if (diodePassed) {
    diodeResult.diodePassed = true;
    diodeResult.timeOfSet = millis();
  } else {
    if ((millis() - diodeResult.timeOfSet) > (5*1000) {
      diodeResult.diodePassed = false;
    }
  }
}

1 Ответ

0 голосов
/ 02 ноября 2018

Ваше существующее решение может быть расширено для обработки нескольких фотодиодов, просто используя массив DiodeResult экземпляров:

void loop()
{
    static DiodeResult diodeResult[DIODE_COUNT];

    for( int i = 0; i < DIODE_COUNT; i++ )
    {
        bool diodePassed = readDiode( i ) ;

        if( diodePassed )
        {
            diodeResult[i].diodePassed = true;
            diodeResult[i].timeOfSet = millis();
        }
        else
        {
            if( (millis() - diodeResult[i].timeOfSet) > (5 * 1000)
            {
                diodeResult[i].diodePassed = false;
            }
        }
    }
}

Или, может быть, больше "Arduino-like":

void loop()
{
    static DiodeResult diodeResult[DIODE_COUNT];
    static int i= 0 ;

    bool diodePassed = readDiode( i ) ;

    if( diodePassed )
    {
        diodeResult[i].diodePassed = true;
        diodeResult[i].timeOfSet = millis();
    }
    else
    {
        if( (millis() - diodeResult[i].timeOfSet) > (5 * 1000)
        {
            diodeResult[i].diodePassed = false;
        }
    }

    // Next diode on next loop iteration
    i = (i + 1) % DIODE_COUNT ; 
}

Однако это зависит от состояния фотодиода, которое остается активным, по крайней мере, столько, сколько требуется для итерации всех десяти датчиков. Это может иметь место, но это сильно зависит от вашего приложения и, возможно, от реализации readDiode(). Это может быть необходимо, если опрос недостаточно быстр, чтобы использовать прерывания.

Более того, решение может быть улучшено небольшим ООП:

class cMonoStable
{
    public : 
        cMonoStable( unsigned long period_ms ) : m_time_ms(time_ms)
        {
        }

        void trigger()
        {
            m_start_ms = millis() ;
        }

        bool getState()
        {
            return m_start_ms - millis() < m_time_ms ;
        }

    private :
        unsigned long m_time_ms;
        unsigned long m_start_ms
};

class cPhotoDiodeTriggeredMonostable : public cMonoStable
{
    public :
        cPhotoDiodeTriggeredMonostable( unsigned long period_ms, int diode = 0 ) : cMonoStable( period_ms ) : m_diode(diode)
        {
        }

        void update()
        {
            if( readDiode( m_diode ) )
            { 
                trigger() ;
            }
        }

    private:
        int m_diode ;
} ;

static const int DIODE_COUNT = 10 ;
static cPhotoDiodeTriggeredMonostable* photo_diode_state[DIODE_COUNT];

void setup()
{
    for( int i = 0; i < DIODE_COUNT; i++ )
    {
        photo_diode_state[i] = new cPhotoDiodeTriggeredMonostable( 5000, i ) ;
    }
}

void loop()
{
    static int i = 0 ;
    photo_diode_state[i]->update() ;

    if( photo_diode_state[i].getState() )
    {
        // do whatever - state remains true for 5 seconds after diode was last active.
    }
}

Это выглядит немного затянуто, но не то, насколько просты отдельные элементы, и класс cMonoStable можно применять к датчикам других типов с аналогичными характеристиками, просто реализуя суперкласс с другой реализацией update() .

...