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;
}
}