#include <Servo.h>
const int PIN_RAIN_ANALOG = A0;
const int PIN_POT = A1;
const int PIN_BUZZER = 8;
const int PIN_SERVO = 9;
const int segA = 3;
const int segB = 4;
const int segC = 5;
const int segD = 6;
const int segE = 7;
const int segF = 10;
const int segG = 11;
const int segDP = 12;
// ----- parâmetros -----
bool DEMO_USA_POT = true; // se true, usa pot para simular leitura (modo demo)
const int RAIN_THRESHOLD = 600; // threshold fixo
const int CLEAR_THRESHOLD = 400; // histerese
const unsigned long BUZZER_TIME_MS = 220; // tempo do bip
Servo servoVaral;
bool varalAberto = true;
bool estadoChuva = false;
const byte digitSegments[2][7] = {
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0} // 1
};
void setup() {
Serial.begin(115200);
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(segDP, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT);
digitalWrite(PIN_BUZZER, LOW);
servoVaral.attach(PIN_SERVO);
// inicia aberto (180)
moveServoTo(180, false);
varalAberto = true;
atualizarDisplay(1);
delay(200);
}
void loop() {
int sensorValor = analogRead(PIN_RAIN_ANALOG);
int potValor = analogRead(PIN_POT);
int leitura = sensorValor;
if (DEMO_USA_POT) {
leitura = potValor;
}
// --- histerese simples ---
if (estadoChuva) {
if (leitura < CLEAR_THRESHOLD) estadoChuva = false;
} else {
if (leitura > RAIN_THRESHOLD) estadoChuva = true;
}
// debug
Serial.print("sensor=");
Serial.print(sensorValor);
Serial.print(" pot=");
Serial.print(potValor);
Serial.print(" leitura=");
Serial.print(leitura);
Serial.print(" chuva=");
Serial.print(estadoChuva);
Serial.print(" varalAberto=");
Serial.println(varalAberto);
if (estadoChuva && varalAberto) {
// fecha varal
fecharVaral(true);
} else if (!estadoChuva && !varalAberto) {
// abre varal
abrirVaral(true);
}
delay(150);
}
void atualizarDisplay(int valor) {
if (valor != 0 && valor != 1) valor = 0;
digitalWrite(segA, digitSegments[valor][0]);
digitalWrite(segB, digitSegments[valor][1]);
digitalWrite(segC, digitSegments[valor][2]);
digitalWrite(segD, digitSegments[valor][3]);
digitalWrite(segE, digitSegments[valor][4]);
digitalWrite(segF, digitSegments[valor][5]);
digitalWrite(segG, digitSegments[valor][6]);
digitalWrite(segDP, LOW);
}
void fecharVaral(bool tocarBuzzer) {
moveServoTo(0, true);
varalAberto = false;
atualizarDisplay(0);
if (tocarBuzzer) {
tone(PIN_BUZZER, 1000);
delay(BUZZER_TIME_MS);
noTone(PIN_BUZZER);
}
}
void abrirVaral(bool tocarBuzzer) {
moveServoTo(180, true);
varalAberto = true;
atualizarDisplay(1);
}
void moveServoTo(int target, bool animate) {
int current;
current = servoVaral.read();
if (current < 0 || current > 180) {
current = varalAberto ? 180 : 0;
}
if (!animate) {
servoVaral.write(target);
Serial.print("Servo moved instantly to ");
Serial.println(target);
delay(20);
return;
}
if (current == target) {
return;
}
if (current < target) {
for (int p = current; p <= target; p++) {
servoVaral.write(p);
delay(8);
}
} else {
for (int p = current; p >= target; p--) {
servoVaral.write(p);
delay(8);
}
}
Serial.print("Servo animated to ");
Serial.println(target);
}