//incluimos las librerias que vamos a necesitar
#include <Button.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <HCSR04.h>
#include <EEPROM.h>
#include<IRremote.h>
//creo mis objetos
LiquidCrystal_I2C lcd(0x27,16,2);
//2 servos
Servo miServo1;
Servo miServo2;
//2 botones
Button boton1= Button(A3);
Button boton2= Button(7);
bool posicion1=false; //false=0º true=90º
bool posicion2=false;
// 3 sensores
int trigger1 = 5;
int eco1 = 6;
int trigger2 = 8;
int eco2 = 9;
int trigger3 = 12;
int eco3 = 13;
//3 leds
int LED1 = 2;
int LED2 = 4;
int LED3 = 11;
//variables control parking
int plazas=3;
int cm1;
int cm2;
int cm3;
bool estadoPrevioLED1 = false;
bool estadoPrevioLED2 = false;
bool estadoPrevioLED3 = false;
//variables de tiempo
unsigned long t1;
unsigned long t2;
unsigned long t3,t4,t5;
//variable EEPROM
int contador_pulsa=0;
//variables potenciometros
int POT=A1;
int angulo=0;
bool potenciometro=true;
//variables mando
int receptor=A1;
IRrecv irrecv(receptor);
decode_results codigo;
bool MANDO=false;
void setup() {
Serial.begin(115200);
boton1.begin();
boton2.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
miServo1.attach(A2);
miServo2.attach(10);
miServo1.write(0);
miServo2.write(0);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
EEPROM.get(3, contador_pulsa);
t1=millis();
irrecv.enableIRIn();
pinMode(receptor, INPUT); // Se enciende el recibidor del mando
}
void loop() {
// if (irrecv.decode(&codigo)) {
//if(codigo.value==0xFFA25D){
//MANDO=!MANDO;
//}
//if(codigo.value==0xFF6897){
// potenciometro=!potenciometro;
//miServo1.write(0);
//}
if(!MANDO){
barreras();
sensores();
if(!potenciometro){
pot();
}
if(millis()-t1>500){
pantalla();
lcd.setCursor(0,1);
lcd.print(contador_pulsa);
}
if(millis()-t5>10000){
EEPROM.put(3, contador_pulsa);
t5+=10000;
}
}
else{
mando();
pantalla();
}
//irrecv.resume();
//}
}
void barreras(){
boton1.read();
boton2.read();
if(boton1.pressed() && plazas>0){
if(posicion1){ //si posicion 1 es true(90º) entra en el if y gira a 0º
miServo1.write(0);
posicion1=false;
}
else{ //si posicion 1 es false(0º) entra en else y gira a 90º
miServo1.write(90);
posicion1=true;
t3=millis();
++contador_pulsa;
Serial.print(contador_pulsa);
}
}
if(posicion1 && (millis()-t3>5000)){
miServo1.write(0);
posicion1=false;
t3+=5000;
}
if(boton2.pressed() ){
if(posicion2){ //si posicion 1 es true(90º) entra en el if y gira a 0º
miServo2.write(0);
posicion2=false;
}
else{ //si posicion 1 es false(0º) entra en else y gira a 90º
miServo2.write(90);
posicion2=true;
t4=millis();
}
}
if(posicion2 && (millis()-t4>5000)){
miServo2.write(0);
posicion2=false;
t4+=5000;
}
}
long leeDistancia1(int triggerPin1, int ecoPin1){
//con esta funcion mando el pulso de trigger y leo por echo el rebote
pinMode(triggerPin1, OUTPUT);
digitalWrite(triggerPin1, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin1, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin1, LOW);
pinMode(ecoPin1, INPUT);
return pulseIn(ecoPin1, HIGH);
}
long leeDistancia2(int triggerPin2, int ecoPin2){
pinMode(triggerPin2, OUTPUT);
digitalWrite(triggerPin2, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin2, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin2, LOW);
pinMode(ecoPin2, INPUT);
return pulseIn(ecoPin2, HIGH);
}
long leeDistancia3(int triggerPin3, int ecoPin3){
pinMode(triggerPin3, OUTPUT);
digitalWrite(triggerPin3, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin3, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin3, LOW);
pinMode(ecoPin3, INPUT);
return pulseIn(ecoPin3, HIGH);
}
void sensores(){
cm1 = 0.0172 * leeDistancia1(trigger1, eco1);
cm2 = 0.0172 * leeDistancia2(trigger2, eco2);
cm3 = 0.0172 * leeDistancia3(trigger3, eco3);
bool nuevoEstadoLED1 = cm1 < 5.0; // sera true cuando cm<5cm
bool nuevoEstadoLED2 = cm2 < 5.0;
bool nuevoEstadoLED3 = cm3 < 5.0;
digitalWrite(LED1, nuevoEstadoLED1); //true=HIGH false=LOW
digitalWrite(LED2, nuevoEstadoLED2);
digitalWrite(LED3, nuevoEstadoLED3);
// guardamos el estado actual como previo para la siguiente iteración
Plazas(nuevoEstadoLED1, estadoPrevioLED1);
Plazas(nuevoEstadoLED2, estadoPrevioLED2);
Plazas(nuevoEstadoLED3, estadoPrevioLED3);
estadoPrevioLED1 = nuevoEstadoLED1;
estadoPrevioLED2 = nuevoEstadoLED2;
estadoPrevioLED3 = nuevoEstadoLED3;
}
void Plazas(bool nuevoEstado, bool estadoPrevio) {
if (!estadoPrevio && nuevoEstado && plazas > 0) {
//si estadoPrevio=false (libre), nuevoEstado=true (se ocupa) y plazas>0 entra en el if
plazas--; // se ocupa una plaza
}
if (estadoPrevio && !nuevoEstado && plazas < 3) {
//si estadoPrevio=true (ocupado), nuevoEstado=false (se queda libre) y plazas<3(maximas) entra en el if
plazas++; // se libera una plaza
}
}
void pantalla(){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Plazas: ");
lcd.setCursor(7, 0);
lcd.print(plazas);
}
void pot(){
angulo=analogRead(POT); //quiero que solo gire entre 0 y 90
angulo=map(angulo,0,1023,0,180);
miServo1.write(angulo);
delay(10);
Serial.println(angulo);
}
void mando(){
switch (codigo.value) { //En función del botón que pulsemos, realiza una acción u otra
case 0xFFA25D:
break;
case 0xFFE21D:
break;
case 0xFF629D:
break;
case 0xFF22DD:
break;
case 0xFF02FD:
break;
case 0xFFC23D: //Al pulsar el botón de avanzar
miServo1.write(90);
break;
case 0xFFE01F: //Al pulsar el botón de bajar,
miServo1.write(0);
break;
case 0xFFA857:
break;
case 0xFF906F: //Al pulsar el botón de subir,
miServo2.write(90);
break;
case 0xFF9867: //Al pulsar el botón EQ,
miServo2.write(0);
break;
case 0xFFB04F:
break;
case 0xFF6897:
break;
case 0xFF30CF: //Al pulsar el botón 1, se enciende LED 1
digitalWrite(LED1, HIGH);
break;
case 0xFF18E7: //Al pulsar el botón 2, se enciende LED2
digitalWrite(LED2, HIGH);
break;
case 0xFF7A85: //Al pulsar el botón 3, se enciende LED3
digitalWrite(LED3, HIGH);
break;
case 0xFF10EF: //Al pulsar el botón 4, se apaga LED 1
digitalWrite(LED1, LOW);
break;
case 0xFF38C7: //Al pulsar el botón 5, se apaga LED 2
digitalWrite(LED2, LOW);
break;
case 0xFF5AA5: //Al pulsar el botón 6, se apaga LED 3
digitalWrite(LED3, LOW);
break;
case 0xFF42BD: //Al pulsar el boton 6 aumento plazas
plazas++;
break;
case 0xFF4AB5: //Al pulsar el boton 7 disminuyo plazas
plazas--;
break;
case 0xFF52AD:
break;
case 0xFFFFFFFF:
break;
}
irrecv.resume();
}