problema con encoders, ayuda,

Hola a todos,

Estoy empezando un proyecto con un encoders y mas o menos me funciona bien en las primeras pruebas y creo que se como puedo terminarlo, excepto por un problema , me explico, jjejejee.

Mi intención es hacer que un led se encienda durante un numero de pulsos determinados del encoders cuando un botón esta pulsado, ( en el futuro sera un sensor), el tiempo que esta encendido el led lo determino con un botón para aumentarle y otro para dismnuirle.
mi problema es que necesito que si el encoders se para, el led se apague aun que no haya cumplido el numero de pulsos necesarios ,

con el código que ahora os pondré me funciona bien (aun que hay que pulirlo, jeje) funciona todo pero si
el encoders se para cuando el led esta encendido se queda encendido esperando los pulsos que faltan y

lo que necesito es que cuando el encoder no este en movimiento el led este siempre apagado

Para el encoder estoy usando la libreria “Encoder.h” y el codigo del ejemplo de dicha libreria , “basic” que le he adaptado a lo que queria.

El codigo que tengo de momento es este:

/* Encoder Library - Basic Example

#include <Encoder.h>

Encoder myEnc(2, 3);
// pines senal encoders,importante

int empieza = 0;
int cola = 0;
int milimetros = 0;
int masmilimetros = 0;
int menosmilimetros = 0;

int pinstar = 4;
int led = 13;
int botonmas = 12;
int botonmenos = 11;

void setup() {

pinMode(13,OUTPUT);

pinMode(4,INPUT);
pinMode(12,INPUT);
pinMode(11,INPUT);
empieza = 0;

Serial.begin(9600);
Serial.println(“Basic Encoder Test:”);
}

long oldPosition = -999;

void loop() {
long newPosition = myEnc.read();
if (newPosition != oldPosition) {
oldPosition = newPosition;
}

do {

botonmas = digitalRead(12) ; //milimetros = leemos boton
botonmenos = digitalRead(11) ;

if (digitalRead (12)== HIGH) //boton mas
{
masmilimetros = (masmilimetros + 1);
delay(250);

}

if (digitalRead (11)== HIGH) //boton mas
{
menosmilimetros = (menosmilimetros + 1);
delay(250);

}
milimetros = ( masmilimetros - menosmilimetros );

empieza = digitalRead(4);

if (empieza == LOW) //sensor caja
{
cola = (newPosition + milimetros);

}

Serial.print(“newPosition”);
Serial.print(newPosition);
Serial.print(“cola”);
Serial.print(cola);
Serial.print(“milimetros”);
Serial.print(milimetros);
Serial.print(“botonmas”);
Serial.println(botonmas);

}

while (empieza != HIGH);{

if ( newPosition >= cola ) {
digitalWrite(led, LOW );

}

if ( newPosition < cola) {
digitalWrite(led, HIGH);

}

}

}

Gracias y un saludo

¿Cómo detectarías que el encoder se ha parado? Entiendo que cuando ha transcurrido x tiempo sin recibir impulsos, ¿no?
Casi siempre que necesitemos temporizar algo (en este caso el tiempo que llevamos sin un impulso) debemos recurrir a millis (ver ejemplo del IDE blinkWithoutDelay).
En tu caso necesitarás:

unsigned long ultimoImpulso;
const unsigned long esperaMaxima=300; // tras 300 milisegundos sin pulsos entenderemos que se paró el encoder.

En cada detección de impulso agregar:
ultimoImpulso=millis();

Y como condición de encendido de led, deberás controlar, además del pulsado de botón, la condición
millis()-ultimoImpulso < esperaMaxima

que si es falsa, significaría que el encoder lleva x tiempo parado.

Gracias por contestar tan rapido y perdón por tardar tanto en responder (yo), pero es que estoy saturado de trabajo y ahora tengo este proyecto parado , por falta de tiempo y por que me tenia loco, jejeje, creo que es demasiado para mis conocimientos, aun que no tiro la toalla,

Cuando pase el verano lo retomare.y seguro que necesitare mas ayuda,

Gracias y un saludo.

Muchas gracias Noter.

Esa es la solución,

El problema de detectar que el encoders esta parado, SOLUCIONADO

Pero me han surgido mas problemas con el código, jeejeje , era previsible.

Pero abriré otra pregunta si no consigo solucionarlos, ya que no tienen nada que ver con la pregunta inicial y por no liar,

Gracias de nuevo.