FreqMeasure.end()

Buongiorno a tutti.
Sto iniziando ad utilizzare la libreria FreqMeasure ( FreqMeasure Library, for Measuring Frequencies in the 0.1 to 1000 Hz range, or RPM Tachometer Applications) per leggere una frequenza dal D8 di un arduino nano (identico quindi ad arduino uno), ma volevo implementare la possibilità di attivare la funzione di lettura solamente quando necessario, liberando i pin pwm bloccati quando non devo leggere la frequenza.

Nell'esempio della libreria FreqMeasure.begin() viene inserito all'interno di void.setup(), ma così facendo la lettura è continua a prescindere.
Cercando un pò su internet ho visto che inserendolo all'interno di void.loop() è possibile iniziare la lettura a piacimento e terminarla quando serve con FreqMeasure.end()... solo che a me non funziona, non legge mai la frequenza e non scrive mai nulla sull'lcd.

Dove sbaglio?

/* FreqMeasure - Example with serial output
 * http://www.pjrc.com/teensy/td_libs_FreqMeasure.html
 *
 * This example code is in the public domain.
 */
#include <FreqMeasure.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

long sum = 0;
int count = 0;
int freq = 0;
int frequency = 0;

unsigned long previousMillis = 0;
const long interval = 1000;

void setup() 
{
//  FreqMeasure.begin();
  pinMode(2, OUTPUT);
  lcd.begin(16,2);
  pinMode(13, OUTPUT);
}

void loop() 
  {
   unsigned long currentMillis = millis();
   lcd.backlight();
   digitalWrite(2, HIGH); 
   if(currentMillis - previousMillis >= interval) 
   {
     previousMillis = currentMillis;   
     FreqMeasure.begin();
       if (FreqMeasure.available())
       {
        digitalWrite(13, HIGH);  
        sum = sum + FreqMeasure.read();
        count = count + 1;
        if (count > 100)
         {
          frequency = FreqMeasure.countToFrequency(sum / count);
          freq = map(frequency, 7310, 5895, 0, 99);  
          sum = 0;
          count = 0;
          if (freq > 99)
           freq = 99;
          if (freq < 0)
           freq = 0;
          lcd.setCursor(0,0);
          if (freq < 10)
           lcd.print("0");
          lcd.print(freq);
          lcd.setCursor(0,1);
          if (frequency > 9000)
           frequency = 9000;
          lcd.print(frequency);
          digitalWrite(13, LOW);
          FreqMeasure.end();        
         }
        }
   }
}

gualandd:
solo che a me non funziona, non legge mai la frequenza e non scrive mai nulla sull'lcd.

Dove sbaglio?

Devi impostare l'intervallo con millis almeno ad un tempo pari a 1 secondo più tutto il tempo per eseguire le varie operazioni della loop, altrimenti continui a reinizializzare il frequenzimetro prima che riesce a finire il ciclo di lettura, prova con intervallo a partire da 1010, se non basta incrementa di 10 in 10.

astrobeed:
Devi impostare l'intervallo con millis almeno ad un tempo pari a 1 secondo più tutto il tempo per eseguire le varie operazioni della loop, altrimenti continui a reinizializzare il frequenzimetro prima che riesce a finire il ciclo di lettura, prova con intervallo a partire da 1010, se non basta incrementa di 10 in 10.

Niente da fare >:( .
Sono arrivato anche ad interval = 5000 ma il risultato non cambia, non entra mai in misurazione e l'LCD + LED pin 13 sono fermi!

Ho guardato meglio il codice, c'è un altro errore, la FreqMeasure.available() deve essere fuori dal controllo millis() e consecutivo FreqMeasure.begin() altrimenti continui a inizializzare il frequenzimetro prima di verificare la presenza di una nuova lettura.
In pratica all'interno della if per la millis avvii il frequenzimetro mentre all'interno della loop fai sempre la verifica presenza nuova lettura, nel caso dopo aver acquisito il dato disattivi il frequenzimetro.
Attenzione che perdi solo la funzionalità pwm dei pin interessati, però li puoi sempre usare come normali GPIO senza nessuna limitazione, quindi non so fino a che punto ti serve fare tutto questo giro.

Purtroppo facendo così entra nel ciclo di misura (led acceso) ma non succede più nulla, l'lcd rimane vuoto ed il led non si spegne (quindi non esce dal ciclo di misura).

Il perchè chiedo ciò è molto semplice: per cultura personale, in quanto mi piace capire le cose il più possibile per future applicazioni.

gualandd:
Purtroppo facendo così entra nel ciclo di misura (led acceso) ma non succede più nulla, l'lcd rimane vuoto ed il led non si spegne (quindi non esce dal ciclo di misura).

Dato che non ho mai provato a disattivare il frequenzimetro e fare il relativo test non so dirti se questo può portare ad una situazione di errore, da verificare, puoi sempre aggiungere un flag che setti/resetti a seconda dello stato frequenzimetro in base al quale esegui o meno la verifica misura.
Al limite manda una mail allo sviluppatore e chiedi a lui.