/* 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.
volatile unsigned long current_millis = 0;
volatile unsigned long last_interrupt_time_sube = 0;
volatile unsigned long last_interrupt_time_baja = 0;
int nveces_ISR_sube = 0;
int nveces_ISR_baja = 0;
#define debounce_time 200
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
volatile int nflancos = 0;
int tinicial = 0;
float valor_frec=0;
int crono = 5000;
int paso = 1000;
// incluir las variables globales que se necesiten
// faltan las 3 funciones ISR, 2 botones (sube/baja) y senyal_entrada
void IRAM_ATTR ISR_senyal()
{
nflancos++;
}
void IRAM_ATTR ISR_sube()
{
nveces_ISR_sube++; // acumula el numero de veces que se entra en la ISR
current_millis = millis();
// Si la IRQ viene antes de “debounce_time” ms, se asume que es un "rebote"
if (current_millis - last_interrupt_time_sube > debounce_time)
{
last_interrupt_time_sube = current_millis;
crono += paso;
if (crono >10000)
{
crono = 10000;
}
}
}
void IRAM_ATTR ISR_baja()
{
nveces_ISR_baja++; // acumula el numero de veces que se entra en la ISR
current_millis = millis();
// Si la IRQ viene antes de “debounce_time” ms, se asume que es un "rebote"
if (current_millis - last_interrupt_time_baja > debounce_time)
{
last_interrupt_time_baja = current_millis;
crono -= paso;
}
if (crono <1000)
{
crono = 1000;
}
}
// falta completar la funcion de setup()
void setup(){
pinMode(senyal_output, OUTPUT);
pinMode(senyal_entrada, INPUT);
pinMode(sube, INPUT);
pinMode(baja, INPUT);
attachInterrupt(senyal_entrada,ISR_senyal,FALLING);
attachInterrupt(sube,ISR_sube,FALLING);
attachInterrupt(baja,ISR_baja,FALLING);
Serial.begin(115200);
// falta completar toda la configuracion
tinicial=millis();
}
unsigned long tp1=0; // control señal frecuencia en el pin 22
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-tinicial > crono)
{
tinicial = millis(); //ms
valor_frec = (nflancos/(crono/1000));
Serial.printf("Frec: %4.2f - nflancos: %d \n", valor_frec, nflancos);
nflancos= 0;
}
// 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"
// falta completar el programa
// Serial.printf("Frec: %4.2f - nflancos: %d \n", valor_frec, nflancos);
}