Está en la página 1de 37

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

/************************************************************************************
!
!
!
!
!
!
Bibliotecas de funciones y clases
************************************************************************************/
#include "FlexiTimer2.h"
#include "Metro.h"
#include "Display4x7.h"
#include "Piezoelectrico.h"
#include "Pulsador.h"
#include "PushButtonRedRing.h"
#include "LedAnalogico.h"
#include "LedDigital.h"
#include "SensorCanasta.h"

/************************************************************************************
!
!
!
!
!
!
!
Pines de entrada y salida
************************************************************************************/
const int pinPiezoelectrico = 8;
const int pinBotonAceptar
const int pinBotonDerecho
const int pinBotonIzquierdo

= 7;
= 2;
= 4;

const int pinSensorCanasta1


const int pinSensorCanasta2

= A0;
= A1;

const
const
const
const
const
const
const
const

int
int
int
int
int
int
int
int

pinLedRjug1
pinLedAjug1
pinLedVjug1
pinLedBjug1
pinLedRjug2
pinLedAjug2
pinLedVjug2
pinLedBjug2

=
=
=
=
=
=
=
=

3;
5;
6;
12;
9;
10;
11;
13;

/************************************************************************************
!
!
!
Objetos para controlar los dispositivos del sistema
************************************************************************************/
Display4x7 pantalla;
!
Piezoelectrico bocina (pinPiezoelectrico);
!
Pulsador botonDerecho (pinBotonDerecho);
Pulsador botonIzquierdo (pinBotonIzquierdo);
PushButtonRedRing botonAceptar (pinBotonAceptar);
!
SensorCanasta canastaJugador1 (pinSensorCanasta1);
SensorCanasta canastaJugador2 (pinSensorCanasta2);
LedAnalogico
LedAnalogico
LedAnalogico
LedDigital!
LedAnalogico
LedAnalogico
LedAnalogico
LedDigital!

ledRjug1
ledAjug1
ledVjug1
ledBjug1
ledRjug2
ledAjug2
ledVjug2
ledBjug2

(pinLedRjug1,
(pinLedAjug1,
(pinLedVjug1,
(pinLedBjug1,
(pinLedRjug2,
(pinLedAjug2,
(pinLedVjug2,
(pinLedBjug2,

false);
false);
false);
false);
false);
false);
false);
false);

/************************************************************************************
!
!
!
Variables globales necesarias para los juegos y menus
************************************************************************************/
int segundosRestantes;
int opcion = 1;

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
117
118
119
120
121
122
123
124
125
126
127
128
129
130

const int numeroDeOpciones = 4;


/************************************************************************************
!
!
!
!
!
!
!
!
!
!
SETUP
************************************************************************************/
void setup () {
!
Serial.begin(9600);!!
// Necesario para el Display4x7
!
!
!

// Resetear la pantalla para poner el brillo al maximo, borrar su contenido y


// desactivar todos los separadores
pantalla.resetear();

!
!
!
!
!
!
!
!
!

// Apagar todos los leds


ledRjug1.apagar();
ledAjug1.apagar();
ledVjug1.apagar();
ledBjug1.apagar();
ledRjug2.apagar();
ledAjug2.apagar();
ledVjug2.apagar();
ledBjug2.apagar();

!
!
!
!
!
!
}

// Establecer el reloj para los juegos en los que sea necesario


FlexiTimer2::set(500, tic);
// Test inicial en el que se activaran los leds y la pantalla
// para comprobar su que funcionan correctamente
test();

/************************************************************************************
!
!
!
!
!
!
!
!
!
!
LOOP
************************************************************************************/
void loop () {
menu();
}

/************************************************************************************
!
!
!
!
!
!
!
!
!
MENU PRINCIPAL
************************************************************************************/
void menu() {
! String opcionActual = "OPC";
opcionActual += opcion;
pantalla.mostrar(opcionActual);
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

// Si se pulsa el boton aceptar


if (botonAceptar.presionado()) {
!
tratarOpcion(opcion);
}
// Si se pulsa el boton derecho
if (botonDerecho.presionado()) {
!
String opcionAnterior = "OPC";
opcionAnterior += opcion;
!
!
// Incremetar variable opcion, si superamos el numero de opciones volver a 1
!
opcion++;
!
if (opcion > numeroDeOpciones) {
!
!
opcion = 1;
!
}
!
!
String opcionActual = "OPC";
opcionActual += opcion;
!

131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
}

!
!
!
}

// Actualizar la pantalla del dispositivo


pantalla.deslizarPalabraFueraDerIzq(opcionAnterior, 500);
pantalla.deslizarPalabraDentroDerIzq(opcionActual, 500);

// Si se pulsa el boton izquierdo


if (botonIzquierdo.presionado()) {
!
String opcionAnterior = "OPC";
opcionAnterior += opcion;
!
!
// Decrementar variable opcion, si llegamos a 0 volver a la opcion mas alta
!
opcion--;
!
if (opcion < 1) {
!
!
opcion = numeroDeOpciones;
!
}
!
!
String opcionActual = "OPC";
opcionActual += opcion;
!
!
// Actualizar la pantalla del dispositivo
!
pantalla.deslizarPalabraFueraIzqDer(opcionAnterior, 500);
!
pantalla.deslizarPalabraDentroIzqDer(opcionActual, 500);
}!

void tratarOpcion (int opcion) {


!
switch(opcion) {
!
!
case 1: juego1vs1();
!
!
!
!
break;
!
!
case 2: juego1vs1conBonus();
!
!
!
!
break;
!
!
case 3: juegoAsno();
!
!
!
!
break;
!
!
case 4: juego11();
!
!
!
!
break;
!
!
default:
!
!
!
!
break;
!
}
}

/************************************************************************************
!
!
!
!
!
!
!
!
!
MODOS DE JUEGO
************************************************************************************/
/*
!
Juego 1vs1: Partida jugador contra jugador durante 60 segundos, gana el jugador
!
que haya anotado mas puntos al final de la partida
*/
void juego1vs1 () {
!
// Marcadores para los jugadores
!
int puntosJugador1 = 0;
!
int puntosJugador2 = 0;
!
!

boolean pulsadorCanasta1Pulsado = false;


boolean pulsadorCanasta2Pulsado = false;

// Cuenta atras
bocina.charge();

!
!
!

! // Iniciar reloj
segundosRestantes = 60;
FlexiTimer2::start();
// Jugar partida hasta llegar a cero

196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260

!
!
!
!

while (segundosRestantes >= 0) {


!
// Marcador, con los dos digitos de la izquierda para la puntuacion del jugador 1
!
// y los dos digitos de la derecha para la puntuacion del jugador 2
!
int marcador = puntosJugador1 * 100 + puntosJugador2;

!
!
!

!
!
!

// Comprobar si ha anotado algun jugador


if (canastaJugador1.presionado() && !pulsadorCanasta1Pulsado) {
!
pulsadorCanasta1Pulsado = true;

!
!
!

!
!
!

!
!
!

if (puntosJugador1 < 99) {


!
puntosJugador1++;
}

!
!

!
!

!
}

delay(500);

!
!

!
!

if (canastaJugador2.presionado() && !pulsadorCanasta2Pulsado) {


!
pulsadorCanasta2Pulsado = true;

!
!
!

!
!
!

!
!
!

if (puntosJugador2 < 99) {


!
puntosJugador2++;
}

!
!

!
!

!
}

delay(500);

!
!
!

!
!
!

if (!canastaJugador1.presionado()) {
!
pulsadorCanasta1Pulsado = false;
}

!
!
!

!
!
!

if (!canastaJugador2.presionado()) {
!
pulsadorCanasta2Pulsado = false;
}

!
!
!
!
!
!
!
!
!
!
!
!
!

!
!
!
!
!
!
!
!
!
!
!
!
!

// Mostrar el marcador o el tiempo restante


// El tiempo restante se muestra cuando:
// - De 60 a 57
// - De 45 a 42
// - De 30 a 27
// - De 10 a 0
// El resto del tiempo se muesta la puntuacion
Serial.print("v"); // Restear la pantalla 4x7segmentos
if ((segundosRestantes <= 60 && segundosRestantes >= 60) || (segundosRestantes <= 4
!
// Mostrar los segundos restantes
!
// Desactivar separador
!
Serial.write(byte(119));
// Descctivar seperador
!
Serial.write(byte(0));
// Desactivar seperador

!
!
!
!

!
!
!
!

!
!
!
!

!
!
!
!
!
!
!

!
!
!
!
!
!
!

!
Serial.print(segundosRestantes);
!
Serial.print("x");
}
else {
!
// Mostrar marcador
!
Serial.write(byte(119));
// Activar seperador
!
Serial.write(byte(16));
// Activar seperador

!
!
!
!

!
!
!
!

!
!
!
!

if (segundosRestantes >= 10)


!
Serial.print("x");
else
!
Serial.print("x0");

if (marcador < 10)


!
Serial.print("000");
else if (marcador < 100)
!
Serial.print("00");

261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325

!
!

!
!

!
!

else if (marcador < 1000)


!
Serial.print("0");

!
!
!
!

!
!
Serial.print(marcador);
!
}
}
FlexiTimer2::stop();

!
!
!

// Desactivar separador
Serial.write(byte(119));
Serial.write(byte(0));

!
!
!
!
!

// GAME OVER
pantalla.formarPalabraDerIzq("GANE");
delay(1000);
pantalla.formarPalabraDerIzq("OUER");
delay(2000);

!
!
}

// Comprobar quien ha ganado


mostrarGanador(puntosJugador1, puntosJugador2);

// Desactivar seperador
// Desactivar seperador

/*
!
Juego 1vs1 con bonus: Partida jugador contra jugador durante 60 segundos, cuando un
!
jugador anota varias canastas en un intervalo corto de tiempo consigue un bonus
!
y sus canastas valen 2 o 3 puntos. Gana la partida el jugador que haya conseguido
!
mas puntos al final de los 60 segundos
*/
void juego1vs1conBonus() {
!
// Marcadores para los jugadores
!
int puntosJugador1 = 0;
!
int puntosJugador2 = 0;
!
int bonusJugador1 = 0;
!
int bonusJugador2 = 0;
!
boolean pulsadorCanasta1Pulsado = false;
!
boolean pulsadorCanasta2Pulsado = false;
!

// Cuenta atras
bocina.charge();

!
!
!
!

// Iniciar reloj
segundosRestantes = 60;
FlexiTimer2::start();
Metro metronomo(100);

!
!

// Jugar partida hasta llegar a cero


while (segundosRestantes >= 0) {
!
// Marcador, con los dos digitos de la izquierda para la puntuacion del jugador 1
!
// y los dos digitos de la derecha para la puntuacion del jugador 2
!
int marcador = puntosJugador1 * 100 + puntosJugador2;

!
!

!
!
!

// Comprobar si ha anotado algun jugador


if (canastaJugador1.presionado() && !pulsadorCanasta1Pulsado) {
!
pulsadorCanasta1Pulsado = true;

!
!
!
!
!
!
!
!
!

!
!
!
!
!
!
!
!
!

!
!
!
!
!
!
!
!
!

if (bonusJugador1 >= 300) {


!
if (puntosJugador1 < 96)
!
!
puntosJugador1+= 3;
!
else if (puntosJugador1 >= 96)
!
!
puntosJugador1 = 99;
} else if (bonusJugador1 >= 200) {
!
if (puntosJugador1 < 97)
!
!
puntosJugador1 += 2;
!
else if (puntosJugador1 >= 97)

326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390

! !
!
puntosJugador1 = 99;
} else {
!
if (puntosJugador1 < 98)
!
!
puntosJugador1 += 1;
!
else if (puntosJugador1 >= 98)
!
!
puntosJugador1 = 99;

!
!
!
!
!
!

!
!
!
!
!
!

!
!
!
!
!
}

!
!
!

!
!
!

!
!
}

!
!

!
!

if (canastaJugador2.presionado() && !pulsadorCanasta2Pulsado) {


!
pulsadorCanasta2Pulsado = true;

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

!
!

!
!

encenderLedsBonus(bonusJugador1, bonusJugador2);

!
!
!

!
!
!

if (!canastaJugador1.presionado()) {
!
pulsadorCanasta1Pulsado = false;
}

!
!
!

!
!
!

if (!canastaJugador2.presionado()) {
!
pulsadorCanasta2Pulsado = false;
}

!
!
!
!
!

!
!
!
!
!

if (metronomo.check() == 1) {
!
if (bonusJugador1 < 5)
!
!
bonusJugador1 = 0;
!
else
!
!
bonusJugador1 -= 5;

!
!
!
!
!

!
!
!
!
!

!
!
!
!
}

!
!
!
!
!
!
!

!
!
!
!
!
!
!

// Mostrar el marcador o el tiempo restante


// El tiempo restante se muestra cuando:
// - De 60 a 57
// - De 45 a 42
// - De 30 a 27
// - De 10 a 0
// El resto del tiempo se muesta la puntuacion

bonusJugador1 += 100;
delay(500);

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
! !

if (bonusJugador2 >= 300) {


!
if (puntosJugador2 < 96)
!
!
puntosJugador2+= 3;
!
else if (puntosJugador2 >= 96)
!
!
puntosJugador2 = 99;
} else if (bonusJugador2 >= 200) {
!
if (puntosJugador2 < 97)
!
!
puntosJugador2 += 2;
!
else if (puntosJugador2 >= 97)
!
!
puntosJugador2 = 99;
} else {
!
if (puntosJugador2 < 98)
!
!
puntosJugador2 += 1;
!
else if (puntosJugador2 >= 98)
!
!
puntosJugador2 = 99;
}

! !
!
}

bonusJugador2 += 100;
delay(500);

if (bonusJugador2 < 5)
!
bonusJugador2 = 0;
else
!
bonusJugador2 -= 5;

391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455

!
!
!
!
!
!

!
!
!
!
!
!

Serial.print("v"); // Restear la pantalla 4x7segmentos


if ((segundosRestantes <= 60 && segundosRestantes >= 60) || (segundosRestantes <=
!
// Mostrar los segundos restantes
!
// Desactivar separador
!
Serial.write(byte(119));
// Descctivar seperador
!
Serial.write(byte(0));
// Desactivar seperador

!
!
!
!

!
!
!
!

!
!
!
!

!
!
!
!
!
!
!

!
!
!
!
!
!
!

!
Serial.print(segundosRestantes);
!
Serial.print("x");
}
else {
!
// Mostrar marcador
!
Serial.write(byte(119));
// Activar seperador
!
Serial.write(byte(16));
// Activar seperador

!
!
!
!
!
!

!
!
!
!
!
!

!
!
!
!
!
!

!
!
!

!
Serial.print(marcador);
!
}
}
FlexiTimer2::stop();

if (segundosRestantes >= 10)


!
Serial.print("x");
else
!
Serial.print("x0");

if (marcador < 10)


!
Serial.print("000");
else if (marcador < 100)
!
Serial.print("00");
else if (marcador < 1000)
!
Serial.print("0");

!
!
!

// Desactivar separador
Serial.write(byte(119));
Serial.write(byte(0));

!
!
!
!
!

// GAME OVER
pantalla.formarPalabraDerIzq("GANE");
delay(1000);
pantalla.formarPalabraDerIzq("OUER");
delay(2000);

!
!
}

// Comprobar quien ha ganado


mostrarGanador(puntosJugador1, puntosJugador2);

// Desactivar seperador
// Desactivar seperador

/*
!
Juego del Asno
!
Implementado como finita maquina de estados
!
Estado 1 - Turno J1
!
!
Mete canasta -> Transitar al estado 3
!
!
Falla canasta -> Transitar al estado 2
!
Estado 2 - Turno J2
!
!
Mete canasta -> Transitar al estado 4
!
!
Falla canasta -> Transitar al estado 1
!
Estado 3 - Turno J2
!
!
Mete canasta -> Transitar al estado 1
!
!
Falla canasta -> Transitar al estado 1 y sumar error al jugador 2
!
Estado 4 - Turno J1
!
!
Mete canasta -> Transitar al estado 2
!
!
Falla canasta -> Transitar al estado 2 y sumar error al jugador 1
*/
void juegoAsno() {
!
int estadoActual = 1;
!
int numErroresJ1 = 0;

456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520

!
!
!

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

int numErroresJ2 = 0;
// Cuenta atras
bocina.charge();
mostrarLetras(numErroresJ1);
ledBjug1.encender();
ledBjug2.apagar();
// Mientras que ningun jugador haya perdido seguir jugando
while (numErroresJ1 < 4 && numErroresJ2 <4) {
!
// Si se ha metido canasta
!
if (canastaJugador1.presionado()) {
!
!
switch (estadoActual) {
!
!
!
case 1:
!
!
!
!
estadoActual = 3;
!
!
!
!
mostrarLetras(numErroresJ2);
!
!
!
!
ledBjug2.encender();
!
!
!
!
ledBjug1.apagar();
!
!
!
!
break;
!
!
!
case 2:
!
!
!
!
estadoActual = 4;
!
!
!
!
mostrarLetras(numErroresJ1);
!
!
!
!
ledBjug1.encender();
!
!
!
!
ledBjug2.apagar();
!
!
!
!
break;
!
!
!
case 3:
!
!
!
!
estadoActual = 1;
!
!
!
!
mostrarLetras(numErroresJ1);
!
!
!
!
ledBjug1.encender();
!
!
!
!
ledBjug2.apagar();
!
!
!
!
break;
!
!
!
case 4:
!
!
!
!
estadoActual = 2;
!
!
!
!
mostrarLetras(numErroresJ1);
!
!
!
!
ledBjug2.encender();
!
!
!
!
ledBjug1.apagar();
!
!
!
!
break;
!
!
!
default:
!
!
!
!
break;
!
!
}
!
}
!
// Se no se ha encestado
!
if (botonAceptar.presionado()) {
!
!
switch (estadoActual) {
!
!
!
case 1:
!
!
!
!
estadoActual = 2;
!
!
!
!
mostrarLetras(numErroresJ2);
!
!
!
!
ledBjug2.encender();
!
!
!
!
ledBjug1.apagar();
!
!
!
!
break;
!
!
!
case 2:
!
!
!
!
estadoActual = 1;
!
!
!
!
mostrarLetras(numErroresJ1);
!
!
!
!
ledBjug1.encender();
!
!
!
!
ledBjug2.apagar();
!
!
!
!
break;
!
!
!
case 3:
!
!
!
!
estadoActual = 1;
!
!
!
!
numErroresJ2++;
!
!
!
!
mostrarLetras(numErroresJ2);
!
!
!
!
delay(3000);
!
!
!
!
mostrarLetras(numErroresJ1);
!
!
!
!
ledBjug1.encender();
!
!
!
!
ledBjug2.apagar();
!
!
!
!
break;

521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585

!
!
!
!
!
!
!
!
!
!
!
!
!
!

!
!
!
!
!
!
!
!
!
!
!
!
!
}

!
!
!
!
!
!
!
!
!
!
!
!
}

!
!
!
!
!
!
!
!
!
!
!
}

case 4:
!
estadoActual = 2;
!
numErroresJ1++;
!
mostrarLetras(numErroresJ1);
!
delay(3000);
!
mostrarLetras(numErroresJ2);
!
ledBjug2.encender();
!
ledBjug1.apagar();
!
break;
default:
!
break;

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
}

delay(3000);
if (numErroresJ1 == 4){
!
pantalla.mostrar("J1");
!
delay(2000);
!
pantalla.mostrar("LOSE");
!
delay(4000);
!
pantalla.mostrar("J2");
!
delay(2000);
!
pantalla.mostrar("GANA");
!
delay(4000);
}else if (numErroresJ2 == 4){
!
pantalla.mostrar("J2");
!
delay(2000);
!
pantalla.mostrar("LOSE");
!
delay(4000);
!
pantalla.mostrar("J1");
!
delay(2000);
!
pantalla.mostrar("GANA");
!
delay(4000);
}

void mostrarLetras(int numErrores){


!
switch(numErrores){
!
!
case 1: pantalla.mostrar("A");
!
!
!
break;
!
!
case 2: pantalla.mostrar("AS");
break;
!
!
case 3: pantalla.mostrar("ASN");
break;
!
!
case 4: pantalla.mostrar("ASNO");
break;
!
!
default:
break;
!
}
}
void juego11 () {
!
// Marcadores para los jugadores
!
int puntosJugador1 = 0;
!
int puntosJugador2 = 0;
!
bool turnoJ1 = true;
!
!
ledBjug1.encender();
ledBjug2.apagar();
!
!
!
!

// Cuenta atras
bocina.charge();
// Continuar la partida hasta que uno de los jugadores llegue a 11

586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650

!
!
!
!
!
!
!
!

while (puntosJugador1 != 11 && puntosJugador2 != 11) {


!
// Marcador, con los dos digitos de la izquierda para la puntuacion del jugador 1
!
// y los dos digitos de la derecha para la puntuacion del jugador 2
!
int marcador = puntosJugador1 * 100 + puntosJugador2;
!
!
// Mostrar marcador
!
Serial.write(byte(119));
// Activar seperador
!
Serial.write(byte(16));
// Activar seperador

!
!
!
!
!
!

!
!
!
!
!
!

if (marcador < 10)


!
Serial.print("000");
else if (marcador < 100)
!
Serial.print("00");
else if (marcador < 1000)
!
Serial.print("0");

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
}

Serial.print(marcador);

pantalla.resetear();!

!
!
!
!
!
!
!
!
!
!
!
!
}

if ((int)(puntosJugador1 / 100) == 11){


!
pantalla.formarPalabraDerIzq("JUG1");
!
delay(2000);
!
pantalla.formarPalabraDerIzq("GANA");
!
delay(2000);
}
else {
!
pantalla.formarPalabraDerIzq("JUG2");
!
delay(2000);
!
pantalla.formarPalabraDerIzq("GANA");
!
delay(2000);
}

//
if
!
!
!
!
!
!
}
//
if
!
!
!
!
!
!
!
!
!
!
!
!
!
}

Si anota canasta
(canastaJugador1.presionado()) {
if (turnoJ1)
!
puntosJugador1++;
else
!
puntosJugador2++;
!
delay(500);
Si no anota
(botonAceptar.presionado()) {
// Cambio de turno
turnoJ1 = !turnoJ1;
// Encender la luz del jugador que sea el turno
if (turnoJ1) {
!
ledBjug1.encender();
ledBjug2.apagar();
} else {
!
ledBjug2.encender();
ledpBjug1.apagar();
}
delay(500);

// Desactivar separador

/************************************************************************************
!
!
!
!
!
!
!
!
FUNCIONES ADICIONALES
************************************************************************************/

651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715

/*
Muestra por el Display4x7 quien ha sido el ganador de la partida
*/
void mostrarGanador (int puntos1, int puntos2) {
!
if (puntos1 > puntos2) {
!
!
pantalla.mostrar("GANA");
!
!
delay(1000);
!
!
pantalla.mostrar("JUG1");
!
!
delay(1000);
!
} else if (puntos2 > puntos1) {
!
!
pantalla.mostrar("GANA");
!
!
delay(1000);
!
!
pantalla.mostrar("JUG2");
!
!
delay(1000);
!
} else {
!
!
pantalla.mostrar("IGUA");
!
!
delay(1000);
!
}
}
/*
Marca un tic de reloj, restando 1 a los segundos restantes en cada iteracion
*/
void tic() {
!
segundosRestantes--;
}
void palabra () {
!
pantalla.deslizarCaracterDerIzq('1', 500);
}
/*
!
Enciende los leds de bonus de cada jugador
*/
void encenderLedsBonus (int bonusJug1, int bonusJug2) {
!
if (bonusJug1 >= 300) {
!
!
ledRjug1.encender(255);
!
!
ledAjug1.encender(255);
!
!
ledVjug1.encender(255);
!
} else if (bonusJug1 >= 200) {
!
!
ledRjug1.encender(255);
!
!
ledAjug1.encender(255);
!
!
ledVjug1.encender((int)((bonusJug1-200) * 2.55));
!
} else if (bonusJug1 >= 100) {
!
!
ledRjug1.encender(255);
!
!
ledAjug1.encender((int)((bonusJug1-100) * 2.55));
!
!
ledVjug1.encender(0);
!
} else {
!
!
ledRjug1.encender((int)(bonusJug1 * 2.55));
!
!
ledAjug1.encender(0);
!
!
ledVjug1.encender(0);
!
}
!
!
!
!
!
!
!
!
!
!
!

if (bonusJug2 >= 300) {


!
ledRjug2.encender(255);
!
ledAjug2.encender(255);
!
ledVjug2.encender(255);
} else if (bonusJug2 >= 200) {
!
ledRjug2.encender(255);
!
ledAjug2.encender(255);
!
ledVjug2.encender((int)((bonusJug2-200) * 2.55));
} else if (bonusJug2 >= 100) {
!
ledRjug2.encender(255);
!
ledAjug2.encender((int)((bonusJug2-100) * 2.55));

716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774

!
!
!
!
!
!
}

!
ledVjug2.encender(0);
} else {
!
ledRjug2.encender((int)(bonusJug2 * 2.55));
!
ledAjug2.encender(0);
!
ledVjug2.encender(0);
}

/*
!
Enciende y apaga los leds y muestra un mensaje por pantalla para comprobar
!
que todos los dispositivos funcionan correctamente
*/
void test () {
!
pantalla.mostrar("HOLA");
!
delay(250);
!
!
ledRjug1.encender();
!
ledAjug1.encender();
!
ledVjug1.encender();
!
ledBjug1.encender();
!
ledRjug2.encender();
!
ledAjug2.encender();
!
ledVjug2.encender();
!
ledBjug2.encender();
!
delay(250);
!
!
ledRjug1.apagar();
!
ledAjug1.apagar();
!
ledVjug1.apagar();
!
ledBjug1.apagar();
!
ledRjug2.apagar();
!
ledAjug2.apagar();
!
ledVjug2.apagar();
!
ledBjug2.apagar();
!
delay(50);
!
!
ledRjug1.encender();
!
ledAjug1.encender();
!
ledVjug1.encender();
!
ledBjug1.encender();
!
ledRjug2.encender();
!
ledAjug2.encender();
!
ledVjug2.encender();
!
ledBjug2.encender();
!
delay(250);
!
!
ledRjug1.apagar();
!
ledAjug1.apagar();
!
ledVjug1.apagar();
!
ledBjug1.apagar();
!
ledRjug2.apagar();
!
ledAjug2.apagar();
!
ledVjug2.apagar();
!
ledBjug2.apagar();
!
!
pantalla.resetear();
}

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

/*
Display4x7.h - Biblioteca para una pantalla de leds de 4x7 segmentos serie
@author: Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version: 1.2
*/
#ifndef Display4x7_h
#define Display4x7_h
#include "Arduino.h"
class Display4x7 {
public:
!
Display4x7 (void);
!
void resetear (void);
!
void ajustarBrillo (int valor);
!
void mostrar (String texto);
!
void borrar (void);
!
void deslizarCaracterIzqDer (char caracter, int duracion);
!
void deslizarCaracterDerIzq (char caracter, int duracion);
!
void deslizarPalabraDentroIzqDer (String palabra, int duracion);
!
void deslizarPalabraDentroDerIzq (String palabra, int duracion);
!
void deslizarPalabraFueraIzqDer (String palabra, int duracion);
!
void deslizarPalabraFueraDerIzq (String palabra, int duracion);
!
void formarPalabraIzqDer (String palabra);
!
void formarPalabraDerIzq (String palabra);
};
#endif

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

/*
Display4x7.cpp - Biblioteca para una pantalla de leds de 4x7 segmentos serie
@author! Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version! 1.2
*/
#include "Arduino.h"
#include "Display4x7.h"
/*
!
Constructor para un objeto de la clase Display4x7
*/
Display4x7::Display4x7 (void) {
!
// Resetear pantalla
!
Serial.print("v");
!
!
!
!
!
!
!
!
}

// Desactivar separador
Serial.write(byte(119));
Serial.write(byte(0));

// Desactivar seperador
// Desactivar seperador

// Brillo al maximo
Serial.write(byte(122));!
Serial.write(byte(0));! !

// Valor para fijar el brillo


// Fijar el nuevo brillo

/*
!
Resetea el display poniendo el brillo al maximo y borrando tanto los caracteres
!
mostrados como los separadores que hubiera activados
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.1
*/
void Display4x7::resetear (void) {
Serial.print("v");
// rested led screen
Serial.write(byte(122));
// Brillo al maximo
Serial.write(byte(0));
// Brillo al maximo
Serial.print("xxxx");
// Desactivar separador
Serial.write(byte(119));
Serial.write(byte(0));

// Desactivar seperador
// Desactivar seperador

/*
!
Ajusta el brillo del display al valor indicado como porcentaje
!
0 = apagada
!
100 = brillo maximo
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.1
*/
void Display4x7::ajustarBrillo (int valor) {
! if (valor >= 0 && valor <= 100) {
!
!
int nuevoBrillo = 254 - (int)(valor*2.54);! // Valor entre 0 y 255
!
!
Serial.write(byte(122));!
!
!
!
!
// Valor para fijar el brillo
!
!
Serial.write(byte(nuevoBrillo));!
!
!
// Fijar el nuevo brillo
!
}
}
/*
!
!
!
!

Muestra la cadena de hasta 4 caracteres en el display


@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version!
1.0
@since! !
1.0

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
117
118
119
120
121
122
123
124
125
126
127
128
129
130

*/
void Display4x7::mostrar (String texto) {
!
if (texto.length() <= 4) {
!
!
if (texto.length() == 0)
!
!
!
Display4x7::borrar();
!
!
else {
!
!
!
if (texto.length() == 1)
!
!
!
!
Serial.print("xxx");
!
!
!
else if (texto.length() == 2)
!
!
!
!
Serial.print("xx");
!
!
!
else if (texto.length() == 3)
!
!
!
!
Serial.print("x");
!
!
!
!
!
!
!
Serial.print(texto);
!
!
}
!
} else {
!
!
Serial.print(texto[3]);
!
!
Serial.print(texto[2]);
!
!
Serial.print(texto[1]);
!
!
Serial.print(texto[0]);
!
}
}

/*
!
Borra el contenido de la pantalla
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
void Display4x7::borrar (void) {
!
Serial.print("xxxx");
}

/*
!
Desliza de izquierda a derecha por el display el caracter pasado
!
como argumento con la duracion total indicada como argumento
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
void Display4x7::deslizarCaracterIzqDer (char caracter, int duracion) {
!
// Restear el display
!
Serial.print("v");
!
!
!
!
!
!

/*
!
C _ _ _
*/
Serial.print(caracter);
Serial.print("xxx");
delay((int)(duracion/5));

!
!
!
!
!
!
!

/*
!
_ C _ _
*/
Serial.print("x");
Serial.print(caracter);
Serial.print("xx");
delay((int)(duracion/5));

!
!
!
!
!
!

/*
!
_ _ C _
*/
Serial.print("xx");
Serial.print(caracter);
Serial.print("x");

131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195

delay((int)(duracion/5));

!
!
!
!
!
!

/*
!
_ _ _ C
*/
Serial.print("xxx");
Serial.print(caracter);
delay((int)(duracion/5));

!
!
!
!
!
}

/*
!
_ _ _ _
*/
Serial.print("xxxx");
delay((int)(duracion/5));

/*
!
Desliza de derecha a izquierda por el display el caracter pasado
!
como argumento con la duracion total indicada como argumento
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
void Display4x7::deslizarCaracterDerIzq (char caracter, int duracion) {
!
// Restear el display
!
Serial.print("v");
!
!
!
!
!
!

/*
!
_ _ _ C
*/
Serial.print("xxx");
Serial.print(caracter);
delay((int)(duracion/5));

!
!
!
!
!
!
!

/*
!
_ _ C _
*/
Serial.print("xx");
Serial.print(caracter);
Serial.print("x");
delay((int)(duracion/5));

!
!
!
!
!
!
!

/*
!
_ C _ _
*/
Serial.print("x");
Serial.print(caracter);
Serial.print("xx");
delay((int)(duracion/5));

!
!
!
!
!
!

/*
!
C _ _ _
*/
Serial.print(caracter);
Serial.print("xxx");
delay((int)(duracion/5));

!
!
!
!
!
}

/*
!
_ _ _ _
*/
Serial.print("xxxx");
delay((int)(duracion/5));

/*

196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260

!
Desliza dentro del display una palabra de cuatro caracteres
!
desde el lado izquierdo al derecho
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.2
*/
void Display4x7::deslizarPalabraDentroIzqDer (String palabra, int duracion) {
!
if (palabra.length() != 4)
!
!
return;
!
!
// Resetear el display
!
Serial.print("v");
!
!
char caracter0 = palabra[0];
!
char caracter1 = palabra[1];
!
char caracter2 = palabra[2];
!
char caracter3 = palabra[3];
!
!
/*
!
!
3 _ _ _
!
*/
!
Serial.print(caracter3);
!
Serial.print("xxx");
!
delay((int)(duracion/4));
!
!
/*
!
!
2 3 _ _
!
*/
!
Serial.print(caracter2);
!
Serial.print(caracter3);
!
Serial.print("xx");
!
delay((int)(duracion/4));
!
!
/*
!
!
1 2 3 _
!
*/
!
Serial.print(caracter1);
!
Serial.print(caracter2);
!
Serial.print(caracter3);
!
Serial.print("x");
!
delay((int)(duracion/4));
!
!
/*
!
!
0 1 2 3
!
*/
!
Serial.print(caracter0);
!
Serial.print(caracter1);
!
Serial.print(caracter2);
!
Serial.print(caracter3);
}

/*
!
Desliza dentro del display una palabra de cuatro caracteres
!
desde el lado derecho al izquierdo
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.2
*/
void Display4x7::deslizarPalabraDentroDerIzq (String palabra, int duracion) {
!
if (palabra.length() != 4)
!
!
return;
!
!
// Resetear el display
!
Serial.print("v");
!

261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
}

char
char
char
char

caracter0
caracter1
caracter2
caracter3

=
=
=
=

palabra[0];
palabra[1];
palabra[2];
palabra[3];

/*
!
_ _ _ 0
*/
Serial.print("xxx");
Serial.print(caracter0);
delay((int)(duracion/4));
/*
!
_ _ 0 1
*/
Serial.print("xx");
Serial.print(caracter0);
Serial.print(caracter1);
delay((int)(duracion/4));
/*
!
_ 0 1 2
*/
Serial.print("x");
Serial.print(caracter0);
Serial.print(caracter1);
Serial.print(caracter2);
delay((int)(duracion/4));
/*
!
0 1 2 3
*/
Serial.print(caracter0);
Serial.print(caracter1);
Serial.print(caracter2);
Serial.print(caracter3);

/*
!
Desliza fuera del display una palabra de cuatro caracteres
!
desde el lado izquierdo al derecho
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanc
!
@version!
1.0
!
@since! !
1.2
*/
void Display4x7::deslizarPalabraFueraIzqDer (String palabra, int duracion) {
!
if (palabra.length() != 4)
!
!
return;
!
!
// Resetear el display
!
Serial.print("v");
!
!
char caracter0 = palabra[0];
!
char caracter1 = palabra[1];
!
char caracter2 = palabra[2];
!
char caracter3 = palabra[3];
!
!
/*
!
!
_ 0 1 2
!
*/
!
Serial.print("x");
!
Serial.print(caracter0);
!
Serial.print(caracter1);
!
Serial.print(caracter2);
!
delay((int)(duracion/4));

326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
}

/*
!
_ _ 0 1
*/
Serial.print("xx");
Serial.print(caracter0);
Serial.print(caracter1);
delay((int)(duracion/4));
/*
!
_ _ _ 0
*/
Serial.print("xxx");
Serial.print(caracter0);
delay((int)(duracion/4));
/*
!
_ _ _ _
*/
Serial.print("xxxx");

/*
!
Desliza fuera del display una palabra de cuatro caracteres
!
desde el lado derecho al izquierdo
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanc
!
@version!
1.0
!
@since! !
1.2
*/
void Display4x7::deslizarPalabraFueraDerIzq (String palabra, int duracion) {
!
if (palabra.length() != 4)
!
!
return;
!
!
// Resetear el display
!
Serial.print("v");
!
!
char caracter0 = palabra[0];
!
char caracter1 = palabra[1];
!
char caracter2 = palabra[2];
!
char caracter3 = palabra[3];
!
!
/*
!
!
1 2 3 _
!
*/
!
Serial.print(caracter1);
!
Serial.print(caracter2);
!
Serial.print(caracter3);
!
Serial.print("x");
!
delay((int)(duracion/4));
!
!
/*
!
!
2 3 _ _
!
*/
!
Serial.print(caracter2);
!
Serial.print(caracter3);
!
Serial.print("xx");
!
delay((int)(duracion/4));
!
!
/*
!
!
3 _ _ _
!
*/
!
Serial.print(caracter3);
!
Serial.print("xxx");
!
delay((int)(duracion/4));
!

391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455

!
!
!
!
}

/*
!
_ _ _ _
*/
Serial.print("xxxx");

/*
!
Rellena el display con una palabra de 4 caracteres
!
desplazando caracter a caracter de izquierda a derecha
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanc
!
@version!
1.0
!
@since! !
1.0
*/
void Display4x7::formarPalabraIzqDer (String palabra) {
!
if (palabra.length() != 4)
!
!
return;
!
!
!
// Restear el display
!
Serial.print("v");
!
!
!
!

char
char
char
char

caracter0
caracter1
caracter2
caracter3

!
!
!
!
!
!

/*
!
3 _ _ _
*/
Serial.print(caracter3);
Serial.print("xxx");
delay(200);

!
!
!
!
!
!
!

/*
!
_ 3 _ _
*/
Serial.print("x");
Serial.print(caracter3);
Serial.print("xx");
delay(200);

!
!
!
!
!
!
!

/*
!
_ _ 3 _
*/
Serial.print("xx");
Serial.print(caracter3);
Serial.print("x");
delay(200);

!
!
!
!
!
!

/*
!
_ _ _ 3
*/
Serial.print("xxx");
Serial.print(caracter3);
delay(200);

!
!
!
!
!
!
!

/*
!
2 _ _ 3
*/
Serial.print(caracter2);
Serial.print("xx");
Serial.print(caracter3);
delay(200);

!
!

/*
!

_ 2 _ 3

=
=
=
=

palabra[0];
palabra[1];
palabra[2];
palabra[3];

456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520

!
!
!
!
!
!

*/
Serial.print("x");
Serial.print(caracter2);
Serial.print("x");
Serial.print(caracter3);
delay(200);

!
!
!
!
!
!
!

/*
!
_ _ 2 3
*/
Serial.print("xx");
Serial.print(caracter2);
Serial.print(caracter3);
delay(200);

!
!
!
!
!
!
!
!

/*
!
1 _ 2 3
*/
Serial.print(caracter1);
Serial.print("x");
Serial.print(caracter2);
Serial.print(caracter3);
delay(200);

!
!
!
!
!
!
!
!

/*
!
_ 1 2 3
*/
Serial.print("x");
Serial.print(caracter1);
Serial.print(caracter2);
Serial.print(caracter3);
delay(200);

!
!
!
!
!
!
!

/*
!
0 1 2 3
*/
Serial.print(caracter0);
Serial.print(caracter1);
Serial.print(caracter2);
Serial.print(caracter3);
delay(200);

/*
!
!
!
!
!
*/

Rellena el display con una palabra de 4 caracteres


desplazando caracter a caracter de derecha a izquierda
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanc
@version!
1.0
@since! !
1.0

void Display4x7::formarPalabraDerIzq (String palabra) {


//if (palabra.length() != 4)
!
!
//return;
!
!

// Restear el display
Serial.print("v");

!
!
!
!

char
char
char
char

/*

caracter0
caracter1
caracter2
caracter3

=
=
=
=

palabra[0];
palabra[1];
palabra[2];
palabra[3];

521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585

!
!
!
!
!

!
_ _ _ 0
*/
Serial.print("xxx");
Serial.print(caracter0);
delay(200);

!
!
!
!
!
!
!

/*
!
_ _ 0 _
*/
Serial.print("xx");
Serial.print(caracter0);
Serial.print("x");
delay(200);

!
!
!
!
!
!
!

/*
!
_ 0 _ _
*/
Serial.print("x");
Serial.print(caracter0);
Serial.print("xx");
delay(200);

!
!
!
!
!
!

/*
!
0 _ _ _
*/
Serial.print(caracter0);
Serial.print("xxx");
delay(200);

!
!
!
!
!
!
!

/*
!
0 _ _ 1
*/
Serial.print(caracter0);
Serial.print("xx");
Serial.print(caracter1);
delay(200);

!
!
!
!
!
!
!
!

/*
!
0 _ 1 _
*/
Serial.print(caracter0);
Serial.print("x");
Serial.print(caracter1);
Serial.print("x");
delay(200);

!
!
!
!
!
!
!

/*
!
0 1 _ _
*/
Serial.print(caracter0);
Serial.print(caracter1);
Serial.print("xx");
delay(200);

!
!
!
!
!
!
!
!

/*
!
0 1 _ 2
*/
Serial.print(caracter0);
Serial.print(caracter1);
Serial.print("x");
Serial.print(caracter2);
delay(200);

!
!

/*
!

0 1 2 _

586
587
588
589
590
591
592
593
594
595
596
597
598
599

!
!
!
!
!
!

*/
Serial.print(caracter0);
Serial.print(caracter1);
Serial.print(caracter2);
Serial.print("x");
delay(200);

!
!
!
!

/*
!
0 1 2 3
*/
Serial.print(palabra);
delay(200);

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

/*
LedAnalogico.h - Biblioteca para controlar la luminosidad de un led conectado a un
puerto con salida analogica
@author: Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version: 1.1
*/
#ifndef LedAnalogico_h
#define LedAnalogico_h
#include "Arduino.h"
class LedAnalogico {
!
public:
!
!
LedAnalogico (int pin);
LedAnalogico (int pin, boolean positivo);
void encender (int intensidad);
void encender ();
void apagar ();
!
!

private:
!
int _pin;
boolean _positivo;

};
#endif

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

/*
LedAnalogico.cpp - Biblioteca para controlar la luminosidad de un led conectado a un
puerto con salida analogica
@author: Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version: 1.0
*/
#include "Arduino.h"
#include "LedAnalogico.h"
/*
!
Constructor para un objeto de la clase LedAnalogico, se usara HIGH para encender el
!
led y LOW para apagarlo por defecto
*/
LedAnalogico::LedAnalogico (int pin) {
!
_pin = pin;
_positivo = true;
pinMode(pin, OUTPUT);
}
/*
!
Constructor para un objeto de la clase LedAnalogico, se usara HIGH para encender el
!
led y LOW para apagarlo si "positivo" vale true, y al contrario si "positivo" vale
!
false
*/
LedAnalogico::LedAnalogico (int pin, boolean positivo) {
!
_pin = pin;
_positivo = positivo;
pinMode(pin, OUTPUT);
}

/*
!
Enciende el led con la intensidad indicada como parametro, siendo 255 el valor para
!
la maxima luminosidad y 0 para la minima. Si el valor pasado como parametro esta
!
fuera del rango se usara 255 si el valor del parametro es es mayor que este 255 y 0 si
!
el valor del parametro es menor que 0
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
void LedAnalogico::encender (int intensidad) {
if (_positivo) {
if (intensidad >= 255) {
analogWrite(_pin, 255);
}
else if (intensidad <= 0) {
analogWrite(_pin, 0);
}
else {
analogWrite(_pin, intensidad);
}
}
else {
if (intensidad >= 255) {
analogWrite(_pin, 0);
}
else if (intensidad <= 0) {
analogWrite(_pin, 255);
}
else {
analogWrite(_pin, 255 - intensidad);
}
}
}

66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

/*
!
Enciende el led con intensidad maxima
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.1
*/
void LedAnalogico::encender () {
!
LedAnalogico::encender(255);
}

/*
!
Apaga el led poniendole luminosidad 0
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
void LedAnalogico::apagar () {
LedAnalogico::encender(0);
}

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

/*
LedDigital.h - Biblioteca para controlar un led conectado a un puerto con salida digital
@author! Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version! 1.0
*/
#ifndef LedDigital_h
#define LedDigital_h
#include "Arduino.h"
class LedDigital {
!
public:
!
!
LedDigital (int pin);
!
LedDigital (int pin, boolean positivo);
void encender ();
void apagar ();
!
!

private:
!
int _pin;
boolean _positivo;

};
#endif

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

/*

LedDigital.cpp - Biblioteca para controlar un led conectado a un puerto con salida digita
@author! Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version! 1.0
*/
#include "Arduino.h"
#include "LedDigital.h"
/*
!
Constructor para un objeto de la clase LedAnalogico, se usara HIGH para encender el
!
led y LOW para apagarlo por defecto
*/
LedDigital::LedDigital (int pin) {
!
_pin = pin;
_positivo = true;
pinMode(pin, OUTPUT);
}
/*
!
Constructor para un objeto de la clase LedDigital, se usara HIGH para encender el
!
led y LOW para apagarlo si "positivo" vale true, y al contrario si "positivo" vale
!
false
*/
LedDigital::LedDigital (int pin, boolean positivo) {
!
_pin = pin;
_positivo = positivo;
!
pinMode(pin, OUTPUT);
}

/*
!
Enciende el led
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
void LedDigital::encender () {
if (_positivo) {
digitalWrite(_pin, HIGH);
}
else {
digitalWrite(_pin, LOW);
}
}

/*
!
Apaga el led
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
void LedDigital::apagar () {
if (_positivo) {
digitalWrite(_pin, LOW);
}
else {
digitalWrite(_pin, HIGH);
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

/*
Piezoelectrico.h - Biblioteca para tocar la melodia "Charge" con un piezoelectrico
@author: Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version: 1.0
*/
#ifndef Piezoelectrico_h
#define Piezoelectrico_h
#include "Arduino.h"
class Piezoelectrico {
!
public:
!
!
Piezoelectrico (int pin);
!
!
void charge ();
!
!
private:
!
!
int _pin;
};
#endif

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

/*
Piezoelectrico.cpp - Biblioteca para tocar la melodia "Charge" con un piezoelectrico
@author: Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version: 1.0
*/
#include "Arduino.h"
#include "Piezoelectrico.h"
#include "Metro.h"
// Frecuencia en hercios de las notas musicales
#define DO 261.626
#define RE 293.665
#define MI 329.628
#define FA 349.228
#define FA_ 370
#define SOL 391.995
#define SOL_ 415
#define LA
440.000
#define LA_ 466
#define SI
493.883
#define DO2 523.251
#define RE2 587.33
#define MI2 659.255
#define FA2 698
#define SOL2 784
#define LA2 880
#define SILENCIO 0

float cancionCharge[]={LA_, FA_, SOL_, LA_, SI,


FA_, SOL_, LA_, DO2, SOL, LA, SI, DO2, SOL, LA, SI, DO2, SILENCIO,
SOL, DO2, MI2, SOL2, MI2, SOL2, SILENCIO}; // Cancion
float duracionCharge[]={2.0, 1.80, 1.80, 1.75, 1.75,
1.70, 1.70, 1.65, 1.65, 1.60, 1.60, 1.55, 1.55, 1.50, 1.50, 1.45, 2.5, 2.0,
1.0, 1.0, 1.0, 2.0, 1.0, 4.0, 0};
float cancionChargeCompleta[]={LA_, FA, SOL, LA, LA_, FA, SOL, LA, SI, FA_, SOL_, LA_, SI,
FA_, SOL_, LA_, DO2, SOL, LA, SI, DO2, SOL, LA, SI, DO2, SILENCIO,
SOL, DO2, MI2, SOL2, MI2, SOL2, SILENCIO}; // Cancion*/
float duracionChargeCompleta[]={2.0, 2.0, 2.0, 1.95, 1.95, 1.90, 1.90, 1.85, 1.85, 1.80, 1.
1.70, 1.70, 1.65, 1.65, 1.60, 1.60, 1.55, 1.55, 1.50, 1.50, 1.45, 2.5, 2.0,
1.0, 1.0, 1.0, 2.0, 1.0, 4.0, 0};

String cuentaAtras[]={! "5xxx", "x5xx", "xx5x", "xxx5", "xxxx", "4xxx", "x4xx", "xx4x", "xx
!
!
!
!
!
!
"3xxx", "x3xx", "xx3x", "xxx3", "xxxx", "2xxx", "x2xx", "xx2x", "xx
!
!
!
!
!
! "1xxx", "x1xx", "xx1x", "xxx1", "xxxx", "xGOx"};
/*
!
Constructor para un objeto de la clase Piezoelectrico
*/
Piezoelectrico::Piezoelectrico (int pin) {
!
_pin = pin;
!
pinMode(_pin, OUTPUT);
}

/*
!
Toca la melodia "Charge" en el piezoelectrico
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
void Piezoelectrico::charge() {
boolean continuar = true;
int i = 0;
int j = 0;

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

Metro metronomoCancion(duracionCharge[i]*150);
Metro metronomoPantalla(200);
Serial.print(cuentaAtras[i]);
!
!
!
!
!
!
!
!
!
!

while (continuar) {
!
if (metronomoCancion.check()) {
!
!
if (cancionCharge[i] == 0)
!
!
!
noTone(_pin);
!
!
else
!
!
!
tone(_pin, round(cancionCharge[i]));
!
!
!
!
metronomoCancion.interval(duracionCharge[i]*150);
!
!
i++;
!
}

!
!

!
!

if (i >= sizeof(cancionCharge)/sizeof(float))
!
continuar = false;
if (metronomoPantalla.check()) {
if (++j < 26)
Serial.print(cuentaAtras[j]);
}

}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

/*
Pulsador.h - Biblioteca para controlar un pulsador
@author: Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version: 1.0
*/
#ifndef Pulsador_h
#define Pulsador_h
#include "Arduino.h"
class Pulsador {
!
public:
!
!
Pulsador (int salida);
!
!
bool presionado ();
!
!
};

private:
!
int _salida;

#endif

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

/*
Pulsador.cpp - Biblioteca para controlar un pulsador
@author: Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version: 1.0
*/
#include "Arduino.h"
#include "Pulsador.h"
/*
!
Constructor para un objeto de la clase Pulsador
*/
Pulsador::Pulsador (int salida) {
!
_salida = salida;
}
/*
!
Devuelve true si el pulsador esta presionado y false en caso contrario
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
bool Pulsador::presionado () {
!
return (digitalRead(_salida) == HIGH);
}

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

/*
PushButtonRedRing.h - Biblioteca para controlar un boton del tipo push button con
un anillo iluminado de color rojo
@author: Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version: 1.0
*/
#ifndef PushButtonRedRing_h
#define PushButtonRedRing_h
#include "Arduino.h"
class PushButtonRedRing {
!
public:
!
!
PushButtonRedRing (int salida);
!
!
PushButtonRedRing (int led, int salida);
!
!
void encender ();
!
!
void apagar ();
!
!
bool presionado ();
!
!
!
!
};

private:
!
int _led;
!
int _salida;
!
boolean _tieneLed;

#endif

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

/*
PushButtonRedRing.cpp - Biblioteca para controlar un boton del tipo push button con
un anillo iluminado de color rojo
@author: Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version: 1.0
*/
#include "Arduino.h"
#include "PushButtonRedRing.h"
/*
!
Constructor para un objeto de la clase PushButtonRedRing para la cual no se quiere
!
controlar el led no permitiendose encenderlo ni apagarlo
*/
PushButtonRedRing::PushButtonRedRing (int salida) {
!
_salida = salida;
!
_tieneLed = false;
}
/*
!
Constructor para un objeto de la clase PushButtonRedRing para la cual se quiere
!
controlar el led permitiendose encenderlo y apagarlo
*/
PushButtonRedRing::PushButtonRedRing (int led, int salida) {
!
_salida = salida;
!
_led = led;
!
pinMode(_led, OUTPUT);
!
_tieneLed = true;
}

/*
!
Se encender el led del boton en el caso de que se permita la accion
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
void PushButtonRedRing::encender () {
!
if (_tieneLed)
!
!
digitalWrite(_led, LOW);
}

/*
!
Se apagar el led del boton en el caso de que se permita la accion
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
void PushButtonRedRing::apagar () {
!
if (_tieneLed)
!
!
digitalWrite(_led, HIGH);
}

/*
!
Devuelve true si el pulsador esta presionado y false en caso contrario
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
bool PushButtonRedRing::presionado () {
!
return (digitalRead(_salida) == HIGH);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

/*
SensorCanasta.h - Biblioteca para controlar un pulsador
@author: Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version: 1.0
*/
#ifndef SensorCanasta_h
#define SensorCanasta_h
#include "Arduino.h"
class SensorCanasta {
!
public:
!
!
SensorCanasta (int pin);
!
!
bool presionado ();
!
!
};

private:
!
int _pin;

#endif

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

/*
SensorCanasta.cpp - Biblioteca para controlar un sensor de la canasta
@author: Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
@version: 1.0
*/
#include "Arduino.h"
#include "SensorCanasta.h"
/*
!
Constructor para un objeto de la clase Pulsador
*/
SensorCanasta::SensorCanasta (int pin) {
!
_pin = pin;
}
/*
!
Devuelve true si el pulsador esta presionado y false en caso contrario
!
@author!!
Victor Hernandez Bermejo, Gabriel Rodriguez Polaina, Diego Sepulveda Blanco
!
@version!
1.0
!
@since! !
1.0
*/
bool SensorCanasta::presionado () {
!
return (analogRead(_pin) == 1023);
}