#include <Adafruit_NeoPixel.h>
#include <TimerOne.h>
#include <Servo.h>
#define ROJO 0
#define VERDE 1
#define SALIR 2
#define ENTRAR 3
#define ESP_SALIR 4
#define ESP_ENTRAR 5
#define SERVO 9
#define SENSOR_AFUERA 7
#define SENSOR_ADENTRO 8
#define NEOPIXEL 10
#define LED 11
Servo servoMotor;
Adafruit_Neopixel pixels(1,10);
int segundosVerde = 0;
int tiempoVerde;
int estadoActivo = 0;
bool hola;
bool mensaje();
void setup() {
pinMode(SERVO, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(SENSOR_AFUERA, INPUT_PULLUP);
pinMode(SENSOR_ADENTRO, INPUT_PULLUP);
pixels.begin();
pixels.show();
servoMotor.attach(SERVO);
servoMotor.write(0);
Serial.begin(9600);
Timer1.initialize(1000);
Timer1.attachInterrupt(funcionTiempo);
}
void loop() {
if (tiempoVerde >= 1000) {
tiempoVerde = tiempoVerde - 1000;
segundosVerde++;
}
maquinaEstado();
}
void maquinaEstado() {
Serial.print(estadoActivo);
switch (estadoActivo) {
case ROJO:
hola = mensaje();
if (hola == true) {
estadoActivo = VERDE;
prenderVerde();
tiempoVerde = 0;
segundosVerde = 0;
}
break;
case VERDE:
if (segundosVerde >= 30) {
estadoActivo = ROJO;
prenderRojo();
}
if (SENSOR_AFUERA == 0) {
estadoActivo = ENTRAR;
tiempoVerde = 0;
segundosVerde = 0;
abrir();
}
if (SENSOR_ADENTRO == 0) {
estadoActivo = SALIR;
tiempoVerde = 0;
segundosVerde = 0;
abrir();
}
break;
case SALIR:
if (segundosVerde >= 30) {
estadoActivo = ROJO;
prenderRojo();
cerrar();
if (SENSOR_AFUERA == 0) {
estadoActivo = ESP_SALIR;
}
break;
case ENTRAR:
if (segundosVerde >= 30) {
estadoActivo = ROJO;
prenderRojo();
cerrar();
if (SENSOR_ADENTRO == 0) {
estadoActivo = ESP_ENTRAR;
}
break;
case ESP_SALIR:
if (SENSOR_AFUERA == 1) {
cerrar();
estadoActivo = ROJO;
prenderRojo();
}
}
break;
case ESP_ENTRAR:
if (SENSOR_ADENTRO == 1) {
cerrar();
estadoActivo = ROJO;
prenderRojo();
}
}
break;
}
}
bool mensaje() {
String mensajeCorrecto = "hola!";
String mensajeRecibido;
mensajeRecibido=Serial.readString();
Serial.print(mensajeRecibido);
if ( mensajeCorrecto.equals(mensajeRecibido) == true ) {
return true;
} else {
return false;
}
}
void funcionTiempo() {
tiempoVerde++;
}
void abrir() {
servoMotor.write(90);
}
void cerrar() {
servoMotor.write(0);
}
void prenderVerde() {
pixels.setPixelColor(0,pixels.Color(0,255,0));
pixels.show();
}
void prenderRojo() {
pixels.setPixelColor(0,pixels.Color(255,0,0));
pixels.show();
}