Advertisement
pierfraxxxx

simple game with Arduino UNO R4

Dec 26th, 2024
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 4.27 KB | Gaming | 0 0
  1. //sensore GY-521 accellerometro giroscopio SDA A4  SCL A5   VCC 3,3V
  2.  
  3. #include <Arduino_LED_Matrix.h>
  4. #include <EEPROM.h>
  5. #include <Wire.h>
  6.  
  7.  
  8.  
  9. ArduinoLEDMatrix matrix;
  10.  
  11. const uint32_t animation[][4] = {
  12.     {
  13.         0x7008810,
  14.         0x40200201,
  15.         0xac18c000,
  16.         66
  17.     },
  18.     {
  19.         0x1040f800,
  20.         0x200201,
  21.         0xac18c000,
  22.         66
  23.     }
  24. };
  25.  
  26. // Frame della matrice LED
  27. uint8_t frame[8][12] = {0};
  28.  
  29. #define ROWS 8
  30. #define COLUMNS 12
  31.  
  32. // Variabili di posizione del LED
  33. int pointX = COLUMNS / 2;
  34. int pointY = ROWS / 2;
  35. int R = 0;
  36.  
  37. // Indirizzo del GY-521
  38. const int MPU_ADDR = 0x68;        
  39.  
  40. // Variabili per il gioco
  41. int fixedX, fixedY;
  42. int score = 0;
  43. unsigned long startTime;
  44. unsigned long elapsedTime;
  45. bool gameActive = true;
  46.  
  47. // Variabili per il record
  48. const int RECORD_ADDR = 0; // Indirizzo EEPROM per il record
  49. unsigned long bestTime = 999999;  //RECORD CHE VIENE SALVATO
  50.  
  51. // Variabili per i dati del sensore
  52. int16_t accX, accY;
  53. int16_t baseAccX = 0, baseAccY = 0;
  54.  
  55. void setup() {
  56.   Serial.begin(115200);
  57.   delay(1500);                           //EEPROM.put(RECORD_ADDR, 99999); ///per resettare il record in memoria
  58.  
  59.   matrix.begin();
  60.  
  61.   // Inizializza il sensore GY-521
  62.   Wire.begin();
  63.   Wire.beginTransmission(MPU_ADDR);
  64.   Wire.write(0x6B); // Registro di alimentazione
  65.   Wire.write(0);    // Sveglia il sensore
  66.   Wire.endTransmission(true);
  67.  
  68.   // Calibrazione
  69.   calibrateSensor();
  70.  
  71.   // Carica il record dalla EEPROM
  72.   EEPROM.get(RECORD_ADDR, bestTime);
  73.  
  74.   // Genera il primo obiettivo
  75.   generateTarget();
  76.   startTime = millis();
  77. }
  78.  
  79. void loop() {                                                     /////////////LOOP
  80.   if (gameActive) {
  81.     updatePosition();
  82.     checkCollision();
  83.     renderGame();
  84.   } else {
  85.     displayResults();
  86.   }
  87. }                                                               /////////////LOOP
  88.  
  89. void calibrateSensor() {
  90.   Serial.println("Calibrating... Please hold the board still.");
  91.   delay(2000);
  92.   Wire.beginTransmission(MPU_ADDR);
  93.   Wire.write(0x3B);
  94.   Wire.endTransmission(false);
  95.   Wire.requestFrom(MPU_ADDR, 4, true);
  96.   baseAccX = (Wire.read() << 8 | Wire.read());
  97.   baseAccY = (Wire.read() << 8 | Wire.read());
  98. }
  99.  
  100. void updatePosition() {
  101.   // Leggi il sensore
  102.   Wire.beginTransmission(MPU_ADDR);
  103.   Wire.write(0x3B);
  104.   Wire.endTransmission(false);
  105.   Wire.requestFrom(MPU_ADDR, 4, true);
  106.   accX = (Wire.read() << 8 | Wire.read());
  107.   accY = (Wire.read() << 8 | Wire.read());
  108.  
  109.   int deltaY = map((int32_t)(accX - baseAccX), -17000, 17000, -1, 1);
  110.   int deltaX = map((int32_t)(accY - baseAccY), -17000, 0, -1, 1);
  111.  
  112.   if (!(pointX == 0 && deltaX < 0) && !(pointX == COLUMNS - 1 && deltaX > 0)) {
  113.     pointX += deltaX;
  114.   }
  115.   if (!(pointY == 0 && deltaY < 0) && !(pointY == ROWS - 1 && deltaY > 0)) {
  116.     pointY += deltaY;
  117.   }
  118. }
  119.  
  120. void generateTarget() {
  121.   fixedX = random(0, COLUMNS);
  122.   fixedY = random(0, ROWS);
  123. }
  124.  
  125. void checkCollision() {
  126.   if (pointX == fixedX && pointY == fixedY) {
  127.     // Effetto luce piena
  128.     memset(frame, 1, sizeof(frame));
  129.     matrix.renderBitmap(frame, ROWS, COLUMNS);
  130.     delay(300);
  131.  
  132.     score++;
  133.     if (score >= 7) {                               /////NUMERO DEI TARGET
  134.       gameActive = false;
  135.       elapsedTime = millis() - startTime;
  136.       if (elapsedTime < bestTime) {                /////EPROM RECORD
  137.          R = 1;
  138.         bestTime = elapsedTime;
  139.         EEPROM.put(RECORD_ADDR, bestTime);
  140.       }
  141.     } else {  R = 0;
  142.       generateTarget();
  143.     }
  144.   }
  145. }
  146.  
  147. void renderGame() {
  148.   memset(frame, 0, sizeof(frame));
  149.  
  150.   // Gestione del lampeggio dell'obiettivo
  151.   static unsigned long lastBlinkTime = 0;
  152.   static bool targetVisible = true;
  153.   if (millis() - lastBlinkTime >= 100) {
  154.     lastBlinkTime = millis();
  155.     targetVisible = !targetVisible;
  156.   }
  157.   if (targetVisible) {
  158.     frame[7 - fixedY][fixedX] = 1; // Obiettivo lampeggiante
  159.   }
  160.  
  161.   frame[7 - pointY][pointX] = 1; // Giocatore
  162.   matrix.renderBitmap(frame, ROWS, COLUMNS);
  163.   delay(100);
  164. }
  165.  
  166. void displayResults() {
  167.  
  168.   Serial.println (R);
  169.   Serial.println (elapsedTime);
  170.   Serial.println (bestTime);
  171.  
  172.  
  173.  if (R == 1) {
  174.        matrix.loadFrame(animation[0]);
  175.       }
  176.      else {
  177.        matrix.loadFrame(animation[1]);
  178.      while (true); // Blocca il programma finché non viene premuto il reset
  179. }
  180. }
  181.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement