扩展光电二极管检测器以支持多个传感器

时间:2018-11-02 10:32:33

标签: c++ struct arduino embedded

我对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 :(得分:0)

只需使用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的”:

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()的实现。如果轮询的速度不足以使用中断,则可能有必要。

此外,该解决方案可以通过一些OOP加以改进:

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类可以应用于具有类似特征的其他传感器类型,只需实现一个具有不同{{ 1}}实施。