#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[] = {31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, A0, A1, A2, A3};
int pinosSaida[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 23, 24, 25, 26, 27, 28, 29, 30};
int numVias = 27;
int pinoBotao = A14;
void setup() {
Serial.begin(9600);
pinMode(pinoBotao, INPUT_PULLUP);
// Inicialização do display I2C
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
pinMode(pinosSaida[i], INPUT);
pinMode(pinosEntrada[i], INPUT_PULLUP);
}
}
void loop() {
int errosTotais = 0;
// Aguardar acionamento do botão
while (digitalRead(pinoBotao) == HIGH) {
// Faz nada, espera o botão
}
// Debounce de segurançado botão
delay(50);
// Mostra que o teste começou no LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Testando cabos...");
delay(500);
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);
}
// While para evitar qualquer problema caso o botão fique pressionado por muito tempo
while (digitalRead(pinoBotao) == LOW) {
delay(100);
}
}