Dust Detector 3 Sketch
Page Origin


07/22/2024Page Origin

/***********************************************************************
* Arduino Nano "Sketch" for DustDetector using Opto Eye (Safety Beam)
* RESPONDS TO DUST DEPTH QUERY WITH OK or FULL.
***********************************************************************/


//********************** DEFINES **************************************
#define  DUSTIN     9                                // E18-D80NK OUTPUT PIN
#define  NL         10                                      // NEW LINE CHAR
#define  EYE        4                                  // OPTO EYE INPUT PIN
#define  EYELIM     0.5                                // OPTO EYE LOW LIMIT
#define  EYETIM     500                // TIME BETWEEN OPTO EYE CHECKS IN MS
#define  EYECNTMAX  10                                // MAX NBR EYEOK FALSE
typedef unsigned long ulong;


//********************** VARIABLES ***************************************
bool Rs232 = false, EyeOk;                                     // DATA FLAGS
int  RsNdx =0, DustIn =0;
int  EyeIn =0, EyeCnt =0;
char RsBuf[32];
ulong  ChkEye =0;


//********************** PROTOTYPES *************************************
void serialEvent();
void sndDust();
void getEye();


/*F**********************************************************************
*
**********************************************************************/
void 
setup() 
{
    Serial.begin( 9600 );
    pinMode( DUSTIN, INPUT_PULLUP);              // SETS ECHOPIN AS AN INPUT
    pinMode( EYE, INPUT );
	  ChkEye = millis() + EYETIM;
    delay( 2 );                                                 // WAIT 2 MS
}

/*F**********************************************************************
* Loop screams around
**********************************************************************/
void 
loop() 
{
	char   chrIn;
	short  ndx;
	ulong  now;

	if( Rs232 )
    {
        for( ndx =0; chrIn = RsBuf[ndx]; ndx++ )
        {                                   // PROCESS CHARACTERS IN RDDATA[]
            switch( chrIn )
            {
                case  'D':                                  // GET DUST DEPTH
                    sndDust();
                    break;
//				case  'P':                         // GET PLENUM PRESSURE
//					getPress();
//					break;
                case NL:
                default:
                  getEye();
                  Serial.print("Dust Stat: ");
                  Serial.print( DustIn );
                  Serial.print(", EyeStat: ");
                  Serial.println( EyeIn );
                    break;
            }
            Rs232 = false;
        }

    }
	now = millis();
	if( ChkEye < now )
	{
		getEye();
		ChkEye = millis() + EYETIM;
	}
	delay( 50 );                                              // WAIT 50MS
}

/*F**********************************************************************
* READ DUST SENSOR AND REPORT TO DUSTAUTO SYSTEM
**********************************************************************/
void 
sndDust() 
{
    int    dist, val;

//    val = analogRead( DUSTIN );     // NOT USING E18-D80NK 
    if( /*(val == LOW) ||*/ (EyeOk == false) )
        Serial.println( (String)"FULL");//SEND FULL TO DUSTAUTOMATION SYSTEM
    else
        Serial.println( (String)"OK" );  // SEND OK TO DUSTAUTOMATION SYSTEM
    Rs232 = false;                                        // RESET DATA FLAG
    memset( RsBuf, 0, sizeof( RsBuf ));
    RsNdx = 0;
}

/*F******************************************************************
* RS-232 INTERRUPT SERVICE ROUTINE, DO NOT TARRY HERE
**********************************************************************/
void
serialEvent()
{                                                    // RUNS AFTER EACH LOOP
    char   chrIn;

//  memset( RsBuf, 0, sizeof( RsBuf ));
//  RsNdx = 0;
    while( Serial.available())                 // HDW SERIAL CHARS AVAIL
    {
        chrIn = (char)Serial.read();                       // GET NEW CHAR
        RsBuf[RsNdx++] = chrIn;               // ADD NEW CHAR To RsBuf[]
        if( chrIn == NL )
        {
            Rs232 = true;                     // SET FLAG FOR MAIN LOOP
            return;
        }
    }
}

/*F*********************************************************************
*
***********************************************************************/
void
getEye()
{
	EyeIn = pulseIn( EYE, LOW, 8000 );                      // TIMEOUT IN US
	if( EyeIn < EYELIM )
	{                                                  // NO PULSES DETECTED
		if( ++EyeCnt > EYECNTMAX )
			EyeOk = false;
	}
	else
	{                                         // PULSES DETECTED, BEAM IS OK
		EyeOk = true;
		EyeCnt =0;
	}
}