Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. /*  TITULO: Monedero electrónico con display LCD 1602
  2.  
  3.     AUTOR:
  4.    
  5.     MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA
  6.     - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia
  7.     - TWITTER: https://twitter.com/MarianoCampoGa
  8.     - CORREO: [email protected]
  9.    
  10.    
  11.     DESCRIPCIÓN DEL PROGRAMA
  12.    
  13.     Con este programa vamos a controlar el número de créditos (monedas de 50 céntimos de Euro) que
  14.     vamos a insertar por la ranura del monedero electrónico. El número de créditos únicamente
  15.     aumenta en una unidad cuando insertamos una moneda de 50 céntimos de Euro y disminuye en una
  16.     unidad cada vez que accionemos el pulsador. Cualquier otra moneda que insertemos en la ranura
  17.     del monedero será retornada y no se tendrá en cuenta como válida.
  18.    
  19.    
  20.  
  21.     ESQUEMA DE CONEXION
  22.    
  23.                                       +-----+
  24.          +----[PWR]-------------------| USB |--+
  25.          |                            +-----+  |
  26.          |         GND/RST2  [ ][ ]            |
  27.          |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |   SCL del módulo I2C conectado al LCD 1602
  28.          |          5V/MISO2 [ ][ ]  A4/SDA[ ] |   SDA del módulo I2C conectado al LCD 1602
  29.          |                             AREF[ ] |
  30.          |                              GND[ ] |
  31.          | [ ]N/C                    SCK/13[ ] |  
  32.          | [ ]IOREF                 MISO/12[ ] |  
  33.          | [ ]RST                   MOSI/11[ ]~|  
  34.          | [ ]3V3    +---+               10[ ]~|  
  35.          | [ ]5v    -| A |-               9[ ]~|  
  36.          | [ ]GND   -| R |-               8[ ] |  
  37.          | [ ]GND   -| D |-                    |
  38.          | [ ]Vin   -| U |-               7[ ] |  
  39.          |          -| I |-               6[ ]~|  
  40.          | [ ]A0    -| N |-               5[ ]~|  
  41.          | [ ]A1    -| O |-               4[ ] |  
  42.          | [ ]A2     +---+           INT1/3[ ]~|  PA
  43.          | [ ]A3                     INT0/2[ ] |  Pin COIN del Monedero Electrónico
  44.          | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |  
  45.          | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |  
  46.          |            [ ] [ ] [ ]              |
  47.          |  UNO_R3    GND MOSI 5V  ____________/
  48.           \_______________________/
  49.  
  50.   NOTAS:
  51.    - La alimentación y la masa del módulo LCM 1602 I2C V1 van directamente conectadas a VCC (+5V) y GND
  52.      respectivamente.
  53.      - Los pulsadores suelen tener dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos)
  54.    - Conexión PULL-DOWN del pulsador.
  55.        - PB conectado a VCC.
  56.        - PA conectado a GND a través de una R=10K ohms.
  57.    - La alimentación (+12V) y la masa (GND)del monedero electrónico van directamente conectadas a +12VDC y GND
  58.      de la fuente de alimentación regulada de 12VDC respectivamente (Externa a nuestro Arduino).
  59. */
  60.  
  61.   // Importamos librerías
  62.   #include <Wire.h> // Librería comunicación I2C
  63.   #include <LiquidCrystal_I2C.h> // Librería LCD I2C
  64.  
  65.   // Declaración del objeto para el LCD
  66.   // Terminales de conexión del LCD
  67.   //                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
  68.   LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  69.  
  70.   int interrupcion = 2; // Pin digital para la interrupción (INT0)
  71.   int elimina_moneda = 3; // Pin digital para el botón que elimina un crédito
  72.   volatile int numero_monedas = -1; // Variable que almacena el número de créditos introducidos
  73.   int n = 0 ; // Variable auxiliar
  74.  
  75.   void setup()
  76.   {  
  77.     lcd.begin(16,2);   // Inicializa el LCD para 16x2  
  78.     pinMode(interrupcion, INPUT_PULLUP); // Pin digital 2 como entrada
  79.     pinMode(elimina_moneda, INPUT); // Pin digital 3 como entrada
  80.     // Interrupción 0 (INT0) por el pin digital 2 que activa la ISR en cada flanco de subida
  81.     attachInterrupt(digitalPinToInterrupt(interrupcion), ServicioMonedero, RISING);
  82.     lcd.setCursor(0,0);
  83.     lcd.write("Inserte monedas");
  84.     lcd.setCursor(0,1);  
  85.     lcd.print("Creditos: 0");
  86.   }
  87.  
  88.   void loop()
  89.   {
  90.     // Si se produce un cambio en el número de créditos
  91.     if(n != numero_monedas)
  92.     {
  93.       lcd.setCursor(0,1);  
  94.       lcd.print("Creditos: ");
  95.       lcd.print(numero_monedas);
  96.       n = numero_monedas;
  97.     }
  98.    
  99.     // Si se acciona el pulsador
  100.     if(digitalRead(elimina_moneda) == HIGH)
  101.     {
  102.       if(numero_monedas > 0)
  103.       {
  104.         // Se reduce en una unidad el número de créditos
  105.         numero_monedas--;
  106.       }  
  107.       delay(200); // Evita los rebotes del pulsador
  108.     }  
  109.   }
  110.  
  111.   void ServicioMonedero() // ISR: Rutina de Servicio a la Interrupción
  112.   {
  113.     // Se aumenta en una unidad el número de créditos  
  114.     numero_monedas++;
  115.     delay(100);
  116.   }