Texto en LCD con Arduino
Título | Texto en LCD con Arduino |
---|---|
Tipo de Proyecto | Proyecto de Curso |
Palabras Clave | objetoeducativo |
Período | 2022-2022 |
Asignatura | Interacción y Performatividad |
Del Curso | Interacción y Performatividad 2022 |
Carreras | Diseño, Diseño Industrial"Diseño Industrial" is not in the list (Arquitectura, Diseño, Magíster, Otra) of allowed values for the "Carreras Relacionadas" property. |
Alumno(s) | Gabriela Alliendes, Francisca Estay, Emily Hutt Fontt |
Profesor | Renzo Varela |
Texto en LCD con Arduino
El proyecto es un objeto de interacción educativo que busca mostrar expositivamente la confección de sus componentes que requiere para su funcionamiento, en este caso, un objeto que a través de una pantalla se muestra información recibida de un teclado.
Partes
Cada parte que compone el sistema expuesto se encuentra nombrada en el cuadro, en el caso del teclado magistral está acompañado por un esquema que muestra lo que representa cada tecla, en este caso se encuentran configuradas para ser letras.
Contenido
Componentes
El objeto esta construido a partir de un Arduino, una pantalla LCD y un teclado magistral 3x4.
Un Arduino es una placa con circuitos integrados en donde se puede grabar instrucciones a través del lenguaje de programación, códigos. Este posee una interfaz de entrada, en donde se puede conectar en la placa diferentes tipos de periféricos. La información que se conecte se trasladará al microcontrolador, el cual es encargado de procesar los datos.
El tipo de periférico que se utilice para enviar datos dependerá del uso que se le quiere dar, en este caso será un teclado magistral de 3x4 para introducir datos.
Por otro lado, esta el interfaz de salida, que se encarga de trasladar la información procesada en el Arduino a otro periférico, en este caso será una pantalla LCD.
La pantalla LCD tiene en ella un conector I2C, o tambien llamado bus I2C; uno de los principales sistemas de comunicación en Arduino, el cual es un bus de comunicación en serie.
En la pantalla LCD el conector I2C esta soldado a todos los pines, y la comunicación al Arduino es a través de los pines SDA y SCL (datos seriales y reloj serial). EL Arduino tiene pines asociados a la conexión I2C de la pantalla LCD, estos pueden variar según el modelo de Arduino. El Arduino utilizado es el Uno, por lo que la asociación de pines es la siguiente:
- SDA – A4
- SCL – A5
La alimentación se hace a través de 5V y GND, y la comunicación a través de SDA y SCL.
Conexión pantalla LCD y Arduino
Para comprobar la conexión entre la pantalla LCD y Arduino, se utilizó la siguiente programación, con la librería LiquidCrystal_I2C, similar a la librería LiquidCrystal de Arduino.
#include <Wire.h> #include <LiquidCrystal_I2C.h> //Crear el objeto lcd dirección 0x3F y 16 columnas x 2 filas LiquidCrystal_I2C lcd(0x3F,16,2); // void setup() { // Inicializar el LCD lcd.init(); //Encender la luz de fondo. lcd.backlight(); // Escribimos el Mensaje en el LCD. lcd.print("Hola Mundo"); } void loop() { // Ubicamos el cursor en la primera posición(columna:0) de la segunda línea(fila:1) lcd.setCursor(0, 1); // Escribimos el número de segundos trascurridos lcd.print(millis()/1000); lcd.print(" Segundos"); delay(100); }
[un paso que no se realizo fue el “Scanner”. Como se investigó, el Arduino es el maestro ya que este es el controlador que trata la información, el enviara la información cuando sea indicado, y la pantalla es la que recibe esta información, por lo que se le llama el esclavo. Para esto, se debe identificar la dirección del esclavo para poder enviar la información. Para esto se debe descargar un programa y de esta manera se identificaba aquella dirección para poder enviar la información deseada a la pantalla. Creemos que, por falta de este paso, no funciono el trabajo]
Programación texto en LCD
Para el uso del teclado magistral y su conexión al Arduino, se requiere de la configuración a continuación (este no incluye la conexión de la pantalla LCD).
Se debe configurar la librería “Keypad.zip” para definir los 7 pines de Arduino que conformaran el teclado, las 4 líneas y las 3 columnas. Las constantes son:
#include "Keypad.h" const byte ROWS = 4; //four rows const byte COLS = 3; //three columns char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} };
Para los valores de los pulsadores y la asignación de pines que corresponde con los del Arduino, se debe “reservar” memoria en bytes, con las siguientes constantes:
byte rowPins[ROWS] = {5, 4, 3, 2}; //conecta los pinouts row del keypad byte colPins[COLS] = {8, 7, 6}; //conecta los pinouts column del keypad
Al definir el teclado, el programa generara una matriz del teclado para la representación de los dígitos:
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
Para el uso del teclado, se definirá una serie de dígitos los que serán visualizados como una clave. Se utiliza la asignación “char” para almacenar los bytes de las matrices:
char PIN[6]={'1','2','3','4','5','6'}; // o numero secreto (!) char attempt[6]={0,0,0,0,0,0}; // usado para comparar
Configuración para la conexión de los tres componentes principales
Para el uso de todos los componentes, con el fin de lograr escribir textos en la pantalla LCD a través de un teclado magistral, se utiliza la siguiente configuración. (El objetivo principal del código a continuación es poder configurar una contraseña con todos los elementos seleccionados.)
Para el funcionamiento de la pantalla LCD se requiere de la librería “LiquidCrystal”.
#include <Password.h> #include <LiquidCrystal.h> #include <Keypad.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12); Password password = Password( "1234456" ); const byte ROWS = 4; // Cuatro rows const byte COLS = 3; // Tres columns // Define el Keymap char keys[ROWS][COLS] = { {'1','2','3',}, {'4','5','6',}, {'7','8','9',}, {'*','0',' ',} }; // Conectar keypad ROW0, ROW1, ROW2 y ROW3 a los pines de Arduino. byte rowPins[ROWS] = {5, 4, 3, 2}; // pines a conectar los row del teclado. byte colPins[COLS] = {16, 15, 14}; // AN0, AN1 y AN2. Por falta de pines const int buttonPin = 6; // int buttonState = 0; int i; int sal1 = 17; // pin A4 salida a rele int sal2 = 18; // pin A5 salida a rele // Crear el Keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void setup() { pinMode(buttonPin, INPUT); pinMode(sal1, OUTPUT); pinMode(sal2, OUTPUT); lcd.begin(20, 4); Serial.begin(9600); keypad.addEventListener(keypadEvent); //añad. un evento listener para el keypad keypad.setDebounceTime(250); lcd.clear(); //Borra el LCD lcd.setCursor(0,0); lcd.print("Entre secuencia PIN:"); lcd.setCursor(2,2); lcd.print("* Para terminar"); lcd.setCursor(0,3); lcd.print(" Intentelo: "); } void loop() { keypad.getKey(); buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { lcd.clear(); } } // atender algunos eventos especiales void keypadEvent(KeypadEvent eKey) { switch (keypad.getState()) { case PRESSED: lcd.print(eKey); switch (eKey) { case ' ': guessPassword(); break; default: password.append(eKey); } } } void guessPassword() { if (password.evaluate()) { digitalWrite(sal1, HIGH); // activa relé1 de la puerta digitalWrite(sal2, LOW); // desactiva relé2 de la puerta lcd.clear(); lcd.setCursor(0,0); lcd.print("PASSWORD VALIDO "); // password.reset(); //resetea password despues de entrada correcta delay(1000); lcd.setCursor(0,0); lcd.print("Bienvenido, Sr."); delay(1000); for (int positionCounter = 0; positionCounter < 22; positionCounter++) { // scroll one position right: lcd.scrollDisplayRight(); // espera un poco delay(150); } delay(35000); // espera 35 segundos antes de volver añ inicio setup(); // al inicio } else { i = i++; digitalWrite(ledPin,LOW); digitalWrite(sal1, LOW); digitalWrite(sal2, HIGH); lcd.clear(); lcd.print("PASSWORD INVALIDO "); password.reset(); //resets password after INCORRECT entry delay(2000); // tiempo de retardo lcd.clear(); lcd.setCursor(0,2); lcd.print(" Intentelo: "); } if (i==3) { lcd.setCursor(0,1); lcd.print("Lo siento... "); lcd.setCursor(0,2); lcd.print("Intentelo mas tarde"); delay(30000); lcd.clear(); lcd.setCursor(0,2); lcd.print(" Intentelo: "); i=0; } }
Códigos
Código funcionamiento pantalla LCD
Como se menciono anteriormente, el siguiente código se utilizo para verificar el funcionamiento de la pantalla LCD, conectado al Arduino.
#include <Wire.h> #include <LiquidCrystal_I2C.h> //Crear el objeto lcd dirección 0x3F y 16 columnas x 2 filas LiquidCrystal_I2C lcd(0x3F,16,2); // void setup() { // Inicializar el LCD lcd.init(); //Encender la luz de fondo. lcd.backlight(); // Escribimos el Mensaje en el LCD. lcd.print("Hola Mundo"); } void loop() { // Ubicamos el cursor en la primera posición(columna:0) de la segunda línea(fila:1) lcd.setCursor(0, 1); // Escribimos el número de segundos trascurridos lcd.print(millis()/1000); lcd.print(" Segundos"); delay(100); }
Código para escribir texto en pantalla LCD
#include <Password.h> #include <LiquidCrystal.h> #include <Keypad.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12); Password password = Password( "1234456" ); const byte ROWS = 4; // Cuatro rows const byte COLS = 3; // Tres columns // Define el Keymap char keys[ROWS][COLS] = { {'1','2','3',}, {'4','5','6',}, {'7','8','9',}, {'*','0',' ',} }; // Conectar keypad ROW0, ROW1, ROW2 y ROW3 a los pines de Arduino. byte rowPins[ROWS] = {5, 4, 3, 2}; // pines a conectar los row del teclado. byte colPins[COLS] = {16, 15, 14}; // AN0, AN1 y AN2. Por falta de pines const int buttonPin = 6; // int buttonState = 0; int i; int sal1 = 17; // pin A4 salida a rele int sal2 = 18; // pin A5 salida a rele // Crear el Keypad Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void setup() { pinMode(buttonPin, INPUT); pinMode(sal1, OUTPUT); pinMode(sal2, OUTPUT); lcd.begin(20, 4); Serial.begin(9600); keypad.addEventListener(keypadEvent); //añad. un evento listener para el keypad keypad.setDebounceTime(250); lcd.clear(); //Borra el LCD lcd.setCursor(0,0); lcd.print("Entre secuencia PIN:"); lcd.setCursor(2,2); lcd.print("* Para terminar"); lcd.setCursor(0,3); lcd.print(" Intentelo: "); } void loop() { keypad.getKey(); buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { lcd.clear(); } } // atender algunos eventos especiales void keypadEvent(KeypadEvent eKey) { switch (keypad.getState()) { case PRESSED: lcd.print(eKey); switch (eKey) { case ' ': guessPassword(); break; default: password.append(eKey); } } } void guessPassword() { if (password.evaluate()) { digitalWrite(sal1, HIGH); // activa relé1 de la puerta digitalWrite(sal2, LOW); // desactiva relé2 de la puerta lcd.clear(); lcd.setCursor(0,0); lcd.print("PASSWORD VALIDO "); // password.reset(); //resetea password despues de entrada correcta delay(1000); lcd.setCursor(0,0); lcd.print("Bienvenido, Sr."); delay(1000); for (int positionCounter = 0; positionCounter < 22; positionCounter++) { // scroll one position right: lcd.scrollDisplayRight(); // espera un poco delay(150); } delay(35000); // espera 35 segundos antes de volver añ inicio setup(); // al inicio } else { i = i++; digitalWrite(ledPin,LOW); digitalWrite(sal1, LOW); digitalWrite(sal2, HIGH); lcd.clear(); lcd.print("PASSWORD INVALIDO "); password.reset(); //resets password after INCORRECT entry delay(2000); // tiempo de retardo lcd.clear(); lcd.setCursor(0,2); lcd.print(" Intentelo: "); } if (i==3) { lcd.setCursor(0,1); lcd.print("Lo siento... "); lcd.setCursor(0,2); lcd.print("Intentelo mas tarde"); delay(30000); lcd.clear(); lcd.setCursor(0,2); lcd.print(" Intentelo: "); i=0; } }