#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int BUTTON_PIN = 12;
const int C1_OUTPUT = 2;
const int C2_OUTPUT = 3;
const int C3_OUTPUT = 4;
const int RELAY_PIN = 11;
const int KNOWN_RESISTOR_1 = 99; // Resistance of the known resistor R1 in ohms
const int KNOWN_RESISTOR_2 = 99; // Resistance of the known resistor R2 in ohms
const int KNOWN_RESISTOR_3 = 99; // Resistance of the known resistor R3 in ohms
enum TestMode { CONTINUITY, RESISTANCE };
TestMode currentMode = CONTINUITY;
unsigned long lastPressTime = 100;
bool buttonPressed = false;
// Function declarations
void testCONTINUITY();
void testRESISTANCE();
void setup() {
pinMode(C1_OUTPUT, OUTPUT);
pinMode(C2_OUTPUT, OUTPUT);
pinMode(C3_OUTPUT, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 30);
display.print("Loading");
display.display();
delay(500);
display.setCursor(0, 30);
display.print("Loading.");
display.display();
delay(500);
display.setCursor(0, 30);
display.print("Loading..");
display.display();
delay(500);
display.setCursor(0, 30);
display.print("Loading...");
display.display();
delay(500);
digitalWrite(RELAY_PIN, HIGH);
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW && !buttonPressed) {
lastPressTime = millis();
buttonPressed = true;
}
if (digitalRead(BUTTON_PIN) == HIGH && buttonPressed) {
unsigned long pressDuration = millis() - lastPressTime;
buttonPressed = false;
if (pressDuration < 500) {
currentMode = (currentMode == CONTINUITY) ? RESISTANCE : CONTINUITY;
}
}
digitalWrite(RELAY_PIN, (currentMode == CONTINUITY) ? LOW : HIGH);
if (currentMode == CONTINUITY) {
testCONTINUITY();
} else {
testRESISTANCE();
}
delay(20);
}
void testCONTINUITY() {
// Continuity1 Test
digitalWrite(C1_OUTPUT, HIGH); //make one end of XLR float to VCC+5
digitalWrite(C2_OUTPUT, LOW);//make one end of XLR short to GND
digitalWrite(C3_OUTPUT, LOW); //make one end of XLR short to GND
delay(1000);
int continuity1_C1 = digitalRead(A0);
int continuity2_C1 = digitalRead(A1);
int continuity3_C1 = digitalRead(A2);
digitalWrite(C1_OUTPUT, LOW); //make one end of XLR short to GND
digitalWrite(C2_OUTPUT, HIGH);//make one end of XLR loat to VCC+5
digitalWrite(C3_OUTPUT, LOW); //make one end of XLR short to GND
delay(1000);
int continuity1_C2 = digitalRead(A0);
int continuity2_C2 = digitalRead(A1);
int continuity3_C2 = digitalRead(A2);
digitalWrite(C1_OUTPUT, LOW); //make one end of XLR short to GND
digitalWrite(C2_OUTPUT, LOW);//make one end of XLR short to GND
digitalWrite(C3_OUTPUT, HIGH); //make one end of XLR float to VCC+5
delay(1000);
int continuity1_C3 = digitalRead(A0);
int continuity2_C3 = digitalRead(A1);
int continuity3_C3 = digitalRead(A2);
display.clearDisplay();
display.setCursor(0, 0);
if (continuity1_C1 == HIGH && continuity1_C2 == LOW && continuity1_C3 == LOW) {
displayContinuityResult("C1", "OK");
} else {
displayContinuityResult("C1", "BAD");
}
delay(20);
display.setCursor(0, 20);
if (continuity2_C1 == LOW && continuity2_C2 == HIGH && continuity2_C3 == LOW) {
displayContinuityResult("C2", "OK");
} else {
displayContinuityResult("C2", "BAD");
}
delay(20);
display.setCursor(0, 40);
if (continuity3_C1 == LOW && continuity3_C2 == LOW && continuity3_C3 == HIGH) {
displayContinuityResult("C3", "OK");
} else {
displayContinuityResult("C3", "BAD");
}
display.display();
delay(20);
}
void testRESISTANCE() {
digitalWrite(C1_OUTPUT, LOW);//make one end of XLR short to GND
digitalWrite(C2_OUTPUT, LOW);//make one end of XLR short to GND
digitalWrite(C3_OUTPUT, LOW);//make one end of XLR short to GND
delay(200);
float resistance_1 = measureResistance(A0, KNOWN_RESISTOR_1);
float resistance_2 = measureResistance(A1, KNOWN_RESISTOR_2);
float resistance_3 = measureResistance(A2, KNOWN_RESISTOR_3);
display.clearDisplay();
display.setCursor(0, 0);
display.print("R1: ");
if (resistance_1 > 300) {
display.print("BAD");
} else {
display.print(resistance_1);
}
display.print(" ");
display.setCursor(0, 20);
display.print("R2: ");
if (resistance_2 > 300) {
display.print("BAD");
} else {
display.print(resistance_2);
}
display.print(" ");
display.setCursor(0, 40);
display.print("R3: ");
if (resistance_3 > 300) {
display.print("BAD");
} else {
display.print(resistance_3);
}
display.print(" ");
display.display();
}
float measureResistance(int pin, int knownResistor) {
int resistanceValue = analogRead(pin);
float voltage = (resistanceValue / 1023.0) * 5.0;
float resistance = (voltage * knownResistor) / (5.0 - voltage);
return resistance;
}
void displayContinuityResult(String circuit, String result) {
display.print(circuit + ": ");
display.println(result);
}