UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica ÍNDICE PRACTICA 2: PROGRAMACION DE E/S ............................................................................. 2 1. OBJETIVOS DIDACTICOS: ............................................................................................ 2 2. MARCO TEORICO: .......................................................................................................... 2 2.1. ENTRADAS Y SALIDAS EN EL ATMEGA 328P: ...................................................... 2 3. MATERIAL Y EQUIPO: .......................................... Ошибка! Закладка не определена. 4. PROCEDIMIENTO: .......................................................................................................... 4 4.1.LECTURA DE UN PULSADOR ..................................................................................... 4 5. ACTIVIDADES ......................................................... Ошибка! Закладка не определена. 6. CONCLUSIONES:............................................................................................................ 19 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 1 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica PRACTICA 4: TEMPORIZADORES Y LCD 1. OBJETIVOS DIDACTICOS: •Aprender a manejar los temporizadores. • Conectar Pantalla LCD a una placa Arduino. • Emplear comunicación serial para mostrar los valores (monitor serial). 2. MARTERIAL Y EQUIPO: • Computador. • Placa Arduino (Uno, Leonardo, Mega, Nano, etc). • Pantalla LCD. • Buzzer. • Componentes varios. • Software Proteus. 3. MARCO TEORICO: 3.1. PANTALLA LCD: LCD significa Liquid Crystal Display o Pantalla de Cristal Líquido. Es una tecnología utilizada en monitores de computadoras, televisores, cámaras digitales y otros dispositivos electrónicos, que permite una pantalla más delgada y plana, además de una excelente definición y más ahorro de energía con respecto a los viejos monitores de tubos de rayos catódicos (CRT). Básicamente estas pantallas están integradas por diminutos puntos. Poseen dos capas de material polarizante. Entre las capas se introduce una solución de cristal líquido. Luego una señal eléctrica hace que los cristales se alineen de tal manera que impidan o no el paso de la luz. Cuando la pantalla se pone negra, todos sus cristales están alineados para que no pase luz. Los LCD tienen una vida promedio de entre 50 y 60 mil horas de uso. Figura 1 Pantalla LCD 16 x2 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 2 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica Arduino nos facilita enormemente la comunicación con los Displays mediante la librería “LiquidCrystal” la cual está optimizada de tal manera que nos permite comunicarnos por tan solo 4 pines de salida digital, con cualquier Display compatible con el Driver Hitachi HD44780. Podemos encontrar en el mercado muchos modelos de Display compatibles con este Driver. El pinout de la pantalla LCD se muestra a continuación, en el que se distinguen los siguientes grupos: Energia: Vcc, GND, Vo (Contraste), A y C(ánodo y cátodo de luz de fondo) Datos: Pines del 7 al 14 (D0 al D7). Control: RS (Selección de registro), R/W (Lectura/Escritura) y EN (habilitación). Figura 2 Pines de la Pantalla LCD 3.2. LIBRERÍA LDC: La librería para el manejo del LCD es la librería LiquidCrystal.H que viene en el IDE de Arduino, la que contiene las siguientes funciones principales. LiquidCrystal(Rs, En, D4, D5, D6, D7) Función que permite crear una variable de la clase LiquidCrystal, con los pines indicados. Begin(Cols, Rows) Inicializa el LCD, se debe especificar número de columnas (cols) y filas (rows) del LCD. Clear() 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 3 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica Borra la pantalla LCD y posiciona el cursor en la esquina superior izquierda (posición (0,0)). SetCursor(Col, Row) Posiciona el cursor del LCD en la posición indicada por col y row (x,y); es decir, establecer la ubicación en la que se mostrará posteriormente texto escrito para la pantalla LCD. Write() Escribir un carácter en la pantalla LCD, en la ubicación actual del cursor. Print() Escribe un texto o mensaje en el LCD, su uso es similar a un Serial.print ScrollDisplayLeft() Se desplaza el contenido de la pantalla (texto y el cursor) un espacio hacia la izquierda. ScrollDisplayRight() Se desplaza el contenido de la pantalla (texto y el cursor) un espacio a la derecha. CreateChar (Num, Datos) Crea un carácter personalizado para su uso en la pantalla LCD. Se admiten hasta ocho caracteres de 5×8 pixeles (numeradas del 0 al 7). Donde: num es el número de carácter y datos es una matriz que contienen 4. PROCEDIMIENTO: 4.1. PROBANDO LA PANTALLA LCD Arme el siguiente circuito. a. ARME EL SIGUIENTE CIRCUITO: Figura 3 diagrama de circuito con pantalla LCD y un potenciómetro 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 4 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica Figura 4 Circuito realizado en casa b. ESCRIBA EL SIGUIENTE CÓDIGO #include <LiquidCrystal.h>; // Llamamos a la librería del LCD LiquidCrystal lcd(12,11,5,4,3,2); // Definimos los pines a utilizar void setup() { lcd.begin(16, 2); // Cantidad de columnas y filas es el Display pinMode(10, OUTPUT); //Activamos la retroiluminación *Ver CKT digitalWrite(10, HIGH); } void loop() { lcd.setCursor(0,0); //Establecemos la posicion del cursor lcd.print("Hola: "); lcd.setCursor(1,1); //Establecemos la posicion del cursor lcd.print("Ingenieria Mecatrónica"); delay(200); } 4.2. PREPARANDO LA PANTALLA Y FIJANDO EL TIEMPO: a. Dado el siguiente circuito. 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 5 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica Figura 5 Temporizador con LCD b. Implemente previamente el circuito del LCD con la placa Arduino y compruebe su correcto funcionamiento mostrando el mensaje: c. Escriba y explique el programa en Arduino IDE para conseguir visualizar en la pantalla lo requerido en el punto 4. d. Conecte los cuatro pulsadores con las resistencias Pull Down de 10KΩ a la placa Arduino e. Los pulsadores con cable naranja deberán seleccionar las Horas, Minutos y Segundos. d. Escriba y explique el programa en Arduino IDE para conseguir visualizar en la pantalla lo requerido por el circuito. Al presionar los pulsadores deberá incrementarse el número de horas, minutos o segundos visualizados 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 6 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica 4.3. Controlando el tiempo. a. El cuarto pulsador deberá servir para iniciar el temporizador en cuenta regresiva. b. Al finalizar el tiempo se deberá activar el Buzzer. c. Escriba el siguiente código para conseguir lo señalado en los dos puntos anteriores.: #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Inicializamos la librería con el número de los pines a utilizar int buzzer = 13; // Alarma int ahoras = 0; // Variable para mostrar por LCD las horas int aminutos = 0; // Variable para mostrar por LCD los minutos int asegundos = 0; // Variable para mostrar por LCD los segundos int segundostotal = 0; // Tiempo total int msg = 0; int start = A1; // Pulsador de arranque int empieza = 1024; // Variable para almacenar el valor del pulsador de arranque int buth = A5; // Pulsador de Horas int butm = A4; // Pulsador de Minutos int buts = A3; // Pulsador de segundos int varbuth = 0; // Variable para almacenar el valor del pulsador de horas int varbutm = 0; // Variable para almacenar el valor del pulsador de minutos int varbuts = 0; // Variable para almacenar el valor del pulsador de segundos int varbuthAnt = 0; int varbutmAnt = 0; int varbutsAnt = 0; void setup() { lcd.begin(16, 2); // Configuramos el número de columnas y filas del LCD. pinMode(buzzer, OUTPUT); // Pin de alarma -> Salida pinMode(buth, INPUT); // Pin de pulsador de horas -> Entrada pinMode(butm, INPUT); // Pin de pulsador de minutos -> Entrada pinMode(buts, INPUT); // Pin de pulsador de segundos -> Entrada pinMode(start, INPUT); // Pin de pulsador de arranque -> Entrada msg = 0; empieza = 1024; varbuth = 1; // Barrera de horas varbutm = 1; // Barrera de minutos varbuts = 1; // Barrera de segundos lcd.setCursor(0, 0); lcd.print("Temporizador con"); lcd.setCursor(0, 1); lcd.print("Arduino + LCD"); delay(2500); lcd.clear(); } void loop() { // LECTURA DE LOS BOTONES Y ELECCIÓN DEL TIEMPO, NO SALE DEL BUCLE HASTA PULSAR // EL BOTON DE ARRANQUE 13 de setiembre de 2023 do { varbuth digitalRead(buth); NOMBRE:= BRAYAN CUETO QUICHCA // Leemos el botón de horas varbutm = digitalRead(butm); // Leemos el botón de minutos 7 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica void loop() { // LECTURA DE LOS BOTONES Y ELECCIÓN DEL TIEMPO, NO SALE DEL BUCLE HASTA PULSAR // EL BOTON DE ARRANQUE do { varbuth = digitalRead(buth); // Leemos el botón de horas varbutm = digitalRead(butm); // Leemos el botón de minutos varbuts = digitalRead(buts); // Leemos el botón de segundos if (!varbuth && varbuthAnt) { // Si el botón es pulsado, aumentamos las horas ahoras++; if (ahoras > 23) ahoras = 0; delay(50); } varbuthAnt = varbuth; if (!varbutm && varbutmAnt) { // Si el botón es pulsado, aumentamos los minutos aminutos++; if (aminutos > 59) aminutos = 0; delay(50); } varbutmAnt = varbutm; if (!varbuts && varbutsAnt) { // Si el botón es pulsado, aumentamos los segundos asegundos++; if (asegundos > 59) asegundos = 0; delay(50); } varbutsAnt = varbuts; lcd.setCursor(0, 0); lcd.print("Digite el Tiempo"); // Mensaje y las HH:MM:SS que vayamos aumentando lcd.setCursor(4, 1); char buffer[30]; sprintf(buffer, "%02d:%02d:%02d", ahoras, aminutos, asegundos); lcd.print(buffer); } while (digitalRead(start) == 0); segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60); // Convierte el tiempo elegido en segundos while (segundostotal > 0) { delay(1000); segundostotal--; ahoras = (segundostotal / 3600); // Convierte los segundos totales en horas aminutos = (segundostotal / 60) % 60; // Convierte los segundos totales en minutos asegundos = segundostotal % 60; // Convierte los segundos totales en segundos lcd.setCursor(0, 0); lcd.print("Tiempo restante"); // Mostramos mensaje de tiempo restante lcd.setCursor(4, 1); char buffer[30]; sprintf(buffer, "%02d:%02d:%02d", ahoras, aminutos, asegundos); lcd.print(buffer); if (segundostotal == 0) { // Si finaliza el tiempo 13 de setiembre de 2023 while (1) { // Bucle infinito mostrando mensaje y haciendo parpadear un led NOMBRE: BRAYAN CUETO QUICHCA lcd.clear(); lcd.setCursor(5, 0); 8 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica lcd.print(buffer); if (segundostotal == 0) { // Si finaliza el tiempo while (1) { // Bucle infinito mostrando mensaje y haciendo parpadear un led lcd.clear(); lcd.setCursor(5, 0); lcd.print("Tiempo"); lcd.setCursor(3, 1); lcd.print("Finalizado"); digitalWrite(buzzer, HIGH); delay(200); digitalWrite(buzzer, LOW); delay(200); } } } } Figura 6 Circuito con el tiempo 0:0:0 segundo minutos y horas 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 9 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica Figura 7 Circuito con el tiempo 0:1:0 horas minutos y segundos respectivamente Figura 8 Circuito con el tiempo 1:1:0 horas minutos y segundos respectivamente 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 10 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica Figura 9 Circuito con el tiempo 1:1:0 horas minutos y segundos respectivamente Figura 10 Circuito con el tiempo 1:1:0 horas minutos y segundos respectivamente 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 11 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica Adjunto un video link: d. Modifique y explique el programa y para que se active el buzzer cuando se alcance la hora programada. (cuenta ascendente). #include <LiquidCrystal.h> // Inicialización de la pantalla LCD LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Definición de pines y variables int buzzer = 13; // Pin para el buzzer int asegundos = 0; // Variable para almacenar los segundos ingresados int segundostotal = 0; // Variable para el tiempo total int start = A1; // Pin del pulsador de inicio int buts = A3; // Pin del pulsador de segundos int varbutsAnt = 0; // Variable para seguimiento del pulsador void setup() { // Configuración inicial lcd.begin(16, 2); // Inicialización de la pantalla LCD pinMode(buzzer, OUTPUT); // Configura el pin del buzzer como salida pinMode(buts, INPUT); // Configura el pin del pulsador de segundos como entrada lcd.setCursor(0, 0); lcd.print("Temporizador con"); lcd.setCursor(0, 1); lcd.print("Arduino + LCD"); delay(2500); lcd.clear(); } void loop() { do { // Leer el pulsador de segundos int varbuts = digitalRead(buts); if (!varbuts && varbutsAnt) { asegundos++; if (asegundos > 59) asegundos = 0; // Reinicia los segundos si supera 59 delay(50); } varbutsAnt = varbuts; lcd.setCursor(0, 0); lcd.print("Digite el Tiempo"); lcd.setCursor(4, 1); char buffer[30]; sprintf(buffer, "00:00:%02d", asegundos); // Formato HH:MM:SS lcd.print(buffer); } while (digitalRead(start) == 0); // Espera hasta que se presione el botón de inicio segundostotal = asegundos; while (segundostotal < 60) { // Cuenta hasta 60 segundos (1 minuto) delay(1000); // Espera 1 segundo 13 de setiembre de 2023 segundostotal++; NOMBRE: BRAYAN CUETO QUICHCA asegundos = segundostotal; // Actualiza los segundos 12 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica while (segundostotal < 60) { // Cuenta hasta 60 segundos (1 minuto) delay(1000); // Espera 1 segundo segundostotal++; asegundos = segundostotal; // Actualiza los segundos lcd.setCursor(0, 0); lcd.print("Tiempo transcurrido"); lcd.setCursor(4, 1); char buffer[30]; sprintf(buffer, "00:00:%02d", asegundos); // Muestra el tiempo transcurrido lcd.print(buffer); if (segundostotal == 60) { // Cuando se alcanza 1 minuto digitalWrite(buzzer, HIGH); // Activa el buzzer } } } Figura 11 Circuito empezando de forma ascendente 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 13 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica Figura 12 Circuito con temporizador ascendente segundo 10 Figura 13 Circuito con temporizador ascendente segundo 60 donde finaliza y suena el buzzer 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 14 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica Figura 14 Circuito finalizado 5. CUESTIONARIO FINAL: 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 15 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 16 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 17 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 18 UNIVERSIDAD CÁTOLICA DE SANTA MARÍA Ingeniería Mecánica, Mecánica Eléctrica y Mecatrónica 6. CONCLUSIONES: • La función pinArray nos ayuda a usar los pines de manera más corta ya que crea una matriz el cual almacena los pines • Las instrucciones funcionan con la posición de la matriz mas no con los pines para que pueda funcionar en Arduino • Cuando usamos la matriz en un for usamos un contador para que pueda hacer el bucle con la posición de la matriz y así utilizar la instrucción deseada • La librería de Arduino nos ayuda a crear funciones y llamar funciones si en caso usamos librearías que no están en Arduino especificadas • Las corrientes d e restricción se ven en el datasheet del microcontrolador ATmega328P. 13 de setiembre de 2023 NOMBRE: BRAYAN CUETO QUICHCA 19