Ваше существующее решение может быть расширено для обработки нескольких фотодиодов, просто используя массив 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()
.