Banda transportadora con contadores 7 segmentos

Hola mucho gusto, estoy tratando de hacer una banda transportadora, uso sensores infrarojo de arduino, uno es para activar el motor 28byj48 y despues de un tiempo se detendra, la idea es que con otros 2 sensores uni arriba del otro, diferenciar un objeto grande de otro chico ( cuando pasa un objeto chico solo se activa un sensor, cuando pasa uno grande se activan los 2 sensores) el asunto es que mientras el motor corre cuando el sensor siente el objeto el contador no cambia ( uso dos 7 segmentos, uno para objetos grandes y otro para chicos) no logro que el codigo tenga esas 2 secciones por separado, me pueden ayudar? les dejo mi codigo

#include <Stepper.h>
int stepsPerRevolution = 2048;
int motSpeed = 12;
Stepper myStepper(stepsPerRevolution,53,49,51,47);
byte sensor3=12;

int display7a[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};
byte a=2;
byte b=3;
byte c=4;
byte d=5;
byte e=6;
byte f=7;
byte g=8;
int contador=0;

void puerto(int bits,int ini,int fin){
  for(int i=ini;i<=fin;i++)
  {
    digitalWrite(i,bitRead(bits,i-ini));
  }
}
byte sensor=9;
int display7b[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};
byte h=22;
byte k=23;
byte l=24;
byte n=25;
byte m=26;
byte o=27;
byte p=28;
int contador2=0;
byte sensor2=10;

void setup() {
  myStepper.setSpeed(motSpeed);

 for(int i=a;i<=g;i++){
    pinMode(i,OUTPUT);
  }
 
  for(int j=h;j<=p;j++){
    pinMode(j,OUTPUT);
  }
 pinMode(sensor,INPUT);
 pinMode(sensor2,INPUT);
 pinMode(sensor3,INPUT);
 
}

void loop() {
  if(digitalRead(sensor3) == LOW){
    delay(100);
    myStepper.step(stepsPerRevolution);
    delay(5000);
    myStepper.step(0);
    delay(100);
   }
//
  if(digitalRead(sensor) == LOW && digitalRead(sensor2) == HIGH ){
      delay(100);
      while(digitalRead(sensor) == LOW && digitalRead(sensor2) == HIGH ); //Anti-Rebote
      delay(100);
      contador++;
      
    }

  if(contador>9){
      contador=0;  
  }
  if(digitalRead(sensor) == LOW && digitalRead(sensor2) == LOW ){
      delay(100);
      while(digitalRead(sensor) == LOW && digitalRead(sensor2) == LOW ); //Anti-Rebote
      delay(100);
      contador2++;
    }

  if(contador2>9){
    contador2=0;
    }
          
  puerto(display7a[contador],a,g);
  puerto(display7b[contador2],h,p);

   
}

A primera vista, el problema es que se te olvidó incrementar contador2.

Hola, es extraño los contadores me cuentan pero solo si el motor esta quieto, acabo de hacer la correcion y persiste el mismo error.

Moderador:
Por favor, lee las Normas del foro y edita tu titulo retirando la palabra ayuda.
Mira el punto 5 de las normas sobre cómo poner los títulos en este foro.

Lograr que algo funcione con esos delays ya es un problema desde el comienzo.
Por favor reemplaza tu código por una librería antirebote
Como Bounce2.h por ejemplo.

delay(100);
 while(digitalRead(sensor) == LOW && digitalRead(sensor2) == LOW ); //Anti-Rebote
delay(100);

A ver como va esta versión. Descarga del Administrador de librerías Bounce2

#include <Stepper.h>
#include <Bounce2.h>

int stepsPerRevolution = 2048;
int motSpeed = 12;
Stepper myStepper(stepsPerRevolution,53,49,51,47);
byte sensor3=12;

int display7a[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};
byte a=2;
byte b=3;
byte c=4;
byte d=5;
byte e=6;
byte f=7;
byte g=8;
int contador=0;

// INSTANTIATE A Bounce OBJECT.
Bounce bounce1 = Bounce();
Bounce bounce2 = Bounce();
Bounce bounce3 = Bounce();

byte sensor = 9;

int display7b[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};
byte h=22;
byte k=23;
byte l=24;
byte n=25;
byte m=26;
byte o=27;
byte p=28;
int contador2 = 0;
byte sensor2  = 10;
int debouced1, debouced2, debouced3;

void puerto(int bits,int ini,int fin) {
  for (int i=ini;i<=fin;i++)   {
      digitalWrite(i,bitRead(bits,i-ini));
  }
}

void setup() {
  myStepper.setSpeed(motSpeed);

 for(int i=a;i<=g;i++){
    pinMode(i,OUTPUT);
  }
 
  for(int j=h;j<=p;j++){
    pinMode(j,OUTPUT);
  }
 pinMode(sensor,INPUT);
 pinMode(sensor2,INPUT);
 pinMode(sensor3,INPUT);

  bounce1.attach( sensor ,  INPUT ); 
  bounce1.interval(50); // interval in ms
  bounce2.attach( sensor2 ,  INPUT ); 
  bounce2.interval(50); // interval in ms
  bounce3.attach( sensor3 ,  INPUT ); 
  bounce3.interval(50); // interval in ms
 
}

void loop() {
  bounce1.update();
  bounce2.update();
  bounce2.update();
  
  debouced1 = bounce1.read();
  debouced2 = bounce2.read();
  debouced3 = bounce3.read();

  if (debouced3 == LOW){
      myStepper.step(stepsPerRevolution);
      delay(5000);            // esto es una locura de tiempo, se debe mejorar.
      myStepper.step(0);
      delay(100);
   }
//
  if (!debouced1 && debouced2){
      contador++;
      if (contador > 9) {
          contador = 0;  
      }
  }

  if (!debouced1 && !debouced2){
      contador2++;
      if (contador2 > 9){
          contador2 = 0;
      }
  }
         
  puerto(display7a[contador],a,g);
  puerto(display7b[contador2],h,p);
  
}

Hola, amigo creo que empeoro, el motor no se mueve y los contadores no cuentan en orden

Con los delays que has puesto, ¿qué esperas que pase?
Obvio que si detienes el flujo del programa por 5 segundos, no va a poder hacer nada durante esos 5 segundos

en el primer condicional, si el sensor3 detecta un objeto entonces active el motor por 5 segundos y luego lo apague, la cosa es que durante esos 5 segundos el programa no funciona en la parte de los sensores que cuentan con los 7 segmentos

Se entiende?

ohh pero que opcion tengo ademas de usar delay?

Utilizar millis().
En la sección Documentación hay un muy buen tutorial al respecto.

hola, perdon si soy molesto es solo que intento implementar la funcion millis y sigo sin obtener resultados. podrias ver mi codigo?

#include <Stepper.h>
int stepsPerRevolution = 2048;
int motSpeed = 12;
Stepper myStepper(stepsPerRevolution,53,49,51,47);
byte sensor3=12;

boolean estadomotor=false;
int sensor3actual;
int periodo = 5000;  // tiempo para que el led se encienda
unsigned long tiempoAnterior = 0;  //guarda tiempo de referencia para comparar
  
int display7a[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};
byte a=2;
byte b=3;
byte c=4;
byte d=5;
byte e=6;
byte f=7;
byte g=8;
int contador=0;

void puerto(int bits,int ini,int fin){
  for(int i=ini;i<=fin;i++)
  {
    digitalWrite(i,bitRead(bits,i-ini));
  }
}
byte sensor=9;
int display7b[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};
byte h=22;
byte k=23;
byte l=24;
byte n=25;
byte m=26;
byte o=27;
byte p=28;
int contador2=0;
byte sensor2=10;

void setup() {
  myStepper.setSpeed(motSpeed);

 for(int i=a;i<=g;i++){
    pinMode(i,OUTPUT);
  }
 
  for(int j=h;j<=p;j++){
    pinMode(j,OUTPUT);
  }
 pinMode(sensor,INPUT);
 pinMode(sensor2,INPUT);
 pinMode(sensor3,INPUT);

}

void loop() {
  sensor3actual = digitalRead(sensor3);  
  if(digitalRead(sensor3) == LOW){
    //delay(100);
    //myStepper.step(stepsPerRevolution);
    //delay(5000);
    //myStepper.step(0);
    //delay(100);
    estadomotor= true;
    myStepper.step(stepsPerRevolution);
    tiempoAnterior=millis();
   }
   if((millis()-tiempoAnterior>=periodo)&&estadomotor==true){  //si ha transcurrido el periodo programado
      estadomotor=false;
      myStepper.step(0);
      
      }
//
  if(digitalRead(sensor) == LOW && digitalRead(sensor2) == HIGH ){
      delay(100);
      while(digitalRead(sensor) == LOW && digitalRead(sensor2) == HIGH ); //Anti-Rebote
      delay(100);
      contador++;
      
    }

  if(contador>9){
      contador=0;  
  }
  if(digitalRead(sensor) == LOW && digitalRead(sensor2) == LOW ){
      delay(100);
      while(digitalRead(sensor) == LOW && digitalRead(sensor2) == LOW ); //Anti-Rebote
      delay(100);
      contador2++;

    }

  if(contador2>9){
    contador2=0;
    }
          
  puerto(display7a[contador],a,g);
  puerto(display7b[contador2],h,p);

   
}

MIra, yo te puse una librería que no usa los delays para detectar los pulsadores y solo te mostré lo que te estaba pasando y que no veías.
EN Documentación tienes buenos tutoriales.
No digas a la primera que no puedes hacerlo. Trabaja un poco, nosotros nos quemamos los pelos antes de preguntar.
Cuando usas millis() todo el programa cambia porque pasa de estar detenido a estar libre asi que debes pensar que ocurre con lo demas si todo esto esta libre? No es lo mismo.
Cuando presionas sensor3 se debería ejecutar el moviemiento del motor paso a paso y mientras sigo atento a los detectores 1 y 2 algo que antes no pasaba o no como tu lo imaginabas.
Asi que ahora tienes 3 cosas:

  1. si sensor3 esta en LOW

me acabo de dar cuenta que no usas mi código.
Okay aca dejo.
No sigo explicando a alguien que no se molesta en usar lo que otro te brinda.

amigo use tu codigo y se descontrolo todo mi proyecto, creeme he estado investigando y haciendo prueba y error, no quiero parecer el tipico novato que quiere las cosas en las manos, ponte en mis zapatos pongo un codigo que descontrola todo el circuito, lo seguirias usando?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.