I am writing some simple code to assess whether a sensor is outputting a signal correctly or not. The sensor outputs a PWM signal and should output a pulse every 700 milliseconds +/- 30% (i.e between 580 & 906). If the period between pulses is within the 580 - 906 limits, a green LED should turn on and a yellow LED should go off. If the period is out with these limits a red LED should go on and the yellow LED should go off.
The code calculates the period between two pulses correctly using the first section of code (I'm getting 725 milliseconds returned on the serial monitor). However, for some reason the "if" statements that decide which while loop to go into do not work, as both conditions are met simultaneously, i.e both sensorFailed and sensorPassed become 100.
I don't understand how both of these conditions can be met at the same time especially when I know that the period is being calculated accurately. Can anyone see a bug in my code, that I cannot see??
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////THIS CODE TESTS THE SENSORS FOR 2 FAILURE TYPES, CONSTANT HIGH VOLTAGE AND CONSTANT LOW VOLTAGE (I.E CONSTANT 0V OR CONSTANT 3V)///////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int highTime;
unsigned long startTimer = 0;
int startTest = 0;
unsigned long timer = 0;
int arrayIndex = 0;
int highTimes[10];
static byte sensorPassed = 0;
static byte sensorFailed = 0;
int sensorSignal = 0;
void setup() {
Serial.begin(115200);
pinMode(48, OUTPUT); //Broken sensor LED pin (Red)
pinMode(52, OUTPUT); //Good sensor LED pin (Green)
pinMode(51, OUTPUT); //Started testing pin (Yellow)
}
void loop()
{
sensorSignal = analogRead(A0); //Read analog sensor output
digitalWrite(51, HIGH); //yellow LED on, to indicate that testing has started
//delay(10000);
/*Serial.print(sensorSignal);
Serial.println();*/
if(sensorSignal < 50)
{
sensorFailed = 100;
}
//--------------------------------------------------------------------------THIS LOOP TESTS IF THE SENSOR IS CONSTANTLY OUTPUTTING A HIGH SIGNAL (I.E CONSTANT HIGH SIGNAL TEST)---------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if(sensorSignal < 800 && startTest == 0)
{
startTest = 1; //start test = 1 to start next if loop
}
if(sensorSignal > 800 && startTest == 1)
{
startTimer = millis();
startTest = 2; //start test = 2 to start next if loop
}
if(sensorSignal < 800 && startTest == 2)
{
startTest = 3; //start test = 3 to start next if loop
}
if(sensorSignal > 800 && startTest == 3)
{
startTest = 0;
timer = millis();
highTime = timer - startTimer; //time recorded at end of second pulse - end of second pulse
highTimes[arrayIndex] = sensorFailed; // !!!!!!USED TO COLLECT DATA, DOES NOT PERFORM ANY FUCNTION IN THE CODE!!!!!
arrayIndex = arrayIndex + 1; // !!!!!!USED TO COLLECT DATA, DOES NOT PERFORM ANY FUCNTION IN THE CODE!!!!!
}
if (arrayIndex > 10)//MAX ARRAY SIZE = 1023 // !!!!!!USED TO COLLECT DATA, DOES NOT PERFORM ANY FUCNTION IN THE CODE!!!!!
{
for (int z = 0; z < 10; z = z + 1)
{
Serial.println(highTimes[z]);
}
arrayIndex = 0;
}
if(highTime > 580 && highTime < 906) // assess whether period is within 700 milliseconds +/- 30% limits
{
sensorPassed = 100;
}
if (highTime < 580 || highTime > 906 && sensorPassed != 100) // assess whether period is outwith 700 milliseconds +/- 30% limits
{
sensorFailed = 100;
}
while(sensorFailed = 100)
{
digitalWrite(52 ,HIGH); //turn red LED on to show the sensor is broken
digitalWrite(51, LOW); //turn yellow LED low to show testing has finished
}
while(sensorPassed = 100)
{
digitalWrite(48 ,HIGH); //turn green LED on to show the sensor is good
digitalWrite(51, LOW); //turn yellow LED low to show testing has finished
}
}