#include"LIS3DHTR.h" #include "TFT_eSPI.h" LIS3DHTR lis; #define R 5 //Rayon de la boule donc diamètre 10 #define XMAX 240 // Définit la taille en longueur de l'écran #define YMAX 320 // Définit la taille en largeur de l'écran #define BUZZER_PIN WIO_BUZZER TFT_eSPI tft; unsigned int modif=1 ; //si déplacement, on affiche. 1 pour premier affichage int x=XMAX/2, y=YMAX/2; unsigned long tempsDepart = 0; bool enCours = false; void setup() { Serial.begin(115200); lis.begin(Wire1); if (!lis) { Serial.println("ERROR"); while(1); } lis.setOutputDataRate(LIS3DHTR_DATARATE_25HZ); //Data output rate lis.setFullScaleRange(LIS3DHTR_RANGE_2G); //Scale range set to 2g tft.begin(); tft.fillScreen(TFT_WHITE); // fond blanc pinMode(WIO_KEY_A, INPUT_PULLUP); pinMode(WIO_KEY_B, INPUT_PULLUP); pinMode(WIO_KEY_C, INPUT_PULLUP); pinMode(WIO_BUZZER, OUTPUT); } void chrono(int temps) { int i; for(i = temps; i>=0; i--) { Serial.print(i);Serial.print(" secondes."); delay(1000); } } void perdu() { tft.fillScreen(TFT_RED); // fond rouge } void loop() { bool demarrer = false; int temps = 30; int temps2; while (!demarrer) { if (digitalRead(WIO_KEY_A) == LOW) { Serial.print("Rajoutter 10 secondes"); Serial.println(); } else if (digitalRead(WIO_KEY_B) == LOW) { Serial.print("Lancer la partie sur le niveau choisit"); Serial.println(); demarrer = true; } else if (digitalRead(WIO_KEY_C) == LOW) { Serial.print("Choisir le niveau"); Serial.println(); } } if (!enCours && digitalRead(WIO_KEY_B) == LOW) { enCours = true; tempsDepart = millis(); Serial.println("Chronomètre démarré !"); delay(300); // Anti-rebond } // Réinitialiser if (digitalRead(WIO_KEY_B) == LOW) { enCours = false; Serial.println("Chronomètre réinitialisé."); delay(300); } // Affichage du temps écoulé if (enCours) { unsigned long tempsActuel = millis(); unsigned long secondes = (tempsActuel - tempsDepart) / 1000; Serial.print("Temps écoulé : "); Serial.print(secondes); Serial.println(" s"); delay(1000); // Affiche chaque seconde } float x_a,y_a; x_a = lis.getAccelerationX() * 100-4; y_a = lis.getAccelerationY() * 100+1; Serial.print(" X: "); Serial.print(x_a); Serial.print(" x: "); Serial.print(x); Serial.print(" Y: "); Serial.print(y_a); Serial.print(" y: "); Serial.print(y); Serial.println(); //tft.fillCircle(x,y,R + 1,TFT_WHITE); //on affiche le nouveau cercle //tft.fillCircle(x_a,y_a, R, TFT_RED); if (x_a > 0 ) { // penche vers nous modif=1; Serial.print("mouvement vers nous"); Serial.println(); x++; if (x >= XMAX) { Serial.print("MUR TOUCHÉ VERS NOUS TOUCHÉ!"); perdu(); exit; } } if (x_a < 0 ) { // penche vers l'arrière modif=1; Serial.print("mouvement vers l'arrière"); Serial.println(); x--; if (x <= 0) { Serial.print("MUR TOUCHÉ A L'ARRIÈRE TOUCHÉ!"); perdu(); exit; } } if (y_a < 0 ) { // penche vers l'arrière modif=1; Serial.print("mouvement vers la droite"); Serial.println(); y--; if (y <= 0) { Serial.print("MUR TOUCHÉ VERS LA DROITE TOUCHÉ!"); perdu(); exit; } } if (y_a > 0 ) { // penche vers l'arrière modif=1; Serial.print("mouvement vers la gauche"); Serial.println(); y++; if (y >= YMAX) { Serial.print("MUR TOUCHÉ VERS LA GAUCHE TOUCHÉ!"); perdu(); exit; } } if (modif == 1){ // on affiche le nouveau cercle tft.fillCircle(x,y,R + 2,TFT_WHITE); tft.fillCircle(x,y, R, TFT_RED); modif=0; } delay(50); } // déplacement vers l'arrière : x diminue // déplacement vers nous : x augmente // déplacement vers la gauche : y augmente // déplacement vers la droite : y diminue // Exemple de résultat : X: 0.08 Y: -0.09 Z: -1.02 // En pourcentage donc convertir. // x_a = lis.getAccelerationX() * 100-4; // Correspond au y de l'écran // y_a = lis.getAccelerationY() * 100+1; // Correspond au -x de l'écran