#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Estrutura para armazenar os dados de cada tubo conforme a norma
struct TuboNorma {
const char* nps; // Diâmetro Nominal (ex: "1/2\"", "2\"")
float odAlvo; // Diâmetro Externo Comercial (em mm)
float tolNegativa; // Tolerância para menos (em mm)
float tolPositiva; // Tolerância para mais (em mm)
};
// Tabela ASME B36.10M + Tolerâncias ASTM A530 (Faixa de 1/2" a 6")
TuboNorma tabelaTubos[] = {
{"1/2\"", 21.3, 0.79, 0.79},
{"3/4\"", 26.7, 0.79, 0.79},
{"1\"", 33.4, 0.79, 0.79},
{"1 1/4\"", 42.2, 0.79, 0.79},
{"1 1/2\"", 48.3, 0.79, 0.79},
{"2\"", 60.3, 0.79, 0.79},
{"2 1/2\"", 73.0, 0.79, 0.79},
{"3\"", 88.9, 0.79, 0.79},
{"4\"", 114.3, 0.79, 0.79},
{"6\"", 168.3, 0.79, 1.58} // 6" possui tolerância positiva maior
};
const int totalTubos = sizeof(tabelaTubos) / sizeof(tabelaTubos[0]);
void setup() {
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Erro no OLED");
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 10);
display.println("Sistema de Inspecao");
display.setCursor(0, 25);
display.println("Norma: ASME B36.10");
display.display();
delay(3000);
aguardandoLeitura();
}
void loop() {
if (Serial.available()) {
float diametroLido = Serial.parseFloat();
// Limpa o buffer do Serial (evita ler o '\n' ou '\r' como zero no próximo loop)
while(Serial.available() > 0) {
Serial.read();
}
// Ignora leituras acidentais de valor zero
if (diametroLido <= 0) return;
Serial.print("\nValor medido: ");
Serial.print(diametroLido);
Serial.println(" mm");
// Mostra o valor recebido na tela antes da análise
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Medicao recebida:");
display.setTextSize(2);
display.setCursor(0, 20);
display.print(diametroLido, 1);
display.println(" mm");
display.display();
delay(2000);
// Variáveis de controle para a busca inteligente
bool tuboEncontrado = false;
int indiceTubo = -1;
float menorDiferenca = 9999.0;
// 1º Passo: Descobrir qual é o tubo nominal mais próximo por aproximação
for (int i = 0; i < totalTubos; i++) {
float diferenca = abs(diametroLido - tabelaTubos[i].odAlvo);
if (diferenca < menorDiferenca) {
menorDiferenca = diferenca;
indiceTubo = i;
}
}
// 2º Passo: Validar se o tubo mais próximo está dentro da tolerância da norma
if (indiceTubo != -1) {
TuboNorma tubo = tabelaTubos[indiceTubo];
float limiteMin = tubo.odAlvo - tubo.tolNegativa;
float limiteMax = tubo.odAlvo + tubo.tolPositiva;
display.clearDisplay();
// Envia os dados do tubo identificado para o Serial Monitor
Serial.print("Tubo Identificado: NPS ");
Serial.println(tubo.nps);
Serial.print("Limites da Norma: ");
Serial.print(limiteMin);
Serial.print(" mm a ");
Serial.print(limiteMax);
Serial.println(" mm");
if (diametroLido >= limiteMin && diametroLido <= limiteMax) {
// DENTRO DA NORMA
Serial.println("Resultado: APROVADO (Dentro da norma)");
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Tubo: NPS ");
display.println(tubo.nps);
display.setCursor(0, 15);
display.print("Alvo: "); display.print(tubo.odAlvo, 1); display.println(" mm");
display.setTextSize(2);
display.setCursor(0, 35);
display.println("APROVADO");
} else {
// FORA DA NORMA (Excedeu a tolerância do tubo mais próximo)
Serial.println("Resultado: REJEITADO (Fora da norma)");
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Tubo Provavel: ");
display.println(tubo.nps);
display.setCursor(0, 15);
display.print("Max: "); display.print(limiteMax, 1);
display.print(" Min: "); display.println(limiteMin, 1);
display.setTextSize(2);
display.setCursor(0, 35);
display.println("REJEITADO");
}
display.display();
delay(4000);
}
aguardandoLeitura();
}
}
void aguardandoLeitura() {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 10);
display.println("Aguardando medicao...");
display.setCursor(0, 30);
display.println("Insira o diametro");
display.setCursor(0, 45);
display.println("no Monitor Serial (mm)");
display.display();
}