Calculadora con arduino


En este post crearemos una calculadora con las funciones básicas (+, -, *, /) usando un lcd2x16, un teclado4x4 y un arduino

oscar Escrito por oscar 31 July 2019 38190 1

Una de las practicas mas comunes en las que se usan un teclado 4x4 y un lcd 2x16 es en crear una calculadora con las funciones básicas, este ejercicio permite mejorar las habilidades de uso con el teclado, el lcd y el arduino permitiendo mejorar los conocimientos electrónicos y de programación.

Antes de empezar

Para realizar el proyecto vamos a usar pocos materiales los cuales se describen en la siguiente tabla, pero debemos tener en cuenta los conocimientos previos que necesitamos para poder realizar el proyecto y es básicamente conocer la funcionalidad del teclado y el lcd.

En el post de LCD 2x16 se explica cuales son los pines y el uso de la librería liquidcrystal.h que es la encargada de escribir en el lcd, en este post encontrara también las conexiones que se realizan con el arduino y un código de ejemplo.

El el post del teclado 4x4 se explica la conexión del mismo al arduino, ademas del uso de la librería Keypad.h, en este post encontrara un código de ejemplo con el que puede validar el funcionamiento del teclado.

Materiales

Para este proyecto vamos a usar los siguientes componentes, que son los básicos con las que se enseñan la programación de arduino.

Material Cantidad Descripción
Arduino leonardo 1 Controlador del proyecto
LCD 2x16 1 Se esta usando el lcd con la conexión de todos los pines, pero si pueden conseguir el lcd 2x16 que usa comunicación I2C les sera mas fácil trabajar.
Teclado 4x4 1 El teclado de 16 botones nos da las suficientes funciones para poder generar las opciones básicas de la calculadora
Cables de conexión 15 Cables tipo macho a macho
Resistencias 1KΩ 1 Proteccion del led del lcd y de pin 5(RW)

Conexión del lcd

Primero trabajaremos con la conexión del LCD, realizaremos un par de pruebas para verificar que este mostrando los textos, pueden guiarse con el post del LCD, lo único diferente es que se cambiaron los pines de conexión, pero abajo encontraran una tabla en donde esta la relación de conexión del lcd al arduino.

Número Pines del LCD Descripción Conexión al Arduino
1 Vss (GND) Tierra de la pantalla N/A
2 Vdd (+5V Alimentación del LCD N/A
3 Vee Control de contraste N/A
4 RS Selector entre comandos y datos 9
5 RW Escritura y lectura de datos GND
6 EN Sincronización de lectura de datos 8
11 D4 Pin de datos 10
12 D5 Pin de datos 11
13 D6 Pin de datos 12
14 D7 Pin de datos 13
15 BL + Alimentación luz de fondo (+5V) N/A
16 BL + GND luz de fondo N/A

Estas son unas imágenes de los planos y una foto de como queda la conexión de esta primera parte

Conexión LCD breadboard
Conexión LCD breadboard
Conexión LCD schem
Conexión LCD schem
Conexión LCD
Conexión LCD

Conexión teclado

La conexión del teclado es muy fácil, a continuación tenemos los planos y la tabla de donde indica a que pines del arduino debe conectarse. Este es el post de como conectar el teclado 4x4 en arduino.

Pines arduino Pines teclado
7 1
6 2
5 3
4 4
3 5
2 6
1 7
0 8
Conexión teclado breadboard
Conexión teclado breadboard
Conexión teclado schem
Conexión teclado schem

Distribución teclas

Para la calculadora vamos a colocar el teclado en la siguiente configuración de teclas como se observa en la siguiente imagen. Esta configuración también la realizaremos el el código para que al presionar la tecla correspondiente sea esta acción la que se realice en el código.

Distribución teclas
Distribución teclas

Conexión final del circuito

Una ves realizado el paso a paso de conectar el lcd y el teclado les quedara el circuito montado, solo resta realizar la ultima prueba de funcionalidad que es al presionar cualquier tecla, esta se vera reflejada en la pantalla.

Conexión lcd con teclado breadboard
Conexión lcd con teclado breadboard
Conexión lcd con teclado schem
Conexión lcd con teclado schem

Código

A continuación, tenemos el código con la calculadora funcionando.

#include <Keypad.h>
#include <LiquidCrystal.h>

const byte ROWS = 4;
const byte COLS = 4;

char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', '+'},
{'4', '5', '6', '-'},
{'7', '8', '9', '*'},
{'X', '0', '=', '/'}
};

byte rowPins[ROWS] = {3, 2, 1, 0};
byte colPins[COLS] = {7, 6, 5, 4};

LiquidCrystal lcd(9, 8, 10, 11, 12, 13);
Keypad myKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

boolean valorActual = false;
boolean siguiente = false;
boolean final = false;
String num1, num2,num3;
int total;
int movimiento;
char op;

void setup(){
    lcd.begin(16,2);
    lcd.setCursor(0,0);
    lcd.print("@codelectronica");
    lcd.setCursor(0,1);
    lcd.print("@OscarDevOps");
    delay(2500);
    lcd.clear();
}

void loop(){
    char key = myKeypad.getKey();
    if (key != NO_KEY && (key=='1'||key=='2'||key=='3'||key=='4'||key=='5'||key=='6'||key=='7'||key=='8'||key=='9'||key=='0')){
    if (valorActual != true){
        num1 = num1 + key;
        int numLength = num1.length();
        movimiento = numLength;
        lcd.setCursor(0, 0);
        lcd.print(num1);
    }
    else {
        num2 = num2 + key;
        int numLength = num2.length();
        lcd.setCursor(movimiento+1, 0);
        lcd.print(num2);
        final = true;
    }
    }

    else if (valorActual == false && key != NO_KEY && (key == '/' || key == '*' || key == '-' || key == '+')){
    if (valorActual == false){
        valorActual = true;
        op = key;
        lcd.setCursor(movimiento,0);
        lcd.print(op);
    }
    }

    else if (final == true && key != NO_KEY && key == '='){
    if (op == '+'){
        total = num1.toInt() + num2.toInt();
    }
    else if (op == '-'){
        total = num1.toInt() - num2.toInt();
    }
    else if (op == '*'){
        total = num1.toInt() * num2.toInt();
    }
    else if (op == '/'){
        if(num2.toInt()==0){
        total = ' ';
        }else{
        total = num1.toInt() / num2.toInt();
        }
    }
    num3=String(total);
    lcd.clear();
    lcd.setCursor(15,0);
    lcd.autoscroll();
    if(total==' '){
        lcd.print("Sintax Error");
    }else if(num3.length()>4){
        lcd.print("No hay memoria");
    }else{
        lcd.print(total);
    }
    lcd.noAutoscroll();
    }
    else if (key != NO_KEY && key == 'X'){
        lcd.clear();
        valorActual = false;
        final = false;
        num1 = "";
        num2 = "";
        total = 0;
        op = ' ';
    }
}

Comentario

Debe aceptar antes de enviar
brisa_coronado
brisa_coronado

22 November 2019 12:15

hesta pajina hesta zuper vuena