/* Ejercicio PR3 - frecuencimetro */
const int senyal_output = 23; // pin generacion señal simulación -> en el lab, conectar generador de funciones
const int senyal_entrada = 18; // GPIO pin interrupcion para la entrada de señal
const int sube = 32; // aumenta 1 seg el tiempo de medida, hasta 10 seg.
const int baja = 33; // disminuye 1 seg el tiempo de medida, hasta 1 seg.
const float frec_senyal = 5.8; // poner valores entre 1 y 25 Hz para el simulador, en la placa real se pueden elevar los tiempos
const float periodo_senyal_ms = 1000 * (1/frec_senyal); // periodo en ms
//HAY QUE PONERLOS COMO VOLATILES!!
volatile float nflancos=0;
volatile float valor_frec=0;
volatile int t_medida=5000;//tiempo inicial son 5s
volatile int subida=0;//VA A REGISTRAR SI PULSAMOS EL BOTON DE AUMENTAR SEGUNDOS
volatile int bajada=0;//VA A REGISTRAR SI PULSAMOS EL BOTON DE DISMINUIR SEGUNDOS
// faltan las 3 funciones ISR, 2 botones (sube/baja) y senyal_entrada
void IRAM_ATTR ISR_senyal(){
nflancos++;
}
//PARA EVITAR LOS REBOTES VOY A HACERLO CON VARIABLES Y EN EL LOOP
void IRAM_ATTR ISR_sube(){
subida=1;
}
void IRAM_ATTR ISR_baja(){
bajada=1;
}
void setup(){
pinMode(senyal_output, OUTPUT);
Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt(18), ISR_senyal, FALLING);//configuro el pin como entrada de interrupción
//en el pin 18 cuando se detecte un flanco descendente, se ejecuta la funcion ISR_senyal
attachInterrupt(digitalPinToInterrupt(32), ISR_sube, FALLING);
attachInterrupt(digitalPinToInterrupt(33), ISR_baja, FALLING);
//TIENE QUE DETECTAR CUANDO PULSO, ES LO MISMO QUE LOW, PERO NO ES ACONSEJABLE
}
unsigned long tp1=0; // control señal frecuencia en el pin 22
unsigned long tp2=0;
unsigned long current_time;
void loop()
{
delay(1); // solo en el simulador, para q no tenga que procesar tantos "if" para nada, y así vaya más rápida
current_time=millis();
// para auto generar la secuencia - senyal encendido/apagado led
if( current_time-tp1 > periodo_senyal_ms/2){
digitalWrite(senyal_output, !digitalRead(senyal_output) );
tp1=millis(); // reset a tp1
}
if( current_time-tp2 > t_medida){//si han pasado x segundos
if(subida==1 && t_medida<10000)
{
t_medida = t_medida + 1000;
subida=0;
}
if(bajada==1 && t_medida>1000)
{
t_medida = t_medida - 1000;
bajada=0;
}
valor_frec=nflancos/t_medida;
Serial.printf("Frec:%4.5f - nflancos: %.0f en %d ms \n ", valor_frec, nflancos, t_medida );
nflancos=0;
tp2=millis();
}
// cada "t_medida" milisegundos hay que realizar el cálculo de frecuencia de la senyal de entrada
// y visualizar la información siguiente
// "Frecuencia señal de entrada medida: XXX.XX Hz , Flancos contados YYYY en ZZZZZ ms\n"
}