/*
# _\|/_ A ver..., ¿que tenemos por aqui?
# (O-O)
# ---oOO-(_)-OOo---------------------------------
##########################################################
# ****************************************************** #
# * DOMOTICA PARA PRINCIPIANTES * #
# * -- SEMAFORO PEATONES SIMPLE-- * #
# * Autor: https://github.com/inopya/ * #
# * * #
# * Versión 1.0 Fecha: 30/10/2024 * #
# ****************************************************** #
##########################################################
*/
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
// LIBRERIAS
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
#include <Arduino.h> //redundante Arduino IDE la carga por defecto
#include <ESP32Servo.h>
Servo myservo;
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
// DEFINICIONES Y CONSTANTES
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
//la mayoria de placas esp32 tiene un led en ese pin (la mia no)
#define LED_onboard 2
//pines del led RGB
#define LED_ROJO 2
#define LED_VERDE 4
#define LED_AZUL 5
//pin LDR
#define PIN_LDR 13
//pin Servo
#define servoPin 14
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
// VARIABLES GLOBALES
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
uint16_t UMBRAL_LDR = 250; //esto hay que calcularlo empiricamente...
bool enEspera = false;
unsigned long millisPrevios = 0;
// constants won't change :
const long intervalo = 5000;
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
// SETUP
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
void setup()
{
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
myservo.setPeriodHertz(50);// Standard 50hz servo
myservo.attach(servoPin, 500, 2400);
Serial.begin(115200);
//test_umbral_ldr(PIN_LDR); //descomentar solo para valorar como se comporta la LDR
//apagar el led integrado de la placa
pinMode(LED_onboard, OUTPUT);
digitalWrite(LED_onboard, 0);
//asignar entrada para la LDR
pinMode(PIN_LDR, INPUT);
//asignar salidas RGB
pinMode(LED_ROJO, OUTPUT);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_AZUL, OUTPUT);
//apagar las salidas RGB por precaucion
apagar_semaforo();
digitalWrite(LED_ROJO, HIGH); // iniciamos con semaforo en rojo
}
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
// MAIN
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
void loop()
{
apagar_semaforo();
if(detectadaPresencia() == true){
Serial.println("Detectada Presencia ");
apagar_semaforo();
unsigned long tiempo = medirTiempoTapado();
unsigned long intervalo_temporal_giro = tiempo / 180;
verde();
for(int angulo = 0; angulo < 180 ; angulo++){
myservo.write(angulo);
delay(intervalo_temporal_giro);
}
apagar_semaforo();
}
}
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
// FUNCIONES
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
void activarEspera(){
enEspera = true;
millisPrevios = millis();
}
unsigned long medirTiempoTapado(){
unsigned long tiempoInicioPulsacion = millis();
while(detectadaPresencia()){
// nada ...
}
unsigned long tiempoFinPulsacion = millis();
return tiempoFinPulsacion - tiempoInicioPulsacion;
}
bool detectadaPresencia(){
int valor_ldr = analogRead(PIN_LDR);
Serial.println(valor_ldr);
if(valor_ldr > UMBRAL_LDR) { //peaton frente a LDR
return true;
}
return false;
}
//======================================================================
// Test de valores LDR
//====================================================================
void test_umbral_ldr(int _pin)
{
while(true){
int valor_adc = analogRead(_pin);
Serial.print(F("Valor ADC en pin "));
Serial.print(_pin);
Serial.print(F(": "));
Serial.println(valor_adc);
delay(1000);
}
}
//======================================================================
// Apagado del semaforo
//====================================================================
void apagar_semaforo()
{
digitalWrite(LED_ROJO, 0);
digitalWrite(LED_VERDE, 0);
digitalWrite(LED_AZUL, 0);
}
void verde()
{
digitalWrite(LED_ROJO, 0);
digitalWrite(LED_VERDE, 1);
digitalWrite(LED_AZUL, 0);
}
//************************
// FIN DE PROGRAMA
//************************