#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. 😊
Nuestra cinta clasificadora... Ahora también cuenta!!!
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.