#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 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);
}
}