Sensore velocità LM 393 - problema di visualizzazione su lcd

Ciao a tutti,
mi sto interfacciando al mondo di arduino da poco, come detto nella presentazione in un altro post.
Attualmente sto cercando di rilevare la velocità di un motorino elettrico attraverso il sensore LM393, il quale fa passare una rotella ( che ho stampato in 3d e attaccato all'albero del motorino ) al suo interno e rileva in base a quanti spazi ci sono nella rotella una serie di high e low che poi trasmette ad arduino.
Ho trovato uno sketch in internet, e finchè uso il monitor seriale nessun problema.
Quando invece provo ad inserire anche il monitor lcd mediante i2c non mi funziona più ne il monitor seriale ne tantomeno il monitor lcd ( che rimane semplicemente retroilluminato ).
di seguito lo sketch, premetto che non ho ancora capito bene il linguaggio di arduino, quindi tante funzioni mi sono ancora ignote.. se qualcuno è così gentile da darci un occhio e vedere dove sbaglio mi fa un grande favore, penso che sia solo un problema di dove posizionare i comandi per il monitor...

Il passo successivo sarebbe quello di far apparire 2 righe, di cui una sarà la velocità massima rilevata e che si aggiorni ogni volta che la stessa viene superata.

#include "TimerOne.h"
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,4);

      
unsigned int counter=0; // Attacca il pin D0 del sensore al pin 2 di arduino ( ok il pin 2, non lo 0 )

void docount()  // counts from the speed sensor
{counter++;  // increase +1 the counter value
} 

void timerIsr(){
  Timer1.detachInterrupt();  //stop the timer
  int rotation = (counter / 10);  // divide by number of holes in Disc
      lcd.print("Motor Speed: ");
      Serial.print("Motor Speed: "); 
      lcd.print(rotation*60,DEC);
      Serial.print(rotation*60,DEC);  
      Serial.println(" Rpm"); 
  counter=0;  //  reset counter to zero
  Timer1.attachInterrupt( timerIsr );  //enable the timer
}

void setup() 
{
      lcd.init();
      lcd.backlight();
      Serial.begin(9600);
  Timer1.initialize(500000); // set timer for half sec
  attachInterrupt(0, docount, RISING);  // increase counter when speed sensor pin goes High
  Timer1.attachInterrupt( timerIsr ); // enable the timer
} 

void loop()
{
  
}

grazie
Riccardo

Non posso entrare nello specifico, dato che non ho mai usato i timer
ma ti posso dare un'indicazione di massima: troppa roba nella ISR
e poi controlla che interrupt e timer non si "disturbino" a vicenda

Però non è strano che con il monitor seriale funzioni correttamente?

Però non è strano che con il monitor seriale funzioni correttamente?

Sicuramente la seriale è più veloce a scrivere, in quanto si limita a inserire dei valori in buffer circolare, quindi il tempo speso nella ISR e minore di quello speso dal codice LCD.

Comunque visto che all'interno di un ISR gli interrupt sono disattivati per il tempo che si impiega ad eseguire la ISR la MCU non può rispondere ad eventi. In sotanza un ISR dovrebbe impegnare meno tempo cpu possibile, quindi solitamente dentro la ISR si prende nota di ciò che si deve fare. Nel loop se si trova la nota si esegue il codice.

Lo so alle volte è una seccatura.

Ciao.

OK grazie mille per i consigli. Vediamo se ne vengo a capo in qualche modo :slight_smile: