Hucha inteligente con gestión autónoma
Introducción
Nuestra motivación para crear y desarrollar este proyecto fue intentar crear una hucha inteligente como las que hay actualmente en el mercado.
La idea principal de esta hucha es que te ayude ahorrar como era de esperar, pero esta hucha tiene un seguimiento de la cantidad de monedas que has insertado de manera exacta y precisa, sabiendo en todo momento cuánto has ahorrado. Además, tiene una contraseña para aplicar seguridad, y la capacidad de establecer una meta para tener un objetivo en mente del usuario que la utilice. De esta manera el usuario cuando llegue a la meta, podrá sacar las monedas introduciendo la contraseña.
El esquema general de la hucha se constituye de un display de 4 dígitos que nos indica las monedas introducidas y el conteo general. También hace uso de una rampa impresa en 3D con agujeros para poder clasificarlas según su tamaño, sensores infrarrojos para detectar las monedas que caen, y un servomotor para poder mover la puerta.
Reparto de tareas
En aspectos generales, el trabajo ha sido hecho en conjunto con el grupo entero. Sin embargo, sí hay que destacar que ciertos roles o actividades han sido hechos más por algún miembro.
Manuel.T: Código y material.
Marcos.S: Código y materiales.
Marcos.C: Carpintería y materiales.
Empezamos el día 13 de noviembre y acabamos el día 13 de diciembre. En este mes, habremos usado 16 horas de las clases (8 clases de 2 horas), y más 16 horas fuera de clase (6 en la biblioteca y 16 fuera de la universidad). En total 38 horas.
Materiales
Materiales | Precio |
Placa Arduino UNO | Incluido |
6 sensores infrarrojos Frienda-Obstacle-431S | Incluido |
Registro de desplazamiento 74HC595 | Incluido |
Display 7 segmentos de 4 dígitos | Incluido |
DollaTek Infrarrojos Infrarrojos IR inalámbrico Módulo del Sensor de Control Remoto | 13,99 € (20 unidades) |
CD74HC4067 multiplexor Digital Analógico de 16 Canales | 7,59 € (5 unidades) |
Cables | Incluido |
Servomotor | Incluido |
Tablas de contrachapado | Reciclado |
Modelo 3d de la rampa para las monedas | 35,00€ (1 unidad) |
Pistola silicona caliente | Reciclada |
Cola blanca | 4,50 € (1 unidad) |
Caja de Tornillos (100 unidades) | 4,59 € |
Cinta aislante negra | 2,99 € (1 unidad) |
TOTAL | 68,66 € |
Problemas
Funciones de estadística
La primera característica que iba a tener la hucha era la capacidad de medir y calcular cálculos estadísticos como la cantidad total de dinero introducida, cantidad introducida este mes, el último mes, porcentaje de lo ahorrado en comparación con el mes anterior, etc…
Sin embargo, debido a que solo podíamos usar el display, y que no era posible obtener datos que se almacenasen con el tiempo. Tuvimos que descartar casi el primer día todas estas funciones, quedándonos solo con la cantidad total introducida.
Una posible solución podría haber sido colocar de manera artificial datos de “este mes” y “del mes anterior” y simular y hacer los cálculos con estos mismos datos. O en vez de “este mes” y “del mes anterior” haber introducido variables como “total actual” y “total anterior”, es decir que se almacenasen los valores introducidos de anteriores veces y con ellos calculase estas estadísticas.
Almacén
Esta característica era simple en el papel: hacer que las monedas introducidas cayesen en un almacén común. Y al introducir la contraseña abrir un compartimento de este almacén para que las monedas cayesen o el usuario las recogiese con suma facilidad.
Sin embargo, debido a que usamos la rampa 3D y el profesor nos dijo que mejor dejáramos la rampa completa, no hallamos una manera a tiempo para dirigir las monedas al almacén, sino que simplemente caían en la caja (junto con todo el cableado).
Una posible solución sería haber quitado parte de la rampa y colocar por debajo de esta misma una cajita a modo de almacén.
Lector de billetes
La idea principal incluía un lector de billetes para que el usuario también pudiese introducirlos.
Sin embargo, era complicado y costoso (en precio y esfuerzo) y no teníamos los conocimientos necesarios para calcular si sería una buena inversión usar un lector o nos ralentizaría el avance. Al final, fuimos cautelosos y nos aseguramos no perder tiempo, por lo que no lo usamos.
Display
EL display ocupaba la inmensa mayoría de pines digitales de la placa por lo que necesitábamos más pines. Para solucionarlo, usamos un desplazador de registro para poder ahorrar más pines y así usarlos con los otros dispositivos. Escribimos notas y apuntes sobre las entradas del desplazador y los cables que fuimos conectando para no perdernos ni enredar tantos estos mismos. Además, a lo largo del avance del proyecto fue recurrente que el display se apagara en ciertos momentos. Varios de estos problemas se debieron tanto por el cableado que al final sustituimos, como por un defecto en una de las patillas del display. La solución fue simplemente tratarlo con mucho cuidado y estar pendientes del cableado.
Delay
Cuando empezamos el código, nos encontramos con algo extraño, el display parpadeaba al iluminarse para mostrar los dígitos. Lo solucionamos usando un poco de delay, usando la función delay() y así el display se mostró de manera correcta sin mostrar parpadeos, al parecer se debe a que al ir tan rápido, los dígitos se solapaban entre sí.
Multiplexor
Tuvimos el problema de que, para poder utilizar todos los sensores infrarrojos para todas las monedas, no teníamos suficientes pines analógicos, por lo que intentamos solucionarlo. Compramos un multiplexor, lo soldamos y tratamos de hacerlo funcionar, pero no hubo forma, no era capaz de leer todos los sensores de manera correcta, por lo que optamos por reducir el número de sensores infrarrojos, utilizando 6 en vez de 8 quitando los sensores de las monedas de 1 y 2 céntimos. Además, nos vino mejor, porque a la hora de detectar las monedas de 1 y 2 céntimos no era muy preciso ya que las monedas eran muy pequeñas para que las detectara el sensor.
Rampa 3D
Para lograr la clasificación de monedas se nos vino como primera idea una rampa con varios agujeros por donde caerían las monedas. Estuvimos pensando si era mejor usar una table de contrachapado y cortar por nuestra cuenta los agujeros, o usar una rampa 3D. Nos decantamos por la rampa 3D, aunque con un poco de miedo ya que vimos que en otros proyectos las impresiones no eran tan precisas. Escogimos una tienda confiable que nos entregó la rampa hecha.
Buzzer
Nuestra idea original era que, al meter una moneda o al alcanzar la meta, etc… sonase algo con un buzzer y así tener más realimentación al realizar las acciones. Sin embargo, en cuanto usamos la función tone() el código empezó a tener problemas. La función del código encargada de detectar el mando se quedaba estancada o dejó de detectar correctamente al propio mando. Como no teníamos tiempo no pudimos investigar sobre el por qué surgía el problema. Directamente lo descartamos.
Sensores
Para detectar las monedas, pensamos en usar sensores infrarrojos. Sin embargo, estos sensores han resultado ser muy difíciles de controlar. Los sensores tenían un rango de distancia muy pequeño, pero eso lo solucionamos posicionándolos con cuidado a una distancia segura. El siguiente problema era que los sensores o recogían valores altos todo el rato independientemente de que hubiese un objeto o no, o no recogían ningún valor, aunque pusieses un objeto delante suya, por lo que había que ser muy preciso al ajustarlos, además que esta configuración a veces se cambiaba sola por lo que eran muy sensibles y había que regularlos constantemente. Debido a la falta de tiempo, no pudimos lograr que todos los sensores funcionaran correctamente salvo en contadas excepciones en las que funcionaron, pero luego volvieron a dar error al menos uno de ellos.
Una posible solución podría haber sido colocar los sensores en otro ángulo y posición distinto o haber experimentado con los rangos, umbrales y valores de los sensores para intentar nuevas formas de recoger los datos.
Mando
Al inicio del proyecto teníamos pensado usar botones para seleccionar las distintas opciones, pero decidimos usar un mando para que tuviéramos mejor usabilidad de la hucha y no complicarnos demasiado. Los problemas fueron el detectar los botones y sus decodificaciones y las interferencias con los sensores infrarrojos.
Para solucionarlos, hicimos pruebas de detección del mando y fuimos anotando los distintos valores de los botones y, por otro lado, posicionamos en un buen lugar el sensor del mando para que no interfiera con los sensores, ni el cableado.
Pasos dados
Los pasos dados durante la implementación han sido los siguientes:
-Empezamos el primer día con un boceto del código en papel.
-Usamos el display, descartamos la idea del lector de billetes y las funciones de estadística
-Utilizamos el desplazador de registro para no usar tantas entradas del display
-Compramos los sensores infrarrojos y realizamos las primeras pruebas
-Pedimos hacer la rampa 3D y la empezamos a limar y cortar para ajustarla
-Intentamos usar un multiplexor para poder usar los 8 sensores. Tratamos de soldarlo, pero no hubo manera. Después fue eliminado y usamos 6 sensores directamente en su lugar.
-Instalamos en la caja de madera todo el circuito para empotrarlo y juntamos todos los elementos
Circuito
Circuito hecho con Tinkercad:
Vídeo de demostración de la hucha:
Código
//Librerías
#include <Servo.h>
#include <IRremote.h>
//Pines
int IR = 2;
int clockPin = 13;
int latchPin = 12;
int dataPin = 11;
int infra0 = 0;
int infra1 = 1;
int infra2 = 2;
int infra3 = 3;
int infra4 = 4;
int infra5 = 5;
//Variables
Servo myservo;
int meta = 0;
int cantidadTotal = 0;
int password= 0;
int comprobador = 0;
int first = 1;
void setup(){
IrReceiver.begin(IR, DISABLE_LED_FEEDBACK);
pinMode(clockPin,OUTPUT);
pinMode(latchPin,OUTPUT);
pinMode(dataPin,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
Serial.begin(9600);
myservo.attach(6);
for(int i=0;i<3000;i++){
Display(3 , 11, 0);
Display(2 , 11, 0);
Display(1, 11, 0);
Display(0,11, 0);
}
while(numeroMando() != 12){
writePASS();
}
password=clave();
delay(1);
while(numeroMando()!=12){
writeGOAL();
}
meta=clave();
}
void writeGOAL(){
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,125);
digitalWrite(7,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,63);
digitalWrite(8,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,119);
digitalWrite(9,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,56);
digitalWrite(10,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
}
void writePASS(){
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,115);
digitalWrite(7,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,119);
digitalWrite(8,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,109);
digitalWrite(9,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,109);
digitalWrite(10,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
}
void write2Euros(){
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,0);
digitalWrite(7,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,219);
digitalWrite(8,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,63);
digitalWrite(9,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,63);
digitalWrite(10,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
}
void write1Euro(){
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,0);
digitalWrite(7,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,134);
digitalWrite(8,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,63);
digitalWrite(9,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,63);
digitalWrite(10,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
}
void write50Cent(){
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,0);
digitalWrite(7,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,191);
digitalWrite(8,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,109);
digitalWrite(9,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,63);
digitalWrite(10,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
}
void write20Cent(){
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,0);
digitalWrite(7,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,191);
digitalWrite(8,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,91);
digitalWrite(9,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,63);
digitalWrite(10,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
}
void write10Cent(){
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,0);
digitalWrite(7,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,191);
digitalWrite(8,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,6);
digitalWrite(9,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,63);
digitalWrite(10,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
}
void write5Cent(){
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,0);
digitalWrite(7,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,191);
digitalWrite(8,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,63);
digitalWrite(9,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,109);
digitalWrite(10,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
}
void writeFULL(){
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,113);
digitalWrite(7,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,62);
digitalWrite(8,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,56);
digitalWrite(9,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,56);
digitalWrite(10,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
}
void writeNOTHING(){
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,0);
digitalWrite(7,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,0);
digitalWrite(8,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,0);
digitalWrite(9,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
digitalWrite(latchPin,LOW);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
shiftOut(dataPin,clockPin,MSBFIRST,0);
digitalWrite(10,LOW);
digitalWrite(latchPin,HIGH);
delay(2);
}
int clave(){
int n0 = -1, n1 = -1, n2 = -1, n3 = -1;
digitalWrite(7 ,HIGH); // Apaga todos los digitos
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
while(n0 == -1){
n0 = numeroMando();
}
Display(0 , n0, 0);
delay(1);
while(n1 == -1){
n1 = numeroMando();
}
Display(0 , n0, 0);
Display(1 , n1, 0);
delay(1);
while(n2 == -1){
n2 = numeroMando();
}
Display(0 , n0, 0);
Display(1 , n1, 0);
Display(2 , n2, 0);
delay(1);
while(n3 == -1){
n3 = numeroMando();
}
delay(1);
Display(0 , n0, 0);
Display(1 , n1, 0);
Display(2 , n2, 0);
Display(3 , n3, 0);
delay(500);
digitalWrite(10,HIGH);
while(numeroMando() != 12){
}
return(n0*1000 + n1*100 + n2 * 10+ n3);
}
int numeroMando(){
if (IrReceiver.decode()) {
switch(IrReceiver.decodedIRData.decodedRawData){
case(3125149440):
IrReceiver.resume();
return 1;
break;
case(3108437760):
IrReceiver.resume();
return 2;
break;
case(3091726080):
IrReceiver.resume();
return 3;
break;
case(3141861120):
IrReceiver.resume();
return 4;
break;
case(3208707840):
IrReceiver.resume();
return 5;
break;
case(3158572800):
IrReceiver.resume();
return 6;
break;
case(4161273600):
IrReceiver.resume();
return 7;
break;
case(3927310080):
IrReceiver.resume();
return 8;
break;
case(4127850240):
IrReceiver.resume();
return 9;
break;
case(3860463360):
IrReceiver.resume();
return 0;
break;
case(3910598400):
IrReceiver.resume();
return 10;
break;
case(4061003520):
IrReceiver.resume();
return 11;
break;
case(3810328320):
IrReceiver.resume();
return 12;
break;
default:
break;
}
}
IrReceiver.resume();
Serial.print(«»);
return -1;
}
void Display(int pos, int N, int contador)
{
digitalWrite(7 ,HIGH); // Apaga todos los digitos
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(latchPin,LOW);
switch(N){
case(0):
if(pos == 1 && contador == 1) {
shiftOut(dataPin,clockPin,MSBFIRST,191);
}else{
shiftOut(dataPin,clockPin,MSBFIRST,63);
}
break;
case(1):
if(pos == 1 && contador == 1) {
shiftOut(dataPin,clockPin,MSBFIRST,134);
}else{
shiftOut(dataPin,clockPin,MSBFIRST,6);
}
break;
case(2):
if(pos == 1 && contador == 1) {
shiftOut(dataPin,clockPin,MSBFIRST,219);
}else{
shiftOut(dataPin,clockPin,MSBFIRST,91);
}
break;
case(3):
if(pos == 1 && contador == 1) {
shiftOut(dataPin,clockPin,MSBFIRST,207);
}else{
shiftOut(dataPin,clockPin,MSBFIRST,79);
}
break;
case(4):
if(pos == 1 && contador == 1) {
shiftOut(dataPin,clockPin,MSBFIRST,230);
}else{
shiftOut(dataPin,clockPin,MSBFIRST,102);
}
break;
case(5):
if(pos == 1 && contador == 1) {
shiftOut(dataPin,clockPin,MSBFIRST,237);
}else{
shiftOut(dataPin,clockPin,MSBFIRST,109);
}
break;
case(6):
if(pos == 1 && contador == 1) {
shiftOut(dataPin,clockPin,MSBFIRST,253);
}else{
shiftOut(dataPin,clockPin,MSBFIRST,125);
}
break;
case(7):
if(pos == 1 && contador == 1) {
shiftOut(dataPin,clockPin,MSBFIRST,135);
}else{
shiftOut(dataPin,clockPin,MSBFIRST,7);
}
break;
case(8):
if(pos == 1 && contador == 1) {
shiftOut(dataPin,clockPin,MSBFIRST,255);
}else{
shiftOut(dataPin,clockPin,MSBFIRST,127);
}
break;
case(9):
if(pos == 1 && contador == 1) {
shiftOut(dataPin,clockPin,MSBFIRST,231);
}else{
shiftOut(dataPin,clockPin,MSBFIRST,103);
}
break;
case(11):
shiftOut(dataPin,clockPin,MSBFIRST,64);
break;
}
digitalWrite(latchPin,HIGH);
switch(pos){
case(0):
digitalWrite(7,LOW);
break;
case(1):
digitalWrite(8,LOW);
break;
case(2):
digitalWrite(9,LOW);
break;
case(3):
digitalWrite(10,LOW);
break;
}
}
void CalculaDigitos( int Num) {
int Digit0 = Num %10 ;
int Digit1 = (Num % 100) / 10 ;
int Digit2 = (Num % 1000) / 100 ;
int Digit3 = (Num / 1000) ;
Display(0 , Digit3, 1);
delay(1);
Display(1 , Digit2, 1);
delay(1);
Display(2 , Digit1, 1);
delay(1);
Display(3 , Digit0, 1);
delay(1);
}
void loop(){
if(numeroMando()!= -1){
comprobador=clave();
if(comprobador==password){
Serial.println(«Contraseña correcta»);
cantidadTotal = 0;
first = 1;
myservo.write(180);
delay(500);
myservo.write(0);
delay(500);
}else{
Serial.println(«Contraseña incorrecta»);
}
}
//10 cent
int valor5 = analogRead(infra5);
if(valor5<500 ){
for(int i = 0; i < 200; i++){
write10Cent();
}
cantidadTotal = cantidadTotal +10;
}
//5 cent
int valor4 = analogRead(infra4);
if(valor4 <500){
for(int i = 0; i < 200; i++){
write5Cent();
}
cantidadTotal = cantidadTotal +5;
}
//20 cent
int valor3 = analogRead(infra3);
if(valor3<500 ){
for(int i = 0; i < 200; i++){
write20Cent();
}
cantidadTotal = cantidadTotal +20;
}
//1 euro
int valor2 = analogRead(infra2);
if(valor2 <500){
for(int i = 0; i < 200; i++){
write1Euro();
}
cantidadTotal = cantidadTotal +100;
}
//50 cent
int valor1 = analogRead(infra1);
if(valor1<500 ){
for(int i = 0; i < 200; i++){
write50Cent();
}
cantidadTotal = cantidadTotal + 50;
}
//2 euros
int valor0 = analogRead(infra0);
if(valor0 <500){
for(int i = 0; i < 200; i++){
write2Euros();
}
cantidadTotal = cantidadTotal +200;
}
if(cantidadTotal >= meta && first == 1){
int i = 0;
while(i < 50){
writeGOAL();
i++;
}
while(i < 100){
writeNOTHING();
i++;
}
while(i < 150){
writeGOAL();
i++;
}
while(i < 200){
writeNOTHING();
i++;
}
while(i < 250){
writeGOAL();
i++;
}
while(i < 300){
writeNOTHING();
i++;
}
while(i < 350){
writeGOAL();
i++;
}
while(i < 400){
writeNOTHING();
i++;
}
first = 0;
}
if(cantidadTotal < 10000){
CalculaDigitos(cantidadTotal) ;
}else{
writeFULL();
}
}
Posibles mejoras
A lo largo del apartado de los problemas encontrados se han ido mencionando las posibles mejoras. Aquí las repasaremos de una manera concisa y breve.
-Utilizar el buzzer (o altavoz mp3) para notificar o implementar voz incluso.
-Conseguir que los sensores funcionasen de una manera correcta y consistente, y haber puesto los sensores en los 8 agujeros.
-Construir el almacén y un pasillo por donde las monedas saldrían
-Usar un lector de billetes y también almacenarlos.
-Añadir funciones de estadística
-Haber utilizado la pantalla LCD en vez del display para añadir más palabras y expresiones.