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

问题描述 投票:-2回答:1

我对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;
    }
  }
}
c++ struct arduino embedded
1个回答
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-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()的实现。如果轮询速度不够快,可能需要使用中断。

此外,解决方案可以通过一点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类可以应用于具有类似特征的其他传感器类型,只需实现具有不同update()实现的超类。

© www.soinside.com 2019 - 2024. All rights reserved.