Untitled
unknown
plain_text
2 years ago
8.0 kB
8
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 53
#define DATA_PIN 51
#define CLK_PIN 52
#define HALL_SENSOR_PIN 2
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
MPU6050 mpu;
LedControl lc = LedControl(51, 52, 53, 4); // Pins: DIN, CLK, CS, # of Displays connected
volatile bool sensorTriggered = false; // Use volatile for interrupt safety
unsigned long lastAnimationUpdate = 0;
unsigned long scrollTimer = 0; // Timer for scrolling message delay
const unsigned long tiltAnimationDelay = 200; // Delay between tilt animation frames
const unsigned long scrollDelay = 20; // Delay for scrolling message
// 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(115200);
Wire.begin();
mpu.initialize();
SPI.begin(); // Initialize SPI
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
scrollTimer = millis(); // Initialize the scroll timer
}
void sensorInterrupt() {
sensorTriggered = !digitalRead(HALL_SENSOR_PIN); // Read the sensor state in the interrupt
}
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_OneStep() {
static int frameIndex = 0; // Static variable to keep track of frame index
// Define the array of animation frames
byte* frames[] = {invader1a, invader2a, invader3a, invader4a, invader1b, invader2b, invader3b, invader4b};
// Display the current frame
for (int i = 0; i < 8; i++) {
lc.setRow(frameIndex / 2, i, frames[frameIndex][i]);
}
// Increment frame index
frameIndex++;
if (frameIndex >= 8) {
frameIndex = 0; // Reset frame index if it exceeds the number of frames
}
}
void tiltLeftAnimation_OneStep() {
static int frameIndex = 0; // Static variable to keep track of frame index
// Define the array of animation frames
byte* frames[] = {invader4c, invader3c, invader2c, invader1c, invader4d, invader3d, invader2d, invader1d};
// Display the current frame
for (int i = 0; i < 8; i++) {
lc.setRow(frameIndex / 2, i, frames[frameIndex][i]);
}
// Increment frame index
frameIndex++;
if (frameIndex >= 8) {
frameIndex = 0; // Reset frame index if it exceeds the number of frames
}
}
void displayStopMessage() {
unsigned long currentMillis = millis();
if (currentMillis - scrollTimer >= scrollDelay) {
scrollTimer = currentMillis; // Update the scroll timer
if (myDisplay.displayAnimate()) {
myDisplay.displayReset();
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);
// Check for strong magnetic field
bool strongMagneticField = sensorTriggered;
if (strongMagneticField) {
displayStopMessage();
sensorTriggered = false; // Reset the flag after displaying the message
}
// Execute tilt animation if strong magnetic field is NOT detected
if (!strongMagneticField) {
unsigned long currentMillis = millis();
if (currentMillis - lastAnimationUpdate >= tiltAnimationDelay) {
lastAnimationUpdate = currentMillis;
if (ax > 4000) {
tiltRightAnimation_OneStep();
} else if (ax < -4000) {
tiltLeftAnimation_OneStep();
}
}
}
}Editor is loading...
Leave a Comment