#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Endereço do oled & define as 20 colunas e 4 linhas
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Pinos de teste do cabo
int pinosEntrada[] = {22, 24, 26, 28, 30, A0};
int pinosSaida[] = {53, 51, 49, 47, 45, A8};
int numVias = 6;
int pinoBotao = A14;
void setup() {
Serial.begin(9600);
pinMode(pinoBotao, INPUT_PULLUP);
// Inicialização do seu display I2C (mantenha os comandos da sua biblioteca)
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Aparelho Pronto.");
lcd.setCursor(0, 1);
lcd.print("Aperte para testar");
for (int i = 0; i < numVias; i++) {
// Pinos de saída repousam como INPUT (Alta Impedância / Chave Aberta)
pinMode(pinosSaida[i], INPUT);
// Pinos de entrada ativam o resistor interno de 20K ohms (Aguardando os 0V)
pinMode(pinosEntrada[i], INPUT_PULLUP);
}
}
void loop() {
int errosTotais = 0;
// Enquanto o botão NÃO for apertado, ele continuará lendo HIGH (5V).
// O comando "while" cria um laço infinito que prende o Arduino aqui.
while (digitalRead(pinoBotao) == HIGH) {
// Não faz nada, apenas fica travado esperando o 0V (LOW) chegar do botão
}
// O botão foi apertado! O sinal caiu para LOW.
delay(50); // Filtro anti-ruído (Debounce) de 50 milissegundos para estabilizar o contato
// Avisa que o teste começou
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Testando cabos...");
delay(500); // Pausa rápida só para o usuário ler a tela
for (int i = 0; i < numVias; i++) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Testando Via ");
lcd.print(i + 1);
// 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;
// Passa por 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++;
delay(3000);
}
else if (leituraCorreta == LOW && !detectouOutraVia) {
lcd.print("Status: OK");
delay(1000);
}
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(" ");
}
delay(3000);
}
else if (leituraCorreta == HIGH && detectouOutraVia) {
// Aqui aparecerá a via INVERTIDA
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(" ");
}
delay(4000);
}
// Transforma a saída de volta em INPUT
// antes de testar o próximo fio.
pinMode(pinosSaida[i], INPUT);
}
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);
}
// TRAVA DE SEGURANÇA (Obrigatório para botões)
// Como o processador é muito rápido, se você apertar o botão por meio segundo,
// ele faria o teste e, se você ainda estivesse com o dedo no botão, ele faria
// de novo. Esse laço prende o código até você SOLTAR o botão (voltar para HIGH).
while (digitalRead(pinoBotao) == LOW) {
delay(10); // Apenas aguarda o usuário tirar o dedo do botão
}
}