Contador de objetos por minutos

Hola. Quiero pedir ayuda para realizar un proyecto. Quiero construir un contador de objetos por minutos. la idea consiste en usar un Arduino UNO junto con un sensor infrarrojo e18-d50nk.
Con esto quiero contar cuanto produce una maquia por minuto colocando el sensor en su salida.

Desde ya agradecería su ayuda. busque en el foto y lo que encontré fueron solo sobre medidores de RPM en el cual se cuentan cierta cantidad de ranurar pero no se como adaptarlo a mi necesidad y sensor.

En caso de no ser el lugar correcto para publicar o si hay algún post que no encontré pido disculpas.

Un simple código que cuente las veces que el sensor IR detecte objetos ya es un avance.
Contar objetos por minuto, es iniciar un contador simultáneamente con un timer y cuando llegue a 60 seg presentas la información y reseteas el contador y timer.
Lo que indicas son medidores de RPM revoluciones x minuto y tmb es válido.
Revoluciones x minuto es como objetos por minuto, te servira del mismo modo.
Solo que los programas que cuentan RPM usan Interrupciones que acá tmb puedes usar pero no es necesario.
Entonces comienza con alguno d elos códigos que has encontrado y pruebalo, total si funciona dirás "EUREKA" y si no lo hace verás si se puede modificar a tu necesidad.

Muchas gracias @Surbyte ! Lo intentare y en caso de conseguirlo compartiré el código aquí.
Saludos.

Logre llegar a esto.
Alguna sugerencia?. Gracias.

unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
unsigned long tiempoSegundos = 0;
int pinIN = 8;  // Crea Variable pinIN y la asocia al pin digital 8    
int valorIN = 0;  // Crea Variables con un valor inicial asociado
int contenido = 0; 
int presionado = 0;

void setup() {
  Serial.begin(9600);
  tiempo1 = millis();
Serial.println("Inicio");
pinMode(pinIN, INPUT_PULLUP); // Define el Puerto 8 como Entrada

}

void loop() {

  valorIN=digitalRead(pinIN);  // Realiza la lectura Digital del pin 8
  if(digitalRead(pinIN) == 1) // Si la lectura es 1 incremente el valor de contenido
  { 
    presionado = 1;
  }
  if (digitalRead(pinIN) !=1 && presionado == 1) //Incrementa el valor de contenido
  {
        contenido++; 
        presionado = 0;
  }

  tiempo2 = millis();
  if(tiempo2 > (tiempo1+15000)){  //Si ha pasado 15 segundo ejecuta el IF
    tiempo1 = millis(); //Actualiza el tiempo actual
    tiempoSegundos = tiempo1/1000;
 
    Serial.println("Conteo por minuto"); 
    Serial.print(contenido *4); //Display in Serial Monitor el valor contado multiplicado por 4.
    Serial.println("");   
    contenido = 0;
  }
  
}

No se a que llegaste, quieres que yo haga de detective?
Intenta por favor explicarte... llegué a esto y colocas una salida y debería ser esto otro.
Entonces podremos ayudarte mas rápidamente.

A ver.. hablaste de códigos RPM y esperaba un código RPM y en su lugar creo que inventaste uno que no luce bien.
Mira este link https://create.arduino.cc/projecthub/greatscottlab/diy-tachometer-rpm-meter-6d451a

#include <Arduino.h>
#include <U8x8lib.h>
#include <SPI.h>
#include <Wire.h>
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
unsigned long rpmtime;
float rpmfloat;
unsigned int rpm;
bool tooslow = 1;

void setup() {
  u8x8.begin();
  u8x8.setFont(u8x8_font_profont29_2x3_f);
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B |= (1 << CS12); //Prescaler 256
  TIMSK1 |= (1 << TOIE1); //enable timer overflow
  pinMode(2, INPUT);
  attachInterrupt(0, RPM, FALLING);
}

ISR(TIMER1_OVF_vect) {
  tooslow = 1;
}

void loop() {
  delay(1000);
  if (tooslow == 1) {
    u8x8.clear();
    u8x8.drawString(1, 0, "SLOW!");
  }
  else {
    rpmfloat = 120 / (rpmtime/ 31250.00);
    rpm = round(rpmfloat);
    u8x8.clear();
    u8x8.setCursor(1,0);
    u8x8.print(rpm);
  }
}

void RPM () {
  rpmtime = TCNT1;
  TCNT1 = 0;
  tooslow = 0;
}

En tu caso no hay revoluciones sino objetos, debería indicar bien.

Como verás o sino presta atención, usa una ventana de 1 segundo o sea.. si no ve objetos en 1 segundo no te dará ninguna cuenta. Esto puede ser demasiado rápido asi que puedes aumentar ese tiempo, pero hacerlo detiene todo.
En tu código has puesto 15 segundos si esta es la ventana que necesitas debemos pensar como ajustarlo

Tenes razón, olvide explicar lo que sucede cuando ejecuto el código que planteo.
Uso millis para obtener la ventana de 15 segundos, cuento las veces que cambia el estado del sensor infrarrojo en ese periodo de tiempo, lo multiplico por cuatro para obtener la cantidad por minuto, imprimo la salida por el monitor serial y luego vuelvo a 0 el contador de objetos. El código funciona pero entiendo que puede ser poco exacto a las variaciones de objetos por minuto. Voy a leer detalladamente el código que me proporcionaste. Si crees correcto que deba editar la respuesta anterior en vez de responde aquí avísame y lo corrijo. Muchas gracias.

Establece ante todo cual es la situación en tu cinta transportadora de objetos (lo estoy imaginando)
Cuantos pasas minimo, cúantos máximo. Eso ayudará a saber que ventana debes considerar.
Veamos dos casos:
Imaginemos que pasan cajas.
Pasa 1 x segundo entonces deberia contar 60 x minuto sin embargo, una ventana de 1 seg puede perderse objetos o no?
La mayor parte del tiempo dira 0 objetos x min pero cuando pase el objeto dira 1 x minuto
Entonces funciona? Si lo hace, la ventana de 1 segundo te permite ver actualizaciones cada 1 segundo.. de modo que es mas LOGICA para muchos objetos no para pocos
Para pocos te convienen ventanas mas prolongadas.
Ahora una ventada de 10 segundos.. vera lo mismo que la anterior pero tendras pausas mas largas entre actualizaciones.

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