#include <ESP32Servo.h>
#define TRIG_PIN 5
#define ECHO_PIN 18
#define SERVO_PIN 21
#define POT_PIN 34
Servo meuServo;
String ultimaCorReserv1 = ""; // controle de mistura
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(POT_PIN, INPUT);
meuServo.attach(SERVO_PIN);
meuServo.write(0); // posição inicial
}
void loop() {
int valorPot = analogRead(POT_PIN); // 0–4095
String cor = detectarCor(valorPot);
float altura = calcularAltura();
Serial.print("Potenciômetro: ");
Serial.print(valorPot);
Serial.print(" | Cor: ");
Serial.print(cor);
Serial.print(" | Altura: ");
Serial.print(altura);
Serial.println(" cm");
if (altura >= 2 && altura <= 4 && (cor == "Rosa" || cor == "Lilás")) {
// RESERVATÓRIO 1 - sem mistura
if (ultimaCorReserv1 == "" || ultimaCorReserv1 == cor) {
ultimaCorReserv1 = cor;
moverServo(30); // posição simulada do reservatório 1
} else {
Serial.println("⚠️ Mistura não permitida no Reservatório 1!");
}
}
else if (altura >= 5 && altura <= 7 && (cor == "Rosa" || cor == "Vermelho")) {
// RESERVATÓRIO 2
moverServo(90); // posição simulada do reservatório 2
}
else {
// RESERVATÓRIO 3
moverServo(150); // posição simulada do reservatório 3
}
delay(1000);
}
void moverServo(int pos) {
meuServo.write(pos);
delay(700);
meuServo.write(0);
delay(1000);
}
String detectarCor(int valor) {
if (valor < 1365) return "Lilás";
else if (valor < 2730) return "Rosa";
else return "Vermelho";
}
float calcularAltura() {
float soma = 0;
for (int i = 0; i < 3; i++) {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duracao = pulseIn(ECHO_PIN, HIGH, 30000);
float distancia = duracao * 0.034 / 2.0;
soma += distancia;
delay(50);
}
float media = soma / 3.0;
float altura = 40.0 - media;
if (altura < 0) altura = 0;
return altura;
}