rotary encoder , rilevare nessuno stato

salve ragazzi, sto cercando di usare un encoder rotativo per rilevare se una ruota agganciata al suo albero è ferma o no (oppure se si muove sotto una certa velocità.) riesco a capire gli step di rotazione, ma non riesco a capire come rilevarne la "fermata" potreste aiutarmi per cortesia?

In che senso, scusa ? ...

In genere un'encoder lo leggi con una chiamata ad un'interrupt da uno dei due canali, e nell'interrupt un confronto con lo stato del secondo canale (giusto per vedere se ruota in un senso o nell'altro), e' ovvio che se non hai alcuna chiamata all'inerrupt, questo e' gia un'indicazione che la ruota e' ferma ... ;)

allora mi spiego meglio. ho una ruota che gira e devo monitorarla. quando si ferma per più di tot secondi mi deve dare un allarme o mi deve cambiare lo stato di un relè, o mi deve far suonare un cicalino.
il problema è che riesco a vedere lo stato istantaneo, ma non quello a 5 secondi ad esempio. non so se mi sono spiegato bene.

#define encoder0PinA  2
#define encoder0PinB  3

volatile long encoder0Pos=0;
long newposition;
long oldposition = 0;
unsigned long newtime;
unsigned long oldtime = 0;
long vel;

void setup()
{
  pinMode(encoder0PinA, INPUT);
  digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder0PinB, INPUT);
  digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor
  attachInterrupt(0, doEncoder, RISING);  // encoDER ON PIN 2
  Serial.begin (9600);
  
}

void loop()
{
newposition = encoder0Pos;
newtime = millis();
vel = (newposition-oldposition) * 1000 /(newtime-oldtime);

if (vel <1000) {
//Serial.print ("speed = ");
//Serial.println (vel);
Serial.println ("fermo");
}
else {

Serial.print ("speed = ");
Serial.println (vel);
 }

oldposition = newposition;
oldtime = newtime;
delay(100);
}

void doEncoder()
{
  if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
    encoder0Pos++;
  } else {
    encoder0Pos--;
  }
}

con questo codice riesco a vedere la velocità istantanea, ma di più non so come fare

Ciao, potresti nella routine doEncoder() mettere: oldtime=millis(); in loop: se ((millis()-oldtime) >5000 ) -> allarme !!

Stefano

forse sono riuscito, anche se non mi sembra molto elegante, che ne dite si può migliorare?

#define encoder0PinA  2
#define encoder0PinB  3

volatile long encoder0Pos=0;
long newposition;
long oldposition = 0;
unsigned long newtime;
unsigned long tempostop;
unsigned long oldtime = 0;
long vel;
int Buzzer = 13;

void setup()
{
  pinMode(encoder0PinA, INPUT);
  pinMode (Buzzer, OUTPUT);
  digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder0PinB, INPUT);
  digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor
  attachInterrupt(0, doEncoder, RISING);  // encoDER ON PIN 2
  Serial.begin (9600);
  Serial.println("start");                // a personal quirk
}

void loop()
{
newposition = encoder0Pos;
newtime = millis();
//tempostop = millis();
vel = (newposition-oldposition)  *10000000/(newtime-oldtime);

if ((vel==0) && (tempostop >5) ){
Serial.println ("fermo");
//digitalWrite(13,HIGH);
//delay(1000);
tone (Buzzer, 2000);
Serial.println (vel);
Serial.println (tempostop);
tempostop = 0;


}
else {
  noTone(13);
Serial.print ("speed = ");
Serial.println (vel);
Serial.println (tempostop);
noTone(13);
//digitalWrite(13,LOW);
//Serial.println (encoder0Pos);
tempostop++;

 }

oldposition = newposition;
oldtime = newtime;

delay(500);

}

void doEncoder()
{
  if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
    encoder0Pos++;
  } else {
    encoder0Pos--;
  }
}