Untitled
unknown
plain_text
a year ago
8.8 kB
28
Indexable
#include <Wire.h> #include <MPU6050.h> #include <MD_Parola.h> #include <MD_MAX72xx.h> #include <SPI.h> #include <LedControl.h> #define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW #define MAX_DEVICES 4 #define CS_PIN 10 #define HALL_SENSOR_PIN 2 MD_Parola myDisplay = MD_Parola(MD_MAX72XX::FC16_HW, CS_PIN, MAX_DEVICES); MPU6050 mpu; volatile bool sensorTriggered = false; // Use volatile for interrupt safety unsigned long delayTime = 200; // Delay between Frames LedControl lc = LedControl(11, 13, 10, 4); // Pins: DIN, CLK, CS, # of Displays connected // Put values in arrays byte invader1a[] = { B00010010, // First frame of invader #1 B00100100, B01001001, B10010010, B10010010, B01001001, B00100100, B00010010}; byte invader1b[] = { B00000000, // Second frame of invader #1 B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}; byte invader2a[] = { B00010010, // First frame of invader #1 B00100100, B01001001, B10010010, B10010010, B01001001, B00100100, B00010010}; byte invader2b[] = { B00000000, // Second frame of invader #2 (flipped horizontally) B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}; byte invader3a[] = { B00010010, // First frame of invader #1 B00100100, B01001001, B10010010, B10010010, B01001001, B00100100, B00010010}; byte invader3b[] = { B00000000, // First frame of invader #2 (flipped horizontally) B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}; byte invader4a[] = { B00010010, // First frame of invader #1 B00100100, B01001001, B10010010, B10010010, B01001001, B00100100, B00010010}; byte invader4b[] = { B00000000, // Second frame of invader #2 B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}; // Put values in arrays byte invader1c[] = { B01001000, // First frame of invader #1 B00100100, B10010010, B01001001, B01001001, B10010010, B00100100, B01001000}; byte invader1d[] = { B00000000, // Second frame of invader #1 B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}; byte invader2c[] = { B01001000, // First frame of invader #1 B00100100, B10010010, B01001001, B01001001, B10010010, B00100100, B01001000}; byte invader2d[] = { B00000000, // Second frame of invader #2 (flipped horizontally) B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}; byte invader3c[] = { B01001000, // First frame of invader #1 B00100100, B10010010, B01001001, B01001001, B10010010, B00100100, B01001000}; byte invader3d[] = { B00000000, // First frame of invader #2 (flipped horizontally) B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000 }; byte invader4c[] = { B01001000, // First frame of invader #1 B00100100, B10010010, B01001001, B01001001, B10010010, B00100100, B01001000}; byte invader4d[] = { B00000000, // Second frame of invader #2 B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000}; void setup() { Serial.begin(9600); Wire.begin(); mpu.initialize(); lc.shutdown(0, false); // Wake up displays lc.shutdown(1, false); lc.shutdown(2, false); lc.shutdown(3, false); lc.setIntensity(0, 15); // Set intensity levels lc.setIntensity(1, 15); lc.setIntensity(2, 15); lc.setIntensity(3, 15); lc.clearDisplay(0); // Clear Displays lc.clearDisplay(1); lc.clearDisplay(2); lc.clearDisplay(3); myDisplay.begin(); myDisplay.setIntensity(8); myDisplay.displayClear(); pinMode(HALL_SENSOR_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(HALL_SENSOR_PIN), sensorInterrupt, CHANGE); // Attach interrupt on CHANGE } void sensorInterrupt() { if (digitalRead(HALL_SENSOR_PIN) == HIGH) { sensorTriggered = true; // Set sensorTriggered when high magnetic field detected } } void displayAcceleration(int16_t ax, int16_t ay, int16_t az) { // Print the X, Y, and Z values to the serial monitor Serial.print("X: "); Serial.print(ax); Serial.print(" | Y: "); Serial.print(ay); Serial.print(" | Z: "); Serial.println(az); } void tiltRightAnimation() { // Put #1 frame on both Displays sinvader1a(); delay(delayTime); sinvader2a(); delay(delayTime); // Put #2 frame on both Displays sinvader3a(); delay(delayTime); sinvader4a(); delay(delayTime); // Put #3 frame on both Displays sinvader1b(); delay(delayTime); sinvader2b(); delay(delayTime); // Put #4 frame on both Displays sinvader3b(); delay(delayTime); sinvader4b(); delay(delayTime); } void tiltLeftAnimation() { // Put #1 frame on both Displays sinvader4c(); delay(delayTime); sinvader3c(); delay(delayTime); // Put #2 frame on both Displays sinvader2c(); delay(delayTime); sinvader1c(); delay(delayTime); // Put #3 frame on both Displays sinvader4d(); delay(delayTime); sinvader3d(); delay(delayTime); // Put #4 frame on both Displays sinvader2d(); delay(delayTime); sinvader1d(); delay(delayTime); } void displayStopMessage() { myDisplay.setTextAlignment(PA_CENTER); myDisplay.setSpeed(30); myDisplay.displayScroll("STOP STOP STOP STOP ", PA_CENTER, PA_SCROLL_LEFT, 20); } void loop() { int16_t ax, ay, az; mpu.getAcceleration(&ax, &ay, &az); displayAcceleration(ax, ay, az); // Detect tilt direction if (az > 1500) { tiltRightAnimation(); } else if (az < -2500) { tiltLeftAnimation(); } // Check for strong magnetic field if (sensorTriggered) { displayStopMessage(); sensorTriggered = false; // Reset the flag after displaying the message } if (myDisplay.displayAnimate()) { myDisplay.displayReset(); } } // Function definitions for displaying animation frames void sinvader1a() { for (int i = 0; i < 8; i++) { lc.setRow(0, i, invader1a[i]); } } void sinvader1b() { for (int i = 0; i < 8; i++) { lc.setRow(0, i, invader1b[i]); } } void sinvader2a() { for (int i = 0; i < 8; i++) { lc.setRow(1, i, invader2a[i]); } } void sinvader2b() { for (int i = 0; i < 8; i++) { lc.setRow(1, i, invader2b[i]); } } void sinvader3a() { for (int i = 0; i < 8; i++) { lc.setRow(2, i, invader3a[i]); } } void sinvader3b() { for (int i = 0; i < 8; i++) { lc.setRow(2, i, invader3b[i]); } } void sinvader4a() { for (int i = 0; i < 8; i++) { lc.setRow(3, i, invader4a[i]); } } void sinvader4b() { for (int i = 0; i < 8; i++) { lc.setRow(3, i, invader4b[i]); } } void sinvader4c() { for (int i = 0; i < 8; i++) { lc.setRow(3, i, invader4c[i]); } } void sinvader3c() { for (int i = 0; i < 8; i++) { lc.setRow(2, i, invader3c[i]); } } void sinvader2c() { for (int i = 0; i < 8; i++) { lc.setRow(1, i, invader2c[i]); } } void sinvader1c() { for (int i = 0; i < 8; i++) { lc.setRow(0, i, invader1c[i]); } } void sinvader1d() { for (int i = 0; i < 8; i++) { lc.setRow(0, i, invader1d[i]); } } void sinvader2d() { for (int i = 0; i < 8; i++) { lc.setRow(1, i, invader2d[i]); } } void sinvader3d() { for (int i = 0; i < 8; i++) { lc.setRow(2, i, invader3d[i]); } } void sinvader4d() { for (int i = 0; i < 8; i++) { lc.setRow(3, i, invader4d[i]); } }
Editor is loading...
Leave a Comment