// Incluir las librerías necesarias #include #include // Inicializar la pantalla LCD con I2C LiquidCrystal_I2C lcd(0x27, 16, 2); // Ajusta la dirección I2C y el tamaño de la pantalla según tu modelo // Definir los pines de Arduino conectados a los pulsadores como constantes const byte PUL1 = 1; // Pin del pulsador 1 const byte PUL2 = 0; // Pin del pulsador 2 // Definir el pin de Arduino conectado al potenciómetro como constante const byte POT = A0; // Pin analógico del potenciómetro // Definir las resistencias límite para los pulsadores como constantes const float R1 = 4.0; // Resistencia límite superior para el pulsador 1 en KΩ const float R2 = 1.5; // Resistencia límite inferior para el pulsador 2 en KΩ // Definir el margen del filtro de histéresis en KΩ como constante const float MARGEN = 0.1; // Declarar las variables globales que se van a usar en el programa byte estadoPUL1 = 0; // Estado del pulsador 1 byte estadoPUL2 = 0; // Estado del pulsador 2 int valorPOT = 0; // Valor del potenciómetro entre 0 y 1023 float resistPOT = 0; // Resistencia del potenciómetro en KΩ int nivelAnterior = 0; // Variable para almacenar el nivel anterior // Declarar la clase Motor que representa el motor controlado por el L293D class Motor { // Declarar los atributos privados de la clase Motor private: byte EN; // Pin de habilitación byte IN1; // Pin de entrada 1 byte IN2; // Pin de entrada 2 float VMOT; // Voltaje del motor en V bool estado; // Estado del motor (encendido o apagado) bool sentido; // Sentido de giro del motor (horario o antihorario) //............................................................................................................................................................. // Declarar los métodos públicos de la clase Motor public: // Declarar el constructor de la clase Motor que recibe los pines y el voltaje como parámetros e inicializa los atributos Motor(byte EN, byte IN1, byte IN2, float VMOT) { this->EN = EN; this->IN1 = IN1; this->IN2 = IN2; this->VMOT = VMOT; this->estado = false; this->sentido = true; // Configurar los pines del L293D como salida e inicializarlos en bajo pinMode(this->EN, OUTPUT); pinMode(this->IN1, OUTPUT); pinMode(this->IN2, OUTPUT); digitalWrite(this->EN, LOW); digitalWrite(this->IN1, LOW); digitalWrite(this->IN2, LOW); } // Declarar el método para encender el motor con el voltaje definido en el constructor void encender() { analogWrite(this->EN, map(this->VMOT, 0, 3, 0, 255)); // Ajustar el voltaje del motor con PWM this->estado = true; } // Declarar el método para apagar el motor void apagar() { digitalWrite(this->EN, LOW); this->estado = false; } // Declarar el método para cambiar el sentido de giro del motor a horario void girarHorario() { digitalWrite(this->IN1, HIGH); digitalWrite(this->IN2, LOW); this->sentido = true; } // Declarar el método para cambiar el sentido de giro del motor a antihorario void girarAntihorario() { digitalWrite(this->IN1, LOW); digitalWrite(this->IN2, HIGH); this->sentido = false; } }; //............................................................................................................................................................ // Declarar las funciones que se van a usar en el programa void leerPulsadores(); // Función para leer el estado de los pulsadores void leerPotenciometro(); // Función para leer el valor y la resistencia del potenciómetro void calcularNivel(); // Función para calcular el nivel actual y aplicar el filtro de histéresis void mostrarNivel(); // Función para mostrar el nivel en la pantalla LCD // Crear un objeto de la clase Motor llamado miMotor con los pines 6, 4, 5 y el voltaje 2.0 Motor miMotor(6, 4, 5, 2.0); void setup() { // Configurar los pines de los pulsadores como entrada con resistencia de pull-up interna pinMode(PUL1, INPUT_PULLUP); pinMode(PUL2, INPUT_PULLUP); // Configurar el pin del potenciómetro como entrada analógica pinMode(POT, INPUT); // Usar la referencia interna de 5V para las lecturas analógicas analogReference(DEFAULT); // Inicializar la comunicación serie a una velocidad de 9600 bps Serial.begin(9600); // Inicializar la pantalla LCD lcd.init(); lcd.backlight(); } void loop() { // Llamar a las funciones definidas anteriormente leerPulsadores(); leerPotenciometro(); calcularNivel(); mostrarNivel(); // Si solo uno de los pulsadores está presionado y la resistencia está dentro del rango permitido, encender el motor y cambiar el sentido de giro según el pulsador if ((estadoPUL1 ^ estadoPUL2) && ((estadoPUL1 && resistPOT < R1) || (estadoPUL2 && resistPOT > R2))) { miMotor.encender(); // Encender el motor con el voltaje definido en el constructor if (estadoPUL1) { miMotor.girarHorario(); // Si el pulsador 1 está presionado, girar el motor en sentido horario } else { miMotor.girarAntihorario(); // Si el pulsador 2 está presionado, girar el motor en sentido antihorario } } //........................................................................................................................................................................... // Si ambos pulsadores están presionados o no presionados, o la resistencia está fuera del rango permitido, apagar el motor else { miMotor.apagar(); // Apagar el motor } } // Definir la función para leer el estado de los pulsadores void leerPulsadores() { // Leer e invertir el estado de los pulsadores estadoPUL1 = !digitalRead(PUL1); estadoPUL2 = !digitalRead(PUL2); } // Definir la función para leer el valor y la resistencia del potenciómetro void leerPotenciometro() { // Leer el valor del potenciómetro valorPOT = analogRead(POT); // Convertir el valor del potenciómetro a resistencia en KΩ resistPOT = (5.0 * valorPOT) / (1023 - valorPOT); } // Definir la función para calcular el nivel actual y aplicar el filtro de histéresis void calcularNivel() { // Calcular el nivel actual float nivel = (resistPOT - R2) / (R1 - R2) * 16 + 1; nivel = constrain(nivel, 1, 16); // Redondear el nivel al entero más cercano int nivelEntero = round(nivel); // Aplicar el filtro de histéresis if (abs(nivelEntero - nivelAnterior) > MARGEN) { nivelAnterior = nivelEntero; } } // Definir la función para mostrar el nivel en la pantalla LCD void mostrarNivel() { // Posicionar el cursor en la primera fila y primera columna lcd.setCursor(0, 0); // Mostrar el nivel o STOP según la resistencia del potenciómetro if (resistPOT >= R2 && resistPOT <= R1) { lcd.print("NIVEL "); lcd.print(nivelAnterior); lcd.print(" "); // Añadir espacios en blanco para borrar lo que había antes } else { lcd.print("STOP"); nivelAnterior = 0; lcd.print(" "); // Añadir espacios en blanco para borrar lo que había antes } }