Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: C12832 LM75B MMA7660 Speaker mbed
Fork of app-shield-LCD by
Revision 6:402e96a482a9, committed 2017-01-24
- Comitter:
- kv09
- Date:
- Tue Jan 24 16:04:35 2017 +0000
- Parent:
- 5:f8ef5e45e488
- Commit message:
- Nucleo chiaverini
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LM75B.lib Tue Jan 24 16:04:35 2017 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/chris/code/LM75B/#6a70c9303bbe
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MMA7660.lib Tue Jan 24 16:04:35 2017 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/Sissors/code/MMA7660/#36a163511e34
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Speaker.lib Tue Jan 24 16:04:35 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/zchen311/code/Speaker/#41292907c9cb
--- a/main.cpp Fri Aug 01 14:30:24 2014 +0000
+++ b/main.cpp Tue Jan 24 16:04:35 2017 +0000
@@ -1,20 +1,628 @@
#include "mbed.h"
#include "C12832.h"
+#include "MMA7660.h"
+#include "LM75B.h"
+#include "Speaker.h"
+#include <stdlib.h>
+#include <time.h>
+#include <string>
-// Using Arduino pin notation
-C12832 lcd(D11, D13, D12, D7, D10);
+ // Using Arduino pin notation
+ /************* LCD ****************/
+ C12832 lcd(D11, D13, D12, D7, D10);
+
+/********* Potentiometre *********/
+AnalogIn pot1(A0);
+AnalogIn pot2(A1);
+
+/************** LED ***************/
+DigitalOut r(D5);
+DigitalOut b(D8);
+DigitalOut g(D9);
+
+/*********** Analogue *************/
+DigitalIn up(A2); //AnalogIn
+DigitalIn down(A3);
+DigitalIn gau(A4);
+DigitalIn droi(A5);
+DigitalIn fire(D4);
+
+/*********** Speaker **************/
+Speaker spkr(D6);
+
+/********* Accelerometre **********/
+MMA7660 MMA(D14, D15);
+
+/***** Capteur de température *****/
+LM75B sensor(D14, D15);
+
+//Variable globale
+// Integer
+int horizontalBall = 35;
+int scorej1 = 0;
+int scorej2 = 0;
+int verticalJ1 = 0;
+int verticalJ2 = 0;
+int victoirej1 = 0;
+int victoirej2 = 0;
+int nbcontact = 0;
+int rapide = 3;
+int choix;
+int ajoutvit = 1;
+// Float
+float angle = 1.5;
+float verticalBall = 5.0;
+float vitesse = 0;
+float vitessebase = 0;
+// Boolean
+bool avance = true;
+bool recule = false;
+bool but = false;
+bool joue = true;
+bool diag1 = true;
+bool diag2 = false;
+bool partie = true;
+bool lance = true;
+bool stop = false;
+//String
+string tab[3] = {
+ "lent",
+ "normal",
+ "rapide"
+};;
+
+// Fonction du contact entre la balle et le joueur
+bool contact(int a, float b) {
+ nbcontact++;
+ // Fait accelerer la balle pour un certain nombre de contact
+ if (nbcontact % rapide == 0) {
+ if (vitesse > 0.03) {
+ vitesse = vitesse - 0.005;
+ }
+ if (ajoutvit < 4) {
+ ajoutvit++;
+ }
+ }
+ // Variation de l'angle en fonction d'ou est tapé la balle
+ if (a >= b + 2 && a <= b + 5) {
+ angle = 0.5;
+ return true;
+ } else if (a >= b - 1 && a <= b + 2) {
+ angle = 1.0;
+ return true;
+ } else if (a >= b - 4 && a <= b - 1) {
+ angle = 1.5;
+ return true;
+ } else {
+ return false;
+ }
+}
+
+// Fonction d'initialisationialisation
+void initialisation() {
+ horizontalBall = 50;
+ verticalBall = (rand() % 20) + 1;
+ avance = true;
+ recule = false;
+ but = false;
+ joue = true;
+ vitesse = vitessebase;
+ ajoutvit = 1;
+ lcd.cls();
+ // Décompte avant commencement de la partie
+ for (int i = 2; i > 0; i--) {
+ lcd.locate(35, 10);
+ lcd.printf("Commence dans %d", i);
+ wait(1);
+ lcd.cls();
+ }
+}
+
+// Fonction d'affichage
+void affichage() {
+ // Cadre du terrain
+ lcd.rect(32, 0, 127, 31, 1);
+ lcd.copy_to_lcd();
+
+ //Score
+ lcd.locate(0, 0);
+ lcd.printf("SCORE");
+ lcd.locate(2, 12);
+ lcd.printf("J1");
+ lcd.locate(3, 20);
+ lcd.printf("%d", scorej1);
+ lcd.locate(15, 12);
+ lcd.printf("J2");
+ lcd.locate(16, 20);
+ lcd.printf("%d", scorej2);
+
+ //bar 1
+ verticalJ1 = (float) pot1 * 22;
+ lcd.locate(35, verticalJ1);
+ lcd.printf("l");
+
+ // bar 2
+ verticalJ2 = (float) pot2 * 22;
+ lcd.locate(120, verticalJ2);
+ lcd.printf("l");
-int main()
-{
- int j=0;
+ //balle
+ lcd.locate(horizontalBall, verticalBall);
+ lcd.printf("o");
+}
+
+// Fonction de son pour le démarrage
+void son(float f) {
+ spkr.PlayNote(969.0 * f, 0.1, 1.1);
+ spkr.PlayNote(800.0 * f, 0.1, 1.1);
+ spkr.PlayNote(768.0 * f, 0.1, 1.1);
+ spkr.PlayNote(879.0 * f, 0.1, 1.1);
+}
+
+// Fonction de son pour un but
+void son_marque() {
+ spkr.PlayNote(1200.0, 0.1, 1.1);
+ spkr.PlayNote(900.0, 0.1, 1.1);
+ spkr.PlayNote(1000.0, 0.1, 1.1);
+ spkr.PlayNote(700.0, 0.1, 1.1);
+}
+
+// Fonction de son pour une victoire
+void son_victoire() {
+ spkr.PlayNote(1800.0, 0.2, 0.8);
+ wait(0.03);
+ spkr.PlayNote(1800.0, 0.2, 0.8);
+ wait(0.03);
+ spkr.PlayNote(1800.0, 0.5, 0.8);
+ wait(0.03);
+ spkr.PlayNote(600.0, 0.7, 1.1);
+ wait(0.03);
+ spkr.PlayNote(1800.0, 0.2, 0.8);
+ wait(0.03);
+ spkr.PlayNote(1600.0, 0.2, 0.8);
+ wait(0.03);
+ spkr.PlayNote(1800.0, 0.2, 0.8);
+ wait(0.03);
+ spkr.PlayNote(1800.0, 0.5, 0.8);
+ wait(0.03);
+ spkr.PlayNote(600.0, 0.7, 1.1);
+}
+
+// Fonction de son lors d'un contact avec
+void son_contact() {
+ spkr.PlayNote(900.0, 0.1, 1.1);
+}
+
+// Fonction pour le mouvement de la balle
+void mouvement_balle(bool av, bool rec) {
+ // Fonction pour faire avancer ou reculer la balle
+ if (av) {
+ horizontalBall = horizontalBall + ajoutvit;
+ }
+ if (rec) {
+ horizontalBall = horizontalBall - ajoutvit;
+ }
+ // Fonction pour le rebond de la balle sur le haut et le bas de l'écran
+ if (diag1) {
+ verticalBall = verticalBall + angle;
+ }
+ if (diag2) {
+ verticalBall = verticalBall - angle;
+ }
+ if (verticalBall < 0) {
+ diag1 = true;
+ diag2 = false;
+ }
+ if (verticalBall > 22) {
+ diag1 = false;
+ diag2 = true;
+ }
+}
+
+// Fonction pour le but
+void marque() {
+ // Si c'est le joueur qui marque
+ if (horizontalBall >= 115) {
+ // Si il y a contact la balle repart
+ if (contact(verticalJ2, verticalBall)) {
+ son_contact();
+ avance = false;
+ recule = true;
+ }
+ // Sinon il y a but
+ else {
+ but = true;
+ scorej1++;
+ son_marque();
+ joue = false;
+ r = 0;
+ b = 1;
+ g = 1;
+ wait(0.2);
+ r = 1;
+ b = 1;
+ g = 1;
+ }
+ }
+ // Si c'est le joueur 2 qui marque
+ if (horizontalBall <= 35) {
+ // Si il y a contact la balle repart
+ if (contact(verticalJ1, verticalBall)) {
+ son_contact();
+ avance = true;
+ recule = false;
+ }
+ // Sinon il y a but
+ else {
+ but = true;
+ scorej2++;
+ son_marque();
+ joue = false;
+ r = 1;
+ b = 0;
+ g = 1;
+ wait(0.2);
+ r = 1;
+ b = 1;
+ g = 1;
+ }
+ }
+}
+
+// Fonction de lancement du jeux
+void commencement() {
+ lcd.rect(0, 0, 127, 31, 1);
+ lcd.copy_to_lcd();
+ scorej1 = 0;
+ scorej2 = 0;
+ // Menu pour le choixx de la vitesse
+ while (!fire) {
+ lcd.locate(25, 10);
+ lcd.printf("choixsissez la vitesse");
+ lcd.locate(50, 18);
+ lcd.printf("- %s", tab[choix]);
+ // Monte dans le menu
+ if (!up) {
+ choix++;
+ if (choix > 2) {
+ choix = 0;
+ }
+ }
+ // Descend dans le menu
+ if (!down) {
+ choix--;
+ if (choix < 0) {
+ choix = 2;
+ }
+ }
+ wait(0.2);
lcd.cls();
- lcd.locate(0,3);
- lcd.printf("mbed application shield!");
+ }
+ // Liste des choixx de vitesse
+ switch (choix) {
+ case 0:
+ vitessebase = 0.09;
+ rapide = 5;
+ break;
+ case 1:
+ vitessebase = 0.07;
+ rapide = 3;
+ break;
+ case 2:
+ vitessebase = 0.05;
+ rapide = 2;
+ ajoutvit = 2;
+ break;
+ default:
+ vitessebase = 0.09;
+ rapide = 5;
+ }
+ partie = true;
+ lance = false;
+}
+
+// Fonction pour savoir qui gagne
+void victoire() {
+ /* Si le score arrive à 5
+ * On ajoute une victoire pour le joueur qui gagne
+ * Appel de la fonction de musique de victoire
+ */
+ if (scorej1 == 5) {
+ lcd.cls();
+ lcd.locate(25, 10);
+ lcd.printf("Victoire du joueur 1");
+ son_victoire();
+ victoirej1++;
+ wait(2);
+ partie = false;
+ }
+ if (scorej2 == 5) {
+ lcd.cls();
+ lcd.locate(25, 10);
+ lcd.printf("Victoire du joueur 2");
+ son_victoire();
+ victoirej2++;
+ wait(2);
+ partie = false;
+ }
+}
+
+// Fonction qui permet de faire rejouer lorsque l'on secoue le nucleo
+void rejouer() {
+ float AX = 0, AY = 0, AZ = 0;
+ float valeur = 1.3;
+ int compteur = 0;
+ int sortie = 0;
+ lcd.cls();
+ lcd.locate(20, 8);
+ lcd.printf("Secouer pour rejouer");
+ // Si le joueur secoue la nucleo on rejoue
+ while (compteur < 3) {
+ // Test si les capteurs dépasse la valeur donné si oui on ajoute 1 au compteur
+ if (MMA.x() > AX + valeur || MMA.y() > AY + valeur || MMA.z() > AZ + valeur) {
+ compteur++;
+ }
+ wait(0.2);
+ sortie++;
+ // Sinon on attend 5 seconde pour sortir
+ if (sortie == 25) {
+ compteur = 25;
+ }
+ }
+ if (compteur == 25) {
+ lance = false;
+ } else {
+ lance = true;
+ }
+}
+
+// Fonction pour afficher le récapitulatif des victoires
+void recapitulatif() {
+ // Affiche le nombre de victoire de chaque joueur
+ lcd.cls();
+ lcd.locate(25, 10);
+ lcd.printf("Joueur 1 : %d victoires", victoirej1);
+ lcd.locate(25, 20);
+ lcd.printf("Joueur 2 : %d victoires", victoirej2);
+ wait(4);
+ lcd.cls();
+ lcd.locate(30, 10);
+ lcd.printf("Merci d avoir joue");
+ wait(2);
+}
+
+// Fonction pour faire pause lors du jeux
+void pause() {
+ // Si il appuie sur le bouton du joystick on lance la pause
+ if (fire) {
+ stop = true;
+ lcd.cls();
+ lcd.locate(50, 10);
+ lcd.printf("Pause");
+ lcd.locate(25, 2);
+ // Affiche la température récupéré par le capteur
+ lcd.printf("Temperature = %.1f\n", sensor.read());
+ lcd.locate(3, 18);
+ // Affiche le score
+ lcd.printf("joueur 1 : %d - joueur 2 : %d", scorej1, scorej2);
+ int lightp = 6;
+ while (stop) {
+ // On fait clignoter la LED en vert
+ if (lightp % 6 == 0) {
+ r = 1;
+ b = 1;
+ g = 0;
+ }
+ wait(0.1);
+ // Si il réappuie sur le bouton du joystick on sort de la pause
+ if (fire) {
+ stop = false;
+ }
+ // On éteint la lED
+ r = 1;
+ g = 1;
+ b = 1;
+ lightp++;
+ }
+ lcd.cls();
+ affichage();
+ wait(0.8);
+ }
+}
+
+// Fonction de démarrage du jeu
+void lancement() {
+ r = 1;
+ g = 1;
+ b = 1;
+ lcd.cls();
+ lcd.locate(50, 10);
+ lcd.printf("Bienvenue");
+ wait(1);
- while(true) { // this is the third thread
- lcd.locate(0,15);
- lcd.printf("Counting : %d",j);
- j++;
- wait(1.0);
+ lcd.cls();
+ int po = 45, ng = 17;
+ bool ok = true;
+ int light = 3;
+ float zz = 1.0;
+ while (ok) {
+ son(zz);
+ lcd.cls();
+ lcd.locate(15, 17);
+ lcd.printf("l");
+ lcd.locate(110, 6);
+ lcd.printf("l");
+ // Affiche le nom PoNG en le déplacent
+ lcd.locate(po, ng);
+ lcd.printf("PoNG");
+ po = po + 4;
+ ng--;
+ if (po == 85 || ng == 0) {
+ ok = false;
+ }
+ // Fait clignoter la LED en Rouge, Bleu et Vert
+ if (light % 3 == 0) {
+ r = 1;
+ g = 1;
+ b = 0;
+ }
+ if (light % 3 == 1) {
+ r = 1;
+ g = 0;
+ b = 1;
+ }
+ if (light % 3 == 2) {
+ r = 0;
+ g = 1;
+ b = 1;
}
+ wait(0.08);
+ r = 1;
+ g = 1;
+ b = 1;
+ light++;
+ // Diminue l'intensité de la musique
+ zz = zz - 0.05;
+ }
}
+
+// Fonction de fin
+void fin() {
+ lcd.cls();
+ int des = 9;
+ r = 1;
+ b = 1;
+ g = 1;
+ while (des - 8 < 19) {
+ // Affiche le générique
+ lcd.locate(25, des - 4);
+ lcd.printf("Realise par Mael");
+ // Musique de fin
+ switch (des % 9) {
+ case 0:
+ spkr.PlayNote(220.00, 0.5, 0.8);
+ r = 0;
+ b = 1;
+ g = 1;
+ wait(0.250);
+ break;
+ case 1:
+ spkr.PlayNote(220.00, 0.5, 0.8);
+ r = 1;
+ b = 1;
+ g = 1;
+ wait(0.250);
+ break;
+ case 2:
+ spkr.PlayNote(220.00, 0.5, 0.8);
+ r = 0;
+ b = 1;
+ g = 1;
+ wait(0.250);
+ break;
+ case 3:
+ spkr.PlayNote(174.61, 0.375, 0.8);
+ r = 1;
+ b = 1;
+ g = 1;
+ wait(0.187);
+ break;
+ case 4:
+ spkr.PlayNote(261.63, 0.125, 0.8);
+ r = 0;
+ b = 1;
+ g = 1;
+ wait(0.062);
+ break;
+ case 5:
+ spkr.PlayNote(220.00, 0.5, 0.8);
+ r = 1;
+ b = 1;
+ g = 1;
+ wait(0.250);
+ break;
+ case 6:
+ spkr.PlayNote(174.61, 0.375, 0.8);
+ r = 0;
+ b = 1;
+ g = 1;
+ wait(0.187);
+ break;
+ case 7:
+ spkr.PlayNote(261.63, 0.125, 0.8);
+ r = 1;
+ b = 1;
+ g = 1;
+ wait(0.062);
+ break;
+ case 8:
+ spkr.PlayNote(220.00, 0.7, 0.8);
+ r = 0;
+ b = 1;
+ g = 1;
+ wait(0.7);
+ break;
+ default:
+ r = 1;
+ b = 1;
+ g = 1;
+ }
+ des++;
+ }
+ lcd.cls();
+ r = 1;
+ b = 1;
+ g = 1;
+}
+
+// Fonction pour effacer une zone sur l'écran
+void efface() {
+ //bar 1
+ lcd.locate(35, verticalJ1);
+ lcd.printf(" ");
+
+ // bar 2
+ lcd.locate(120, verticalJ2);
+ lcd.printf(" ");
+
+ //balle
+ lcd.locate(horizontalBall - 3, verticalBall);
+ lcd.printf(" ");
+ lcd.locate(horizontalBall - 3, verticalBall - 1);
+ lcd.printf(" ");
+ lcd.locate(horizontalBall - 3, verticalBall + 1);
+ lcd.printf(" ");
+}
+
+// Fonction de main
+int main() {
+ lancement();
+ // Boucle pour jouer un match
+ while (lance) {
+ commencement();
+ // Boucle pour jouer une partie
+ while (partie) {
+ initialisation();
+ // Boucle pour jouer une manche
+ while (joue) {
+ affichage();
+
+ marque();
+
+ pause();
+
+ mouvement_balle(avance, recule);
+
+ victoire();
+
+ wait(vitesse);
+
+ efface();
+ }
+ wait(1);
+ }
+ rejouer();
+ }
+ recapitulatif();
+ fin();
+}
\ No newline at end of file
