#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MFRC522.h>
// ==========================================
// CONFIGURAÇÃO DE PINOS (MASTER LAYOUT V2)
// ==========================================
// Sensor Ultrassônico (Echo movido para D35 devido ao SPI)
#define PIN_TRIGGER 4
#define PIN_ECHO 35
// Bombas (Movidas para D16/D17 devido ao SPI)
#define PIN_BOMBA_1 16 // Encher
#define PIN_BOMBA_2 17 // Esvaziar
// Barramento SPI para RFID
#define RF_SS_PIN 5 // SDA no módulo RFID
#define RF_RST_PIN 2 // RST no módulo RFID
// SCK = 18, MISO = 19, MOSI = 23 (Padrão ESP32)
// LED RGB (Cátodo Comum)
#define PIN_LED_R 27
#define PIN_LED_G 26
#define PIN_LED_B 25
// Botões (Todos com Pull-up interno, ligar ao GND)
#define PIN_BTN_1 13
#define PIN_BTN_2 32
#define PIN_BTN_3 33
#define PIN_EMERG 14 // Botão de Emergência
// ==========================================
// INSTÂNCIAS E CONSTANTES
// ==========================================
LiquidCrystal_I2C lcd(0x27, 16, 2);
MFRC522 mfrc522(RF_SS_PIN, RF_RST_PIN);
const int TEMPO_ATIVO = 3000;
const int TEMPO_PAUSA = 1500;
// ==========================================
// FUNÇÕES AUXILIARES
// ==========================================
void mostrarStatus(String linha1, String linha2 = "") {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(linha1);
lcd.setCursor(0, 1);
lcd.print(linha2);
Serial.println(">>> " + linha1 + " | " + linha2);
}
float lerDistancia() {
digitalWrite(PIN_TRIGGER, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIGGER, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIGGER, LOW);
long duracao = pulseIn(PIN_ECHO, HIGH, 30000);
return (duracao * 0.0343) / 2;
}
void resetPerifericos() {
digitalWrite(PIN_BOMBA_1, LOW);
digitalWrite(PIN_BOMBA_2, LOW);
digitalWrite(PIN_LED_R, LOW);
digitalWrite(PIN_LED_G, LOW);
digitalWrite(PIN_LED_B, LOW);
}
// ==========================================
// SETUP
// ==========================================
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
SPI.begin(); // Inicia barramento SPI
mfrc522.PCD_Init(); // Inicia módulo MFRC522
lcd.init();
lcd.backlight();
mostrarStatus("TESTE INTEGRADO", "HARDWARE V2.0");
delay(2000);
// Saídas
pinMode(PIN_TRIGGER, OUTPUT);
pinMode(PIN_BOMBA_1, OUTPUT);
pinMode(PIN_BOMBA_2, OUTPUT);
pinMode(PIN_LED_R, OUTPUT);
pinMode(PIN_LED_G, OUTPUT);
pinMode(PIN_LED_B, OUTPUT);
// Entradas (D35 não tem pull-up, mas sensor fornece sinal)
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_BTN_1, INPUT_PULLUP);
pinMode(PIN_BTN_2, INPUT_PULLUP);
pinMode(PIN_BTN_3, INPUT_PULLUP);
pinMode(PIN_EMERG, INPUT_PULLUP);
resetPerifericos();
}
// ==========================================
// LOOP DE TESTE SEQUENCIAL
// ==========================================
void loop() {
// 1. SENSOR & LCD
float dist = lerDistancia();
mostrarStatus("1. SENSOR & LCD", "DIST: " + String(dist) + " cm");
delay(TEMPO_ATIVO);
delay(TEMPO_PAUSA);
// 2. LED RGB (Ciclo de Cores)
mostrarStatus("2. LED RGB", "VERMELHO");
digitalWrite(PIN_LED_R, HIGH);
delay(1000);
digitalWrite(PIN_LED_R, LOW);
mostrarStatus("2. LED RGB", "VERDE");
digitalWrite(PIN_LED_G, HIGH);
delay(1000);
digitalWrite(PIN_LED_G, LOW);
mostrarStatus("2. LED RGB", "AZUL");
digitalWrite(PIN_LED_B, HIGH);
delay(1000);
resetPerifericos();
delay(TEMPO_PAUSA);
// 3. BOMBAS (Teste de Potência)
mostrarStatus("3. BOMBA ENCHER", "ATIVANDO...");
digitalWrite(PIN_BOMBA_1, HIGH);
delay(TEMPO_ATIVO);
resetPerifericos();
delay(TEMPO_PAUSA);
mostrarStatus("3. BOMBA ESVAZ.", "ATIVANDO...");
digitalWrite(PIN_BOMBA_2, HIGH);
delay(TEMPO_ATIVO);
resetPerifericos();
delay(TEMPO_PAUSA);
// 4. BOTÕES DE CONTROLE
mostrarStatus("4. BOTOES", "APERTE BTN 1");
while(digitalRead(PIN_BTN_1) == HIGH);
mostrarStatus("BTN 1 OK!", "SOLTE...");
while(digitalRead(PIN_BTN_1) == LOW);
delay(500);
mostrarStatus("4. BOTOES", "APERTE BTN 2");
while(digitalRead(PIN_BTN_2) == HIGH);
mostrarStatus("BTN 2 OK!", "SOLTE...");
while(digitalRead(PIN_BTN_2) == LOW);
delay(500);
mostrarStatus("4. BOTOES", "APERTE BTN 3");
while(digitalRead(PIN_BTN_3) == HIGH);
mostrarStatus("BTN 3 OK!", "SOLTE...");
while(digitalRead(PIN_BTN_3) == LOW);
delay(500);
// 5. BOTÃO DE EMERGÊNCIA (Teste Crítico)
mostrarStatus("5. EMERGENCIA", "APERTE O STOP");
while(digitalRead(PIN_EMERG) == HIGH);
mostrarStatus("EMERGENCIA OK!", "SISTEMA SEGURO");
delay(2000);
// 6. RFID (Validação de Tag)
mostrarStatus("6. RFID", "APROXIME A TAG");
unsigned long startRFID = millis();
bool tagLida = false;
// Aguarda leitura por até 10 segundos para não travar o loop para sempre
while(millis() - startRFID < 10000) {
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
String uid = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
uid += String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
uid += String(mfrc522.uid.uidByte[i], HEX);
}
uid.toUpperCase();
mostrarStatus("TAG DETECTADA!", "ID:" + uid);
mfrc522.PICC_HaltA(); // Para leitura da tag atual
tagLida = true;
delay(3000);
break;
}
}
if(!tagLida) mostrarStatus("RFID TIMEOUT", "PULANDO...");
mostrarStatus("LOOP FINALIZADO", "REINICIANDO...");
delay(2000);
}Loading
mfrc522
mfrc522