Hey everyone, sorry for the delay. Below is my current code. I've implemented an RGB LED to display my status. I had trouble implementing the green LED logically. And I still dont have the port expanders to do what I originally wanted to do.
#include "Wire.h"
#include "Adafruit_MCP23017.h"
enum {PASS, FAIL_NOTCONNECTED, FAIL_WRONGCONNECTED, FAIL_SHORTENED };
// pin numbers for use at begin and end of cable
const int redLED = 9; //bad status
const int greenLED = 10; //good status
const int blueLED = 11; //standby status
const int m1a0 = A0;
const byte pinsCableBegin[]= { 2, 3, 4, 5, 6, 7};//, 8, 9, 10, 11, 12, 13
const byte pinsCableEnd[] = {A0,A1,A2,A3,A4,A5};//,m1a0,A1, A2, A3, A4, A5, 21, 22, 23, 24,25,26};
const byte NUMCABLES=sizeof(pinsCableBegin); //Stores quantity within array
Adafruit_MCP23017 mcp;
//Adafruit_MCP23017 mcp1;
//Adafruit_MCP23017 mcp2;
void setup() {
Serial.begin(9600);
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(blueLED, OUTPUT);
mcp.begin();
Wire.begin();
Wire.beginTransmission(0x20);
Wire.write(0x00); //GPIOA
Wire.write(0x00); //Sets all of bank A as outputs
if (sizeof(pinsCableBegin)!=sizeof(pinsCableEnd))
{
Serial.println("Pin configuration Error.");
Serial.println("Fix declaration of pinsCableBegin[] and pinsCableEnd[] arrays!");
while(1); // error stop with endless loop
}
//standbyStatus();
Serial.println();
Serial.println("################################################");
Serial.println("# CABLE TESTER #");
Serial.println("################################################");
Serial.println();
}
void allPinsInputHigh()
{ // set all pins to INPUT_PULLUP in a for-loop
for (byte i=0;i<NUMCABLES;i++)
{
pinMode(pinsCableBegin[i],INPUT_PULLUP); //enables internal 20k pullup resistors
pinMode(pinsCableEnd[i],INPUT_PULLUP);
//mcp.pinMode(pinsCableEnd[i], INPUT); //
//mcp.pullUp(pinsCableEnd[i], HIGH); //
}
}
void DoOneTest()
{
byte result;
Serial.println();
Serial.println("### TEST ###");
for (byte i=0;i<NUMCABLES;i++) // test each pin
{
result= PASS; // initially there is no error found, assume PASS
allPinsInputHigh();
// first test is for continuity and OUTPUT/HIGH
pinMode(pinsCableBegin[i], OUTPUT);
if (digitalRead(pinsCableEnd[i])!=HIGH)
{
bitSet(result,FAIL_NOTCONNECTED);
badStatus();
}
// then check for continuity and OUTPUT/LOW
digitalWrite(pinsCableBegin[i], LOW);
if (digitalRead(pinsCableEnd[i])!=LOW)
{
bitSet(result,FAIL_NOTCONNECTED);
badStatus();
}
//goodStatus();
// next test: check for wrong connections to other pins
for (byte j=0;j<NUMCABLES;j++)
{
if (j!=i && digitalRead(pinsCableEnd[j])==LOW)
{
bitSet(result, FAIL_WRONGCONNECTED);
badStatus();
}
}
// final test for short circuit against other pins
for (byte j=0;j<NUMCABLES;j++)
{
if (j!=i && digitalRead(pinsCableBegin[j])==LOW)
{
bitSet(result, FAIL_SHORTENED);
badStatus();
}
}
Serial.print("Line ");
Serial.print(i+1);
if (result== PASS) Serial.print(" PASS");
else badStatus();//Serial.print(" FAIL");
if (bitRead(result,FAIL_NOTCONNECTED)) //badStatus();
if (bitRead(result,FAIL_NOTCONNECTED)) Serial.print(" FAIL BREAK");
if (bitRead(result,FAIL_WRONGCONNECTED)) badStatus();
if (bitRead(result,FAIL_WRONGCONNECTED)) Serial.print(" FAIL WRONG");
//if (bitRead(result,FAIL_SHORTENED)) Serial.print(" SHORT");
Serial.println();
}
Serial.println("Test Complete.");
Serial.println();
}
void standbyStatus()
{
digitalWrite(redLED, LOW);
digitalWrite(greenLED, LOW);
digitalWrite(blueLED, HIGH);
//delay(1000);
//digitalWrite(redLED, LOW);
//digitalWrite(greenLED, LOW);
//digitalWrite(blueLED, LOW);
//delay(100);
}
void badStatus()
{
digitalWrite(redLED, HIGH);
digitalWrite(greenLED, LOW);
digitalWrite(blueLED, LOW);
}
void goodStatus()
{
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
digitalWrite(blueLED, LOW);
}
void loop()
{
standbyStatus();
//showSpectrum();
if (Serial.available())
{
//standbyStatus();
DoOneTest();
//delay(3000);
while (Serial.available()) Serial.read(); // clear Serial input buffer
}
}