miércoles, 8 de junio de 2016

Monedero electrónico con display LCD 1602


Hoy 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.

Monedero Electrónico

Una de las grandes ventajas de este monedero electrónico, es que rechaza las monedas falsas, monedas dobladas y arandelas, además de tener gran precisión cuando tiene que diferenciar dos monedas de tamaño muy similar pero de diferente denominación. Requiere de una fuente de alimentación regulada de 12VDC para su funcionamiento, es decir, para que su circuitería interna y el solenoide estén correctamente alimentados (Pines +12VDC y GND). El monedero nos entregará un pulso eléctrico de unos 2-3VDC a través de su pin “COIN”, cada vez que insertemos una moneda correcta en su interior, y será el encargado de habilitar la interrupción INT0 (pin digital 2) en nuestro Arduino. Este monedero también está dotado de un pin de salida denominado “COUNTER” que se encarga de enviar un pulso, que pueda ser leído por un contador electrónico externo, cada vez que insertamos la moneda correcta, aunque en este POST no lo vamos a utilizar. Mediante el interruptor NC/NO podemos seleccionar en qué niveles lógicos va a trabajar el pulso de salida del monedero, es decir, o estado normalmente abierto (NO) o normalmente cerrado (NC).  Si seleccionamos NO el monedero cuando está en espera se mantiene todo el tiempo entregando un voltaje en su salida (ALTO). Al momento que recibe una moneda correcta, el monedero corta el voltaje momentáneamente (BAJO) y vuelve a su estado NO en el que entrega voltaje (ALTO). De lo contrario si seleccionamos NC el monedero cuando está en espera, se encuentra en estado cerrado (BAJO) y no entrega ningún voltaje o pulso. Al momento de recibir una moneda correcta, entrega un pulso (ALTO) y luego vuelve a su estado NC, en el que no entrega ningún voltaje (BAJO).


Alimentación, salidas e interruptor de niveles lógicos

Este monedero puede ser configurado instantáneamente para aceptar prácticamente cualquier denominación de moneda al tiempo que rechaza todas los demás. La configuración para la aceptación de las monedas se establece mediante la inserción de una denominación de la moneda en un espacio llamado “CUNA”, que es donde yo he insertado la moneda de 50 céntimos de Euro.

Cuna del monedero electrónico

También, mediante otro interruptor, podemos seleccionar  la velocidad correcta de aceptación de la moneda, en definitiva, la velocidad del pulso de salida (pin COIN). Esta velocidad de pulso se encuentra entre los 100 milisegundos (SLOW/ velocidad lenta / pulso largo), 50 milisegundos (MEDIUM / velocidad media / pulso medio) y 30 milisegundos (FAST / velocidad rápida / Pulso corto). En lo personal siempre trabajo con 100 milisegundos (SLOW), ya que tras varias pruebas es la velocidad más correcta para trabajar con nuestro Arduino.

Interruptor para las velocidades del pulso

Con el potenciómetro de la parte superior del monedero, se ajusta la tolerancia de aceptación de monedas, para una aceptación más o menos estricta (STRICT / más estricta o SLACK / menos estricta).
Potenciómetro de aceptación de monedas

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, para que se produzca 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 16x2 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:



Video:

33 comentarios:

  1. Hola. me gustaria hacerte una consulta.
    el monedero si pierde la corriente se borraria?
    estoy tratando de hacer algo que guarde la cuenta de monedas incluso si se va la corriente.
    gracias

    ResponderEliminar
    Respuestas
    1. Tienes que utilizar una tarjeta SD o una EEPROM I2C para poder almacenar la información. Saludos

      Eliminar
  2. Hola que tal?
    Lo que pasa es que quisiera saber si este monedero acepta mas de un tipo de moneda a la vez?
    Hablando de pesos mexicanos, que acepte de un 1 peso,2 pesos, 5 y 10 pesos como ejemplo.
    Estoy haciendo un proyecto pero requiero de un monedero y asi como el tuyo conectado a arduino, y asu vez lo voy a conectar con JAVA para poder almacenar los datos como una base de datos MYSQL.
    Solo necesito saber si me acepta mas de un tipo de moneda y como saber que tipo de moneda ingresaron, seria de grana ayuda tu aporte. Saludos

    ResponderEliminar
    Respuestas
    1. Este monedero es el modelo más básico y solo acepta monedas de un tipo a la vez, es decir, solamente acepta la moneda que tengas insertada en la cuna del monedero y no otras. Saludos

      Eliminar
  3. buenas tardes si requiero pagar un producto $5.00 en monedas de $1.00 y quiero que la cuenta vaya decreciendo

    ResponderEliminar
    Respuestas
    1. Crea una variable llamada total con el valor de 5$ y la vas restando una unidad cada vez que el monedero envie un pulso al introducir una moneda de 1$. Saludos

      Eliminar
  4. tengo un proyecto identico en la escuela, la pregunta es se ¿puede dar cambio ???

    ResponderEliminar
    Respuestas
    1. No puede dar cambio. Este monedero es exclusivamente de entrada de monedas y no dispone de cajetín para salida de monedas. Saludos

      Eliminar
  5. Que tal Mariano, disculpa si no cuento con una LCD me serviría tu código de programación?Espero de tu ayuda excelente trabajo!

    ResponderEliminar
  6. Claro que si te valdria, pero tendrias que cambiar el codigo de la parte del LCD por enviarlo al monitor serie, es decir, pasar de LCD.print a Serial.print. Saludos

    ResponderEliminar
    Respuestas
    1. Excelente muchas gracias por responder, espero me puedas ayudar a lo siguiente, cuando tenga disponibles "X" créditos guardados, quisiera que al presionar el pulsador este reste el crédito como se muestra, pero a la vez accione un servomotor por tanto tiempo, (el servomotor me ayudara a mover un cigarrillo en una dispensadora) espero me puedas ayudar con la programación te lo agradecería demaciado. Muchas gracias e igualmente Saludos.

      Eliminar
  7. Simplemente en la parte del codigo donde evaluas que has presionado el pulsador que elimina un credito (dentro del if) activas el servo de 360 grados, aplicas un delay del tiempo que necesites y posteriormente paras el servo. Como puedes ver es muy simple. Saludos

    ResponderEliminar
  8. Valla muchas gracias en verdad, me ayudaste demaciado con esto, Saludos y espero poder mostrarte el proyecto ya concluido.

    ResponderEliminar
  9. Hola Mariano...

    Agregaste algún circuito adicional al diseño?, el arduino no me esta detectando el pulso a la entrada, en mi circuito tengo conectado el cable de pulso coin, al puerto 12 configurado como input y solo quiero que encienda un led una vez que detecte el pulso (moneda).

    ResponderEliminar
    Respuestas
    1. Si realizas las conexiones y programación tal cual te tiene que funcionar porque no he utilizado ningún circuito ni nada a mayores de lo que se muestra en el POST. Te recomiendo repasar todo desde el principio que la mayoría de las veces son despistes o fallos tontos. SALUDOS

      Eliminar
  10. hola que tal trate de rpobar tu programa y me marca error en una varia , ademas tengo una duda yo tengo una lcd sin luz eso cambia? o la puedo usar igual ya q llevo varios intentos usando interfas i2c y no funciona

    ResponderEliminar
    Respuestas
    1. El error al compilar te aparece porque no estás utilizando las librerías correctas. Las tienes en uno de los primeros POST del BLOG (Diciembre 2015). El LCD no importa que tenga o no Backlight. Saludos

      Eliminar
  11. Hola que tal amigo, tengo un problema, use tu codigo tal cual mas sin embargo cada que pasa una modena no marca "1" credito marca cientos de veces mas no se un "23434" y a veces hasta numeros negativos, no te paso algo similar?

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. Me pasaba lo mismo; alimenta el monedero y el arduino a la misma fuente pero con un regulador de 12V-5V para que todo se alimente de la misma fuente.

      Ese error me sucede al cargar el programa y alimentar el arduino desde la pc y el monedero desde una fuente exterior (12V), al parecer necesitan tener la misma masa para que el arduino detecte el pulso.

      Por cierto, lo hice funcionar con la SHIELD LCD y de maravilla.

      Eliminar
  12. Respuestas
    1. Instala el IDE 1.6.4 y mis librerías de los primeros POST de mi BLOG (Diciembre 2015)

      Eliminar
  13. Una pregunta, si tengo un producto de $5 ¿Cómo hago para restarle esos 5 pesos de un pulso?

    ResponderEliminar
  14. Restando 5 unidades a la variable que almacena el total en vez de 1 unidad

    ResponderEliminar
    Respuestas
    1. Seria algo asi variable -=5?, en netbeans puedo hacer eso, creo que también en el launcher ya que es el mismo lenguaje, no hagas caso al otro comentario

      Eliminar
  15. Que hay amigo, oye tengo la LCD con el Modulo y ya agregue las librerias pero me sale un error al compilar tu programa, dice: "exit status 1 'POSITIVE' was not declared in this scope." Que crees que pueda ser? espero puedas ayudarme Saludos!

    ResponderEliminar
    Respuestas
    1. http://miarduinounotieneunblog.blogspot.com.es/2015/12/anadiendo-las-librerias.html?m=1

      Eliminar
  16. SOn las librerias, intenta descargarte la libreria Wire y LiquidCrystal_I2C y en el objeto solo pone lcd (0x27, 16, 2);

    ResponderEliminar
    Respuestas
    1. Son las librerías como bien argumentas. Hay muchas veces que respondo a la gente por email y no sale la solución aquí, el motivo no lo se. Gracias de todas formas. http://miarduinounotieneunblog.blogspot.com.es/2015/12/anadiendo-las-librerias.html?m=1

      Eliminar
  17. Recomiendo pasaros por el siguiente enlace. http://miarduinounotieneunblog.blogspot.com.es/2015/12/display-lcd-16x2-con-comunicacion-i2c.html?m=1

    ResponderEliminar
  18. buenas tardes excelente tu proyecto, yo estoy haciendo algo similar pero necesito que cuando le engrese una moneda el me active un motor por cierto tiempo como me podrias ayudar con eso??? gracias

    ResponderEliminar