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:

59 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
    2. Hola BANGO GARCIA
      soy de Perú y quisiera contactarme con usted para hacerle algunas consultas x favor. Gracias. Mi correo yeraagresan@gmail.com. Escríbeme x favor. Me urge consultarte algunas cosas

      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. compa no me compila tu programa

    ResponderEliminar
    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
  19. Muy bien tu post, solo una pregunta intento hacer algo similar solo que al ingresar una moneda. Muestre datos desde sd ejemplo: inserto 1 moneda y me muestre una clave de la memoria

    ResponderEliminar
    Respuestas
    1. Si se puede hacer, pero controlando el manejo del lector/grabador de tarjetas SD.

      Eliminar
  20. tiene un error en la linea 83 de lcd.write hay que poner lcd.print(), y si no te compila tienes que poner despues de atach interrup(0,la funcion , change) ... el cero es para que utilice la primera interrupcion

    ResponderEliminar
    Respuestas
    1. El programa no tiene errores porque si los tuviera no habría podido subirlo a la placa y hacerlo funcionar como se muestra en el video. Esos "posibles errores" como tu dices que te aparecen es porque no estas utilizando las mismas librerías que yo, que aunque se llamen igual no tienen por que contener las mismas funciones y clases, ni estas utilizando el mismo IDE por lo que la programación puede cambiar levemente como a ti te ha sucedido...

      Eliminar
  21. BUENO PRIMERO GRACIAS POR DEDICAR TIEMPO A ESA LABOR EDUCATIVA Y DE COMPARTIR CONOCIMIENTO,DIOS TE BENDIGA

    ESTOY DESARROLANDO UN TEMPORIZADOR CON MONEDERO ,ESTA EXCELENTE TU PROPUESTA DEL PROGRAMA,SOLO QUE AL UTILIZAR LA FUNCION CON MI MONEDERO ME ARROJA VALORES MUY ALTOS EN CADA INTERRUPCION EN VEZ DE 1 ,ARROJA MILES EN PANTALLA.QUE CREES PUEDA SER LA CAUSA.SALUDOS DESDE GUADALAJARA .MEXICO

    ResponderEliminar
    Respuestas
    1. BIEN YA PUDE RESOLVER EL PROBLEMA. EL PRIMER PASO ES UNIFICAR LA ALIMENTACION DE 12 VOLTS QUE NECESITA EL MONEDERO Y LOS 5 VOLTS QUE ALIMENTA EL PULSADOR.QUE SEA LA MISMA GND (TIERRA). YA SEA QUE UTILICES UN REGULADOR DE LM7805 DE 12V A 5 V.SALUDOS Y GRACIAS.

      Eliminar
    2. Amigo me pasa lo mismo, tendrás algún diagrama pasa estudirlo

      Eliminar
  22. No tengo ni idea porque si tu monedero es diferente tendrás que informarte de como funciona y ajustarlo en la programacion...

    ResponderEliminar
  23. buen programa, no lo pude cargar al arduino tal como esta. lo modifique en el Void Setup por que no me refrescaba la pantalla. muchas gracias amigo. te pido de favor que me ayudes en este mismo sketch a mover un servo al presionar el botón.

    ResponderEliminar
    Respuestas
    1. Seria problema de que no estabas utilizando la dirección I2C correcta en el LCD. Para aprender a manejar un servo, pasate por el POST correspondiente de mi BLOG.

      Eliminar
  24. Hola, espero me puedas ayudar he copiado el Código pero cuando meto una moneda me marca de mas Créditos, meto una moneda y en lugar de que me marque una moneda me marco 2 o hasta 3 monedas como si se saltara. Gracias

    ResponderEliminar
    Respuestas
    1. Me pasa lo mismo, pudiste arreglar el problema??

      Eliminar
    2. a mi me pasó lo mismo y lo que hice fue cambiar de la interrupción 0 a la 1, vale decir del puerto 2 al 3 del arduino.

      Eliminar
  25. Hola, tiene como poner un reloj de tiempo, para que se quede encedido un rele? y un Boton Pulsador Arranque? Saludos desde Brazil!!!!

    ResponderEliminar
  26. Amigo que tal, al ingresar una moneda me marca cientos de créditos y están alimentados por la misma fuente mi arduino y el monedero, solo que estoy usando una fuente para pc.

    El cable que da 5volts no puede hacer que se vea el lcd, sin embargo, al conectar al cable de 12 volts si funciona pero queda inhábil el botón que elimina los créditos.
    Alguna recomendación?

    ResponderEliminar
    Respuestas
    1. Puedes alimentar el arduino y el monedero de la misma fuente de 12v, pero al arduino le deben de llegar como máximo 5V muy bien regulados por su pin Vin. Si alimentas desde el jack de 3.5" puedes meter directamente los 12V de la fuente puesto que esa entrada tiene un regulador a 5VDC. Por lo demás te recomiendo que revises las conexiones que vienen dentro de la cabecera del código. Saludos

      Eliminar
  27. Hola que tal con el Arduino MEGA tambien puede funcionar..? y otra duda lo hago pero el display no me aparece nada

    ResponderEliminar
  28. Hola!, mi duda es porque cuando inserto una moneda en vez de contarme de 1 en 1, me cuenta de 2 o de 3, a veces de 4, agradecería la ayuda

    ResponderEliminar
  29. buenas tardes quiero usar este programa y que por cada peso introducido que habrá una válvula solenoide por determinado tiempo. y una ves concluido cierre de nuevo. y asi cada que se introduzca dinero habrá la válvula.
    podrá ayudarme?

    ResponderEliminar
  30. hola disculpe como hago para que lea solo moneda sol peruano me ayudas por favor

    ResponderEliminar
  31. hola, una consulta, en mi monedero la señal de credito marca 12v cuando ingreso un credito siempre y cuando el pin de señal este al aire ya que si lo conecto a la entrada de arduino este se baja a 1v, a que se debe esto?

    ResponderEliminar
  32. No tengo ni idea porque no se ni como estas instalando, ni el código que utilizas, ni el modelo de monedero...

    ResponderEliminar
  33. saludos,,
    estyo ayudando en un proyecto de un cajero que imprima certificados, estoy utilizando arduino y rasbery, el costo para cada certificado es de un dolar, pero no puedo codificar el monedero para que de la orden y que imprimar el certificado,,
    quisiera que me ayudes con esa consulta..
    gracias..
    carlosjose5445@hotmail.com

    ResponderEliminar
  34. porque esta linea es -1 y no 0 ?

    volatile int numero_monedas = -1; // Variable que almacena el número de créditos introducidos

    ResponderEliminar