/*------------------------------------------------------- PRUEBA DE SENSORES QTR CON CONTROL POR PULSADORES ------------------------------------------------------ Hardware: LED1 -> D13 LED2 -> D12 SW1 -> D4 (Inicia calibración) SW2 -> D2 (Alterna modo de visualización) Sensores QTR -> A0–A7 Funcionalidad: - SW1 inicia la calibración de los 8 sensores QTR. - SW2 alterna entre dos modos: Modo 1: Mostrar valores individuales de sensores. Modo 2: Mostrar posición calculada de la línea. - LEDs indican actividad: LED1 encendido durante calibración. LED2 encendido cuando se muestran lecturas. Autor: [Ja-Bots.com] Fecha: [2025] -------------------------------------------------------*/ #include // ------------------------------------------------------ // CONFIGURACIÓN DE SENSORES QTR // ------------------------------------------------------ QTRSensors qtr; const uint8_t SensorCount = 8; // Número total de sensores unsigned int sensores[SensorCount]; // Lecturas actuales de sensores uint16_t posicion = 0; // Posición calculada de la línea // ------------------------------------------------------ // DEFINICIÓN DE PINES // ------------------------------------------------------ #define LED1 13 #define LED2 12 #define SW1 2 #define SW2 4 // ------------------------------------------------------ // VARIABLES DE CONTROL // ------------------------------------------------------ bool modoLectura = false; // false = leer sensores, true = mostrar posición bool calibrado = false; // indica si se ha calibrado bool estadoSW1Prev = HIGH; // control antirrebote SW1 bool estadoSW2Prev = HIGH; // control antirrebote SW2 void setup() { Serial.begin(9600); // Configuración de pines pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(SW1, INPUT_PULLUP); pinMode(SW2, INPUT_PULLUP); // Configuración del sensor QTR qtr.setTypeAnalog(); qtr.setSensorPins((const uint8_t[]){A0, A1, A2, A3, A4, A5, A6, A7}, SensorCount); Serial.println(F("Sistema listo. Presiona SW1 para calibrar.")); } void loop() { leerPulsadores(); if (calibrado) { digitalWrite(LED2, HIGH); if (!modoLectura) { mostrarSensores(); } else { mostrarPosicion(); } delay(1000); // Intervalo de actualización } else { digitalWrite(LED2, LOW); } } /*------------------------------------------------------- Función: leerPulsadores Descripción: Detecta los cambios de estado en SW1 y SW2. -------------------------------------------------------*/ void leerPulsadores() { bool estadoSW1 = digitalRead(SW1); bool estadoSW2 = digitalRead(SW2); // Detección de flanco descendente en SW1 (inicia calibración) if (estadoSW1 == LOW && estadoSW1Prev == HIGH) { iniciarCalibracion(); delay(300); } // Detección de flanco descendente en SW2 (cambia modo) if (estadoSW2 == LOW && estadoSW2Prev == HIGH) { modoLectura = !modoLectura; Serial.print(F("Modo cambiado a: ")); Serial.println(modoLectura ? "POSICIÓN" : "LECTURA DE SENSORES"); delay(300); } estadoSW1Prev = estadoSW1; estadoSW2Prev = estadoSW2; } /*------------------------------------------------------- Función: iniciarCalibracion Descripción: Ejecuta rutina de calibración del módulo QTR. -------------------------------------------------------*/ void iniciarCalibracion() { Serial.println(F("\nIniciando calibración de sensores...")); digitalWrite(LED1, HIGH); calibrado = false; for (int i = 0; i < 120; i++) { qtr.calibrate(); delay(5); } digitalWrite(LED1, LOW); calibrado = true; Serial.println(F("Calibración completa.\n")); } /*------------------------------------------------------- Función: mostrarSensores Descripción: Muestra los valores individuales de los sensores QTR. -------------------------------------------------------*/ void mostrarSensores() { qtr.readLineBlack(sensores); Serial.println(F("\n*8* *7* *6* *5* *4* *3* *2* *1*")); for (int i = SensorCount - 1; i >= 0; i--) { Serial.print(sensores[i]); if (i > 0) Serial.print(" "); } Serial.println(); } /*------------------------------------------------------- Función: mostrarPosicion Descripción: Muestra la posición calculada de la línea. -------------------------------------------------------*/ void mostrarPosicion() { posicion = qtr.readLineBlack(sensores); Serial.print(F("\nPosición actual: ")); Serial.println(posicion); }