decrementar contador

Hola a todos.

Estoy empezando con la programacion y me surgen algunos problemas y dudas.

Me he echo ya casi todos los examples, algunos programitas.
Pero tengo un problema con un contador que se me resiste.

Tengo un motor dc con un l293d y un encoder.
el encoder incrementa un contador , y cuando llega a 100 gira hacia el otro lado,
todo esto lo hace bien pero cuando llega a 100 gira en sentido contrario pero no decrementa el contador
imagino que el problema esta en el if que contiene el primer contador pero no se como solucionarlo

si alguien puede alumbrarme?
gracias .

este es el codigo

int inpin = 7;
int motor1 = 5;
int motor2 = 6;
int encoder = 0;
int contador = 0;
int contador1 = 0;
int estado = 0;
boolean direccion = false;
boolean contador2 = false;
int led = 13;

void setup(){
pinMode(led, OUTPUT);
pinMode(inpin, INPUT);
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
Serial.begin(9600);
}
boolean alcanzalimite (int contador1, boolean direccion){
boolean salida = true;
if (contador1 < 100 && direccion == true){
salida = true;
}
if (contador1 < 100 && direccion == false){
salida = false;
}
return salida;
}
void loop(){

encoder = digitalRead(inpin);
if (encoder != estado){
if (encoder == HIGH){
contador++;

}
}
Serial.print("contador1 ");
Serial.println(contador1);
Serial.print("contador2 ");
Serial.println(contador2);

contador1 = contador;
contador2 = alcanzalimite(contador1, direccion);

if (contador2 == true){
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
digitalWrite(led, HIGH);

if (contador1 > 100){
direccion = false;
contador1--;
}
}
if (contador2 == false){
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);
digitalWrite(led, LOW);

if (contador1 < 100){
direccion = false;
contador1++;
}
}

}
un saludo y gracias.

if (contador1 > 100){
direccion = false;
contador1--;
}

Creo que el problema está en que este if lo que hace es que si contador1 es mayor que 100 lo decrementa, entonces lo que pasa es que cuando vale 99 no entra en el if. Como supuestamente en este if la variable debe de ir de 100 hasta 0 lo que debes de hacer es cambiar el 100 por el 0 así entrará en el if.

if (contador1 > 0){
direccion = false;
contador1--;
}

Prueba a ver que tal y ya nos contarás si funciona.

Saludos chato_sat.

Gracias por contestar chato.

pero sigo teniendo el mismo problema, lo que pasa es que ahora repite ciertos numeros,

llega a 100 , gira para el otro lado y el contador no decrece, pero repite 4 veces los mismos numeros

100,100,100,100,,101,101,101,101,102,102,102 asi asta.......
pero no decrece.

No sera de el 1er if que siempre aumenta?

void loop(){

encoder = digitalRead(inpin);
if (encoder != estado){
if (encoder == HIGH){
contador++; // este contador siempre aumenta
}
}

gracias otra vez.

usa alguna linea de debug adicional para ver si entra en el IF cuando no toca.
aparte de

void loop(){

  encoder = digitalRead(inpin);
  if (encoder != estado){
    if (encoder == HIGH){
      contador++;                             // este contador siempre aumenta
     Serial.println("Contador aumentado");
    }
  }

e imprime en cada loop el valor de contador.

He hecho unas cuantas modificaciones a tu programa y por lo menos he conseguido que los contadores se actualicen correctamente (No se si es lo que pides, ya que he hecho varias modificaciones). Aquí está el programa:

int inpin = 7;
int motor1 = 5;
int motor2 = 6;
int encoder = 0;
int contador = 0;
int direccion = 1; //1 - izquierda ; 2 - derecha
int led = 13;


void setup(){
  pinMode(led, OUTPUT);
  pinMode(inpin, INPUT);
  pinMode(motor1, OUTPUT);
  pinMode(motor2, OUTPUT);
  Serial.begin(9600);
}

// devuelve true si se ha alcanzado el limite
boolean alcanzaLimite ()
{
  boolean salida = false;
  //Si nos movemos a la izquierda y llegamos a 100
  if (contador == 100 && direccion == 1){
    salida = true;
  }
  //Si nos movemos a la derecha y llegamos a 0
  if (contador == 0 && direccion == 2){
    salida = true;
  }
  return salida;
}

void cambiarDireccion()
{
  if (direccion == 1) {
    digitalWrite(motor1, LOW);
    digitalWrite(motor2, HIGH);
    digitalWrite(led, LOW);
    direccion = 2;
  } else {
    digitalWrite(motor1, HIGH);
    digitalWrite(motor2, LOW);
    digitalWrite(led, HIGH);
    direccion = 1;
  }
}

void actualizaContador()
{
  if (direccion == 1) {
    contador++;
  } else {
    contador--;
  }
}
  
void loop(){

  encoder = digitalRead(inpin);
  
  if (encoder == HIGH) {
    actualizaContador();
  }
  
  if (alcanzaLimite()) {
    cambiarDireccion();
  }
  
  Serial.print("Contador: ");
  Serial.println(contador);
  Serial.print("Direccion: ");
  Serial.println(direccion);
}

Si tienes alguna duda acerca del código no dudes en preguntarla.

Saludos chato_sat.

Gracias por contestar Chato

He probado tu codigo, esta bien pero no es lo que busco ,
gracias

Entiendo el codigo aunque muy muy lento y mirando la referencia cada dos por tres.

Al final he consegido que funcione asi.

Esto lo que hace es inicia un motor dc con un encoder que cuenta pulsos, cuando llega a 100 para, y gira para el otro lado asta que llega a 0, y asi sucesivamente.

int inpin = 7;
int motor1 = 5;
int motor2 = 6;
int encoder = 0;
int contador = 0;
int contador1 = 0;
int estado = 0;
boolean direccion = true;
boolean contador2 = false;
int led = 13;

void setup(){
pinMode(led, OUTPUT);
pinMode(inpin, INPUT);
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
Serial.begin(9600);
}
void subeMotor(){
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
digitalWrite(led, HIGH);
}
void bajaMotor(){
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);
digitalWrite(led, LOW);
}
void accionMotor(boolean direccion){
if (direccion == true){
subeMotor();
}else{
bajaMotor();
}
}
boolean alcanzalimite (int contador1, boolean direccion){
boolean salida = false;
if (contador1 > 100 && direccion == true){
salida = true;
}
if (contador1 < 0 && direccion == false){
salida = true;
}

return salida;
}
void loop(){
//leer estado actual
encoder = digitalRead(inpin);
//comprobar si el estado ha cambiado
if (encoder != estado ){
//comprobar si el ¿boton? se ha pulsado
if (encoder == HIGH){
Serial.print("contador ");
Serial.println(contador);
Serial.print("contador2 ");
Serial.println(direccion);

accionMotor(direccion);
if (direccion == true)
contador++;
else
contador--;
}
}

if (alcanzalimite(contador, direccion) == true){
direccion = !direccion;
}
//Actualizamos el estado
estado = encoder;
}

la verdad es que eso de crear funciones para todo me ha gustado

un saludo a todos

gracias por la mano chato