Bien, hemos conseguido un buen funcionamiento de nuestra cinta. Ahora quisimos agregarle más funcionalidad y pensamos agregar en el código unas líneas para que cuando el sensor llegue a detectar el paso de 5 unidades de un mismo color, la cinta se detenga, el led correspondiente a ese color quede parpadeando, el contador de ese color vuelva a cero y también ver el conteo de las unidades en el monitor serie. Todo eso sin modificar la mecánic de nuestra cinta!!! Aquí tienes el código actualizado según las indicaciones. Ahora, cuando el contador de un color alcanza el máximo (5), la cinta se detendrá después de un retraso de 500 ms, el LED correspondiente parpadeará y el contador de ese color se reiniciará a cero.

#include 
#include 

// Pines de los LEDs
const int ledRojo = 8;
const int ledVerde = 6;
const int ledAzul = 7;

// Pines del motor
const int motorPWM = 5; // Velocidad del motor (PWM)
const int motorDir1 = 12;
const int motorDir2 = 11;

// Servo
Servo servo;

// Objeto del sensor APDS9960
Adafruit_APDS9960 apds;

// Variables de color
uint16_t r, g, b, c;

// Contadores para cada color
int contadorRojo = 0;
int contadorVerde = 0;
int contadorAzul = 0;

// Máximo de unidades por color
const int maxUnidades = 5;

void setup() {
  // Configuración de pines
  pinMode(ledRojo, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  pinMode(ledAzul, OUTPUT);
  pinMode(motorPWM, OUTPUT);
  pinMode(motorDir1, OUTPUT);
  pinMode(motorDir2, OUTPUT);

  // Inicialización del servo
  servo.attach(3); // Cambiar el pin si es necesario
  servo.write(90); // Posición inicial

  // Inicialización del sensor
  if (!apds.begin()) {
    Serial.println("Error al inicializar el sensor APDS9960");
    while (1);
  }

   apds.setADCGain(APDS9960_AGAIN_16X); // Aumentar la sensibilidad del sensor

  apds.enableColor(true);         // Habilita el sensor de color
  apds.setADCIntegrationTime(10); // Tiempo de integración (más rápido)
  
  // Configuración del puerto serie
  Serial.begin(9600);
  Serial.println("Cinta Clasificadora Lista");

  // Iniciar motor
  iniciarMotor();
}

void loop() {
  // Leer valores de color
  apds.getColorData(&r, &g, &b, &c);

  // Mostrar valores en el monitor serie
  Serial.print("Rojo: "); Serial.print(r);
  Serial.print(" Verde: "); Serial.print(g);
  Serial.print(" Azul: "); Serial.print(b);
  Serial.print(" Claro: "); Serial.println(c);

  // Mostrar el conteo de unidades
  Serial.print("Contador Rojo: "); Serial.println(contadorRojo);
  Serial.print("Contador Verde: "); Serial.println(contadorVerde);
  Serial.print("Contador Azul: "); Serial.println(contadorAzul);

  // Lógica para encender los LEDs y mover el servo según el color
  if (c > 10) { // Evaluar solo si hay suficiente luz
    if (g > r + 5 && g > b + 5) { // Verde predominante
      encenderLED(ledVerde);
      moverServo(60); // Mover rampa al recipiente verde
      contadorVerde++;
      if (contadorVerde >= maxUnidades) {
        detenerCintaConDelay(ledVerde);
        contadorVerde = 0;
      }
    } else if (r > g + 5 && r > b + 5) { // Rojo predominante
      encenderLED(ledRojo);
      moverServo(120); // Mover rampa al recipiente rojo
      contadorRojo++;
      if (contadorRojo >= maxUnidades) {
        detenerCintaConDelay(ledRojo);
        contadorRojo = 0;
      }
    } else if (b > r + 8 && b > g + 8) { // Azul predominante
      encenderLED(ledAzul);
      moverServo(90); // Mover rampa al recipiente azul
      contadorAzul++;
      if (contadorAzul >= maxUnidades) {
        detenerCintaConDelay(ledAzul);
        contadorAzul = 0;
      }
    } else {
      apagarTodos();
    }
  }

  delay(500); // Pequeña pausa para estabilidad
}

// Función para encender un LED específico
void encenderLED(int led) {
  apagarTodos();
  digitalWrite(led, HIGH);
}

// Función para apagar todos los LEDs
void apagarTodos() {
  digitalWrite(ledRojo, LOW);
  digitalWrite(ledVerde, LOW);
  digitalWrite(ledAzul, LOW);
}

// Función para mover el servo
void moverServo(int angulo) {
  servo.write(angulo);
}

// Función para iniciar el motor
void iniciarMotor() {
  digitalWrite(motorDir1, HIGH);
  digitalWrite(motorDir2, LOW);
  analogWrite(motorPWM, 80); // Velocidad media
}

// Función para detener el motor
void detenerMotor() {
  digitalWrite(motorDir1, LOW);
  digitalWrite(motorDir2, LOW);
  analogWrite(motorPWM, 0);
}

// Función para detener la cinta, hacer parpadear un LED y reiniciar el contador
void detenerCintaConDelay(int led) {
  delay(3000);
  detenerMotor(); // Esperar antes de iniciar el parpadeo
  for (int i = 0; i < 10; i++) { // Parpadeo del LED
    digitalWrite(led, HIGH);
    delay(250);
    digitalWrite(led, LOW);
    delay(250);
  }
  iniciarMotor(); // Reiniciar la cinta después del parpadeo
}

Muy bien, con este nuevo código lograremos: Conteo visible en la serie del monitor. Reinicio del contador después de alcanzar el máximo. Parpadeo del LED correspondiente al color predominante durante 10 ciclos. La cinta reinicia su movimiento automáticamente después de esto. Si tienes dudas, no dudes en comentarlo. 😊