// Projecte final
#include <Servo.h>
// Pins
const int ledvermell = 8;
const int ledverd = 7;
const int ldrOut = A0;
const int ldrIn = A1;
Servo pablillemServo;
// Estats
int estatPorta = 180; // 180 = tancada, 0 = oberta
bool portaOberta = false;
bool cotxeDins = false;
bool ldrOutVaDetectar = false;
bool ldrInVaDetectar = false;
bool esperantTancarPerEntrar = false;
bool esperantTancarPerSortir = false;
// Valors
const int noCotxe = 120;
const int valorDetectatMin = 910;
const int valorDetectatMax = 1020;
// Temps
unsigned long tempsUltimaAccio = 0;
const unsigned long esperaEntreAccions = 5000; // 5 segons
void setup() {
pablillemServo.attach(9);
pablillemServo.write(estatPorta);
pinMode(ledvermell, OUTPUT);
pinMode(ledverd, OUTPUT);
digitalWrite(ledvermell, HIGH); // Porta tancada inicialment
Serial.begin(9600);
}
void loop() {
int valorLdrOut = analogRead(ldrOut);
int valorLdrIn = analogRead(ldrIn);
Serial.print("LDR Out: ");
Serial.print(valorLdrOut);
Serial.print(" | LDR In: ");
Serial.println(valorLdrIn);
unsigned long tempsActual = millis();
bool ldrOutDetectat = valorLdrOut >= valorDetectatMin && valorLdrOut <= valorDetectatMax; // Veiem on és el cotxe
bool ldrInDetectat = valorLdrIn >= valorDetectatMin && valorLdrIn <= valorDetectatMax;
// Flags de detecció
if (ldrOutDetectat) ldrOutVaDetectar = true;
if (ldrInDetectat) ldrInVaDetectar = true;
// Obrir des de fora
if (!portaOberta &&
ldrOutVaDetectar && !ldrOutDetectat &&
valorLdrIn > noCotxe &&
!esperantTancarPerEntrar &&
tempsActual - tempsUltimaAccio >= esperaEntreAccions) {
pampalluguesObrir(); // Cridem les funcions
obrirPorta();
esperantTancarPerEntrar = true;
ldrOutVaDetectar = false;
tempsUltimaAccio = tempsActual;
}
// Tancar després d’entrar
if (portaOberta && esperantTancarPerEntrar &&
ldrInVaDetectar && !ldrInDetectat &&
valorLdrOut > noCotxe &&
tempsActual - tempsUltimaAccio >= esperaEntreAccions) {
pampalluguesTancar();
tancarPorta();
esperantTancarPerEntrar = false;
ldrInVaDetectar = false;
tempsUltimaAccio = tempsActual;
}
// Obrir des de dins
if (!portaOberta &&
ldrInVaDetectar && !ldrInDetectat &&
valorLdrOut > noCotxe &&
!esperantTancarPerSortir &&
tempsActual - tempsUltimaAccio >= esperaEntreAccions) {
pampalluguesObrir();
obrirPorta();
esperantTancarPerSortir = true;
ldrInVaDetectar = false;
tempsUltimaAccio = tempsActual;
}
// Tancar després de sortir
if (portaOberta && esperantTancarPerSortir &&
ldrOutVaDetectar && !ldrOutDetectat &&
valorLdrIn > noCotxe &&
tempsActual - tempsUltimaAccio >= esperaEntreAccions) {
pampalluguesTancar();
tancarPorta();
esperantTancarPerSortir = false;
ldrOutVaDetectar = false;
tempsUltimaAccio = tempsActual;
}
delay(100);
}
void obrirPorta() { // Funció per obrir la porta
for (int pos = estatPorta; pos >= 0; pos--) {
pablillemServo.write(pos);
delay(15);
}
estatPorta = 0;
portaOberta = true;
digitalWrite(ledverd, HIGH);
digitalWrite(ledvermell, LOW);
Serial.println("Porta oberta");
}
void tancarPorta() {
for (int pos = estatPorta; pos <= 180; pos++) {
pablillemServo.write(pos);
delay(15);
}
estatPorta = 180;
portaOberta = false;
digitalWrite(ledverd, LOW);
digitalWrite(ledvermell, HIGH);
Serial.println("Porta tancada");
}
void pampalluguesTancar() {
for (int i = 0; i < 6; i++) {
digitalWrite(ledvermell, i % 2 == 0 ? HIGH : LOW); // Fa 3 pampallugues perquè 6/2=3
delay(200);
}
digitalWrite(ledvermell, HIGH);
}
void pampalluguesObrir() {
for (int i = 0; i < 6; i++) {
digitalWrite(ledverd, i % 2 == 0 ? HIGH : LOW);
delay(200);
}
digitalWrite(ledverd, HIGH);
}