#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Endereço do oled & define também as 20 colunas e 4 linhas
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Pinos de teste do cabo
int pinosEntrada[] = {22, 24, 26, 28, 30};
int pinosSaida[] = {53, 51, 49, 47, 45};
int numVias = 5;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Iniciando Teste...");
delay(2000);
for (int i = 0; i < numVias; i++) {
// MUDANÇA 1: Pinos de saída repousam como INPUT (Alta impedância)
// Isso evita curto-circuito lógico se os fios estiverem transados/fechando curto
pinMode(pinosSaida[i], INPUT);
pinMode(pinosEntrada[i], INPUT_PULLUP);
}
}
void loop() {
int errosTotais = 0;
for (int i = 0; i < numVias; i++) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Testando Via ");
lcd.print(i + 1);
// MUDANÇA 2: Transforma apenas o pino da vez em OUTPUT e injeta o sinal LOW
pinMode(pinosSaida[i], OUTPUT);
digitalWrite(pinosSaida[i], LOW);
delay(10);
// Faz a leitura da via esperada
int leituraCorreta = digitalRead(pinosEntrada[i]);
bool detectouOutraVia = false;
int viasAfetadas[numVias];
int numAfetadas = 0;
// Varre todas as outras vias para ver se o sinal vazou ou cruzou
for (int j = 0; j < numVias; j++) {
if (i == j) continue;
if (digitalRead(pinosEntrada[j]) == LOW) {
detectouOutraVia = true;
viasAfetadas[numAfetadas] = j;
numAfetadas++;
}
}
lcd.setCursor(0, 1);
if (leituraCorreta == HIGH && !detectouOutraVia) {
lcd.print("Status: ABERTA");
errosTotais++;
}
else if (leituraCorreta == LOW && !detectouOutraVia) {
lcd.print("Status: OK");
}
else if (leituraCorreta == LOW && detectouOutraVia) {
lcd.print("Status: CURTO");
errosTotais++;
lcd.setCursor(0, 2);
lcd.print("Com a(s) Via(s): ");
lcd.setCursor(0, 3);
for(int k=0; k < numAfetadas; k++) {
lcd.print(viasAfetadas[k] + 1);
lcd.print(" ");
}
}
else if (leituraCorreta == HIGH && detectouOutraVia) {
// Aqui aparecerá a via INVERTIDA / TRANSADA
lcd.print("Status: INVERTIDA");
errosTotais++;
lcd.setCursor(0, 2);
lcd.print("Sinal na Via(s): ");
lcd.setCursor(0, 3);
for(int k=0; k < numAfetadas; k++) {
lcd.print(viasAfetadas[k] + 1);
lcd.print(" ");
}
}
// MUDANÇA 3: Transforma a saída de volta em INPUT (Alta impedância)
// antes de testar o próximo fio.
pinMode(pinosSaida[i], INPUT);
delay(2500);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Teste Concluido!");
lcd.setCursor(0, 1);
if (errosTotais == 0) {
lcd.print("CABO 100% OK!");
} else {
lcd.print("Atencao: CABO RUIM");
lcd.setCursor(0, 2);
lcd.print("Total de Erros: ");
lcd.print(errosTotais);
}
delay(5000);
}