//PINES PARA ENCENDIDO Y CAMBIO DE GIRO
const int inicio = 2; //Conectar el sensor para medir frecuencia
const int giro = 0; //Conectar el sensor para medir frecuencia
const int rele1 = 16;
const int rele2 = 17;
const int rele3 = 18;
const int rele4 = 19;
bool Encender=LOW;
bool CambioGiro=LOW;
//PINES PARA MEDIR RPM
volatile int contador = 0;
int sensor = 12;
//Filtro promedio movil exponencial
int rpmFiltrado = 0;
volatile int rpm = 0;
#define alpha 0.5
volatile unsigned long tiempoDeInterrupcionAnterior = 0;
#define tiempoDeRebote 12
void IRAM_ATTR interrupcion(); // es para que la funcion se guarde en la memoria ram y no en la flash
//---------------------------------------------------------------
//---------------------------------------------------------------
void setup() {
pinMode(sensor,INPUT);
Serial.begin(115200);
attachInterrupt(sensor,interrupcion,FALLING);
//attachInterrupt(digitalPinToInterrupt(23),interrupcion,RISING);
//ACTIVAR ENTRADAS Y SALIDAS
pinMode(inicio,INPUT_PULLUP); // INICIO DE GIRO
pinMode(giro,INPUT_PULLUP); // CAMBIO DE GIRO
pinMode(rele1,OUTPUT); // INICIO DE MOTOR
digitalWrite(rele1,HIGH);
pinMode(rele2,OUTPUT); // INICIO DE MOTOR
digitalWrite(rele2,HIGH);
pinMode(rele3,OUTPUT); // CAMBIO DE GIRO
digitalWrite(rele3,HIGH);
pinMode(rele4,OUTPUT); // CAMBIO DE GIRO
digitalWrite(rele4,HIGH);
}
//---------------------------------------------------------------
//---------------------------------------------------------------
void loop(){
if (digitalRead(inicio)==LOW){
Encender = !Encender;
}
if(Encender == true){
Serial.print("MOTOR ENCENDIDO");
digitalWrite(rele1, LOW);
digitalWrite(rele2, LOW);
//--------------------------------------
//FUNCION PARA CAMBIAR DE GIRO
if (digitalRead(giro)==LOW){
CambioGiro = !CambioGiro;
}
if(CambioGiro == true){
Serial.print("CAMBIO DE GIRO");
digitalWrite(rele3, LOW);
digitalWrite(rele4, LOW);
}
else {
digitalWrite(rele3, HIGH);
digitalWrite(rele4, HIGH);
}
}
else {
//--------------------------------------
//APAGO EL MOTOR
Serial.print("MOTOR APAGADO");
digitalWrite(rele1, HIGH);
digitalWrite(rele2, HIGH);
digitalWrite(rele3, HIGH);
digitalWrite(rele4, HIGH);
noInterrupts(); //Desconectamos la interrupción para que no actué en esta parte del programa
CambioGiro=false;
}
//--------------------------------------
contador=0;
delay(1000);
noInterrupts(); //Desconectamos la interrupción para que no actué en esta parte del programa
rpm=contador*1; //Acomodar los RPM
/*Estas condicionales sirven para estabilizar lo mas rapido
posible las rpm por que al principio existe un poco de retardo*/
if(rpm == 0){
rpmFiltrado = 0;
}
else if(rpm>0 && rpm<90){
rpmFiltrado = rpm;
}
else{
rpmFiltrado = (alpha*rpm) + ((1-alpha)*rpmFiltrado);
}
interrupts(); //Reiniciamos la interrupción
Serial.print(rpm);
Serial.print(" ");
Serial.println(rpmFiltrado);
}
//---------------------------------------------------------------
//---------------------------------------------------------------
//FUNCION DE INTERRUPCIÓN DOND LEE LOS TIEMPOS
void interrupcion(){
if(millis() - tiempoDeInterrupcionAnterior > tiempoDeRebote){
contador=contador+1;
//Serial.println(contador);
tiempoDeInterrupcionAnterior = millis();
}
}