Checked and checked, but something's not right

HI guys,

I have some code that I’m using to read three voltages which fluctuate. I have marked them Red Blue And green as per the wire colour.

MY project is to read the voltages and determine if they are high, medium or low. To do this I first take a bunch of readings and average them out. Then I assign a 0, 1 or 2 to a value based on the voltage range. I then run it through a rolling array and check if I have had the same result 3 times in a row. If so I set the final trigger to the appropriate 0,1 or 2 value.

It’s working fine for the Blue and Green threads, but I’m getting almost inverted results on the Red channel, even though they are identical in code!

I’ve been monitoring the out put and it’s picking up all the right values, but just not displaying the right result. Please help me! It’s driving me nuts and I bet you anything it’s something blindingly stupid!

Here is the program:

const int numReadings = 500;

// VGA source pins
int redsignal = A0;
int greensignal = A1;
int bluesignal = A2;

//LED pins
int redled = 3;
int greenled = 5;
int blueled = 6;

//Ternary outputs
int redout = 0;
int greenout = 0;
int blueout = 0;

int redstable[3];
int greenstable[3];
int bluestable[3];

int redtrigger = 0;
int greentrigger = 0;
int bluetrigger = 0;


void setup()
{
  // initialize serial communication with computer:
  Serial.begin(9600);                   
pinMode(redled, OUTPUT);
pinMode(greenled, OUTPUT);
pinMode(blueled, OUTPUT);
}

void loop() {
  
long blueread = 0;                  // the running total
long redread = 0;                  // the running total
long greenread = 0;                  // the running total
  
  // Take average of red blue and green                   
for (int count = 0; count < numReadings; count++) {
  blueread += analogRead(bluesignal);
  greenread += analogRead(greensignal);
  redread += analogRead(redsignal);
}
blueread /= numReadings;
redread /= numReadings;
greenread /= numReadings;

// assign "out" to 0, 1 or 2 depe

if (blueread <= 50) blueout = 0;
if (blueread > 50 && blueread < 150) blueout = 1;
if (blueread >= 150) blueout = 2;

if (redread <= 50) redout = 0;
if (redread > 50 && redread < 150) redout = 1;
if (redread >= 150) redout = 2;

if (greenread <= 50) greenout = 0;
if (greenread > 50 && greenread < 150) greenout = 1;
if (greenread >= 150) greenout = 2;

// send readings into stability array
redstable[3] = redstable[2];
redstable[2] = redstable[1];
redstable[1] = redout;

// if 3 reading in a row are the same then set trigger to eaqual out
if (redstable[1] == redstable[2] && redstable[2] == redstable[3]) redtrigger = redout;

// repeat for other inputs
greenstable[3] = greenstable[2];
greenstable[2] = greenstable[1];
greenstable[1] = greenout;
if (greenstable[1] == greenstable[2] && greenstable[2] == greenstable[3]) greentrigger = greenout;

bluestable[3] = bluestable[2];
bluestable[2] = bluestable[1];
bluestable[1] = blueout;
if (bluestable[1] == bluestable[2] && bluestable[2] == bluestable[3]) bluetrigger = blueout;

   // send it to the computer as ASCII digits
  Serial.print(redtrigger);
     Serial.print("        ");
  Serial.print(greentrigger); 
   Serial.print("        ");
  Serial.print(bluetrigger); 
  
Serial.print("                    ");  

Serial.print(redread);
 Serial.print("        ");  
Serial.print(greenread);     
   Serial.print("        ");
Serial.println(blueread); 
 
  //Send output to LED.
  analogWrite(redled, redread);
  analogWrite(blueled, blueread);
  analogWrite(greenled, greenread);

}

And here is the output - row 1,2 and 3 are the triggers which should read 0 if under 50, 1 between 50 and 150 and 2 for anything above 150 (but only after three of the same number in a row.
The next three columns are the voltage readings, which match correctly in the 2nd and third rows.

Red  Grn      Blue                Red       Grn     Blue
0        0        0                    197        0        0
0        0        0                    199        0        0
0        0        0                    200        0        0
0        0        0                    197        0        0
0        0        0                    40        0        156
0        0        0                    0        0        198
2        0        2                    0        0        195
2        0        2                    0        0        196
2        0        2                    0        0        199
2        0        2                    0        0        200
2        0        2                    0        0        197
2        0        2                    0        0        198
2        0        2                    0        0        197
2        0        2                    0        0        195
2        0        2                    0        0        196
2        0        2                    0        0        197
2        0        2                    0        0        195
2        0        2                    0        0        196
2        0        2                    0        0        196
2        0        2                    0        0        200
2        0        2                    0        0        195
2        0        2                    0        0        196
2        0        2                    0        0        197
2        0        2                    0        142        55
2        0        2                    0        202        0
1        0        2                    0        201        0
0        2        0                    0        199        0
0        2        0                    0        202        0
0        2        0                    0        198        0
0        2        0                    0        199        0
0        2        0                    0        197        0
0        2        0                    0        196        0
0        2        0                    0        200        0
0        2        0                    0        197        0
0        2        0                    0        200        0
0        2        0                    0        198        0
0        2        0                    0        197        0
0        2        0                    0        200        0
0        2        0                    0        196        0
0        2        0                    0        200        0
0        2        0                    0        199        0
0        2        0                    0        198        0
0        2        0                    55        199        0
0        2        0                    199        201        0
0        2        0                    199        198        0
0        2        0                    198        200        0
0        2        0                    201        201        0
0        2        0                    198        199        0
0        2        0                    201        199        0
0        2        0                    199        201        0
0        2        0                    202        202        0
0        2        0                    200        199        0
0        2        0                    199        198        0
0        2        0                    199        200        0
0        2        0                    199        198        0
0        2        0                    202        201        0
0        2        0                    199        202        0
0        2        0                    200        199        0
0        2        0                    199        202        0
0        2        0                    202        200        0
0        2        0                    200        201        0
0        2        0                    176        161        0
0        2        0                    83        0        0
0        2        0                    82        0        0
0        0        0                    82        0        0
0        0        0                    82        0        0
0        0        0                    81        0        0
0        0        0                    83        0        0
0        0        0                    82        0        0
0        0        0                    83        0        0
0        0        0                    84        0        0
0        0        0                    83        0        0
0        0        0                    82        0        0
0        0        0                    83        0        0
0        0        0                    83        0        0
0        0        0                    82        0        0
0        0        0                    84        0        0
0        0        0                    83        0        0
0        0        0                    82        0        0
0        0        0                    82        0        0
0        0        0                    83        0        0
0        0        0                    165        0        0

Found it. The three entries in a 3-element array are numbered 0, 1, and 2; not 1, 2, and 3. You are running off the end of arrays.

Change to something like this:

// send readings into stability array
redstable[2] = redstable[1];
redstable[1] = redstable[0];
redstable[0] = redout;

// if 3 reading in a row are the same then set trigger to eaqual out
if (redstable[0] == redstable[1] && redstable[1] == redstable[2]) redtrigger = redout;

Thanks man! Can you tell this is my first project? You got it working for me! Hazzah!