En este post os traigo un sencillísimo monedero electrónico, que dotaremos de un display LCD 1602 con comunicación I2C, para que a través de este, Arduino nos muestre el número de créditos o monedas que vamos insertando a través de la ranura que el monedero electrónico tiene.
Tomaremos como moneda de referencia la de 50 céntimos de Euro, aunque podría ser cualquier otra, por lo que si insertamos cualquier moneda diferente, esta será rechazada por el monedero electrónico y por lo tanto no se tendrá en cuenta un nuevo crédito.
Además este pequeño sistema está dotado de un pulsador, mediante el cual, seremos capaces de bajar un crédito del contador de créditos que muestra el display LCD 1602, cada vez que lo pulsemos.
El funcionamiento del programa es muy simple, es decir, vamos a utilizar la interrupción 0 de Arduino (INT 0), que es la que se va a producir a través del pin digital 2 de Arduino, al que le hemos conectado la señal “COIN” del monedero electrónico.
Por lo tanto, cada vez que se detecte en el monedero una moneda de 50 céntimos de Euro, este manda una señal de nivel alto (HIGH) a Arduino. De esta forma se producirá la interrupción del sistema y se ejecute la Rutina de Servicio a la Interrupción (ISR) que es donde tenemos programado que se incremente en una unidad la cantidad de créditos.
Por otro lado, si presionamos el pulsador con conexión PULL-DOWN, es decir, cambia de nivel bajo (LOW) a alto (HIGH) cada vez que lo pulsemos (aunque a estas alturas ya hemos trabajado multitud de veces con este recurso) para disminuir en una unidad el número de créditos. Como el programa está refrescando constantemente los valores del display LCD 1602, en todo momento tendremos un valor actualizado de los créditos con los que contamos.
Por último cabe decir que el display LCD 1602 le hemos conectado a nuestro Arduino a través de comunicación I2C, soldándole a sus pines el módulo LCM 1602 I2C V1 como ya hemos visto también en POST anteriores.
Lista de Materiales
- Arduino UNO Rev.3
- Cable USB tipo A-B
- Monedero electrónico simple (marca SG)
- Módulo LCM 1602 I2C V1
- Display 16×2 LCD 1602
- Pulsador
- Resistencia de 10KΩ
- Fuente de alimentación regulada de 12VDC
- Monedas de EURO de diferente denominación
- Protoboard
- Cables de conexión
Código del programa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
/* TITULO: Monedero electrónico con display LCD 1602 AUTOR: MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia - TWITTER: https://twitter.com/MarianoCampoGa - CORREO: [email protected] DESCRIPCIÓN DEL PROGRAMA Con este programa vamos a controlar el número de créditos (monedas de 50 céntimos de Euro) que vamos a insertar por la ranura del monedero electrónico. El número de créditos únicamente aumenta en una unidad cuando insertamos una moneda de 50 céntimos de Euro y disminuye en una unidad cada vez que accionemos el pulsador. Cualquier otra moneda que insertemos en la ranura del monedero será retornada y no se tendrá en cuenta como válida. ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | SCL del módulo I2C conectado al LCD 1602 | 5V/MISO2 [ ][ ] A4/SDA[ ] | SDA del módulo I2C conectado al LCD 1602 | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | | [ ]IOREF MISO/12[ ] | | [ ]RST MOSI/11[ ]~| | [ ]3V3 +---+ 10[ ]~| | [ ]5v -| A |- 9[ ]~| | [ ]GND -| R |- 8[ ] | | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | | -| I |- 6[ ]~| | [ ]A0 -| N |- 5[ ]~| | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| PA | [ ]A3 INT0/2[ ] | Pin COIN del Monedero Electrónico | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ NOTAS: - La alimentación y la masa del módulo LCM 1602 I2C V1 van directamente conectadas a VCC (+5V) y GND respectivamente. - Los pulsadores suelen tener dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos) - Conexión PULL-DOWN del pulsador. - PB conectado a VCC. - PA conectado a GND a través de una R=10K ohms. - La alimentación (+12V) y la masa (GND)del monedero electrónico van directamente conectadas a +12VDC y GND de la fuente de alimentación regulada de 12VDC respectivamente (Externa a nuestro Arduino). */ // Importamos librerías #include <Wire.h> // Librería comunicación I2C #include <LiquidCrystal_I2C.h> // Librería LCD I2C // Declaración del objeto para el LCD // Terminales de conexión del LCD // addr, en,rw,rs,d4,d5,d6,d7,bl,blpol LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); int interrupcion = 2; // Pin digital para la interrupción (INT0) int elimina_moneda = 3; // Pin digital para el botón que elimina un crédito volatile int numero_monedas = -1; // Variable que almacena el número de créditos introducidos int n = 0 ; // Variable auxiliar void setup() { lcd.begin(16,2); // Inicializa el LCD para 16x2 pinMode(interrupcion, INPUT_PULLUP); // Pin digital 2 como entrada pinMode(elimina_moneda, INPUT); // Pin digital 3 como entrada // Interrupción 0 (INT0) por el pin digital 2 que activa la ISR en cada flanco de subida attachInterrupt(digitalPinToInterrupt(interrupcion), ServicioMonedero, RISING); lcd.setCursor(0,0); lcd.write("Inserte monedas"); lcd.setCursor(0,1); lcd.print("Creditos: 0"); } void loop() { // Si se produce un cambio en el número de créditos if(n != numero_monedas) { lcd.setCursor(0,1); lcd.print("Creditos: "); lcd.print(numero_monedas); n = numero_monedas; } // Si se acciona el pulsador if(digitalRead(elimina_moneda) == HIGH) { if(numero_monedas > 0) { // Se reduce en una unidad el número de créditos numero_monedas--; } delay(200); // Evita los rebotes del pulsador } } void ServicioMonedero() // ISR: Rutina de Servicio a la Interrupción { // Se aumenta en una unidad el número de créditos numero_monedas++; delay(100); } |