const int pinOptoacoplador = 45;
const int pinPWM = 5;
const int LONGITUD_ARREGLO = 3; //4 valores
bool PrimeraIteracion = true;
double TiempoActual = 0;
double TiempoAnterior = 0;
double Diferencia = 0;
bool EstadoAnteriorPin = LOW;
bool EstadoActualPin = LOW;
char Dato;
int valorPWM = 0;
char valorPWM_Arreglo[LONGITUD_ARREGLO];
int ElementoArreglo = 0;
void setup() {
//Configuración
Serial.begin(115200);
pinMode(pinOptoacoplador, INPUT);
PrimeraIteracion = true;
EstadoAnteriorPin = digitalRead(pinOptoacoplador);
EstadoActualPin = digitalRead(pinOptoacoplador);
Serial.println("Empezando programa...");
Serial.println("---------------------------------------------------------");
Serial.println("¡Bienvenido a la simulación con medición de velocidad!");
Serial.println("Ingrese un valor PWM entre 0 y 255");
Serial.println("---------------------------------------------------------");
}
void loop() {
//Se analiza si hubo un cambio en el sensor
if(FlancoDeSubida()){
if(PrimeraIteracion){
PrimeraIteracion = false;
}else{
Serial.println("Leyendo optoacoplador:");
TiempoActual = millis();
Diferencia = TiempoActual - TiempoAnterior;
Serial.print("Frecuencia: ");
Serial.println(1/Diferencia*1000);
Serial.print("RPM: ");
Serial.println(1/Diferencia*1000*60);
}
TiempoAnterior = millis();
}
//Se ve si hay un nuevo comando
if(Serial.available()>0){ //Se trabaja dato por dato
Dato = Serial.read(); //1 dígito como carácter
if(Dato == '\n'){
valorPWM = atoi(valorPWM_Arreglo);
if(valorPWM >= 0 && valorPWM <= 255){
Serial.print("Valor PWM: ");
Serial.println(valorPWM);
analogWrite(pinPWM,valorPWM);
}else{
Serial.println("---------------------------------------------------------");
Serial.print("Error: ");
}
//PreguntarPorLaContinuacion();
Serial.println("---------------------------------------------------------");
Serial.println("Ingrese un valor PWM entre 0 y 255");
Reinicializar();
}else{
if(ValidarSiEsDigito(Dato)){
if(ElementoArreglo < LONGITUD_ARREGLO){ //Solo se admiten 3 dígitos
valorPWM_Arreglo[ElementoArreglo] = Dato;
ElementoArreglo ++;
}else{
Serial.println("---------------------------------------------------------");
Serial.println("Error: El valor PWM debe ser de máximo 3 dígitos");
LimpiarDatosSeriales(); //Hay un dígitos extra, se reinicia el proceso
Reinicializar();
}
}else{
Serial.println("---------------------------------------------------------");
Serial.println("Error: Ingresa solo números");
LimpiarDatosSeriales(); //Hay un dígitos que no es un número, se reinicia el proceso
Reinicializar();
}
}
}
}
bool FlancoDeSubida(){
bool HuboFlancoDeSubida = false;
EstadoActualPin = digitalRead(pinOptoacoplador);
if(EstadoActualPin != EstadoAnteriorPin){
//Hubo un cambio
if(EstadoActualPin == HIGH && EstadoAnteriorPin == LOW){
HuboFlancoDeSubida = true;
}
EstadoAnteriorPin = EstadoActualPin;
}
return HuboFlancoDeSubida;
}
int ValidarSiEsDigito(char Dato){
return Dato >= 48 && Dato <= 57;
}
void LimpiarDatosSeriales(){
while(Serial.available()){ //Se lee todos los valores y por lo tanto ya no hay valores en la entrada serial
Serial.read();
}
Serial.println("---------------------------------------------------------");
Serial.println("Ingrese un valor PWM entre 0 y 255");
}
void Reinicializar(){
for(ElementoArreglo = 0; ElementoArreglo <= LONGITUD_ARREGLO; ElementoArreglo++){
valorPWM_Arreglo[ElementoArreglo] = 0;
}
ElementoArreglo = 0;
}