CCCPaste

Acceleration Alert rev_01

/********* Pleasedontcode.com **********

	Pleasedontcode thanks you for automatic code generation! Enjoy your code!

	- Terms and Conditions:
	You have a non-exclusive, revocable, worldwide, royalty-free license
	for personal and commercial use. Attribution is optional; modifications
	are allowed, but you're responsible for code maintenance. We're not
	liable for any loss or damage. For full terms,
	please visit pleasedontcode.com/termsandconditions.

	- Project: Acceleration Alert
	- Source Code NOT compiled for: Arduino Nano ESP32
	- Source Code created on: 2024-08-19 16:59:16

********* Pleasedontcode.com **********/

/****** SYSTEM REQUIREMENTS *****/
/****** SYSTEM REQUIREMENT 1 *****/
	/* Read the values from the accelerometer. Hold the */
	/* values as reference values to be compaired with */
	/* the active values. Monitor the active values for a */
	/* change that is greater than 10% in any direction */
	/* for a period of 3 seconds. sound the buzzer when */
	/* true */
/****** END SYSTEM REQUIREMENTS *****/

/****** DEFINITION OF LIBRARIES *****/
#include 
#include 
#include 

/****** FUNCTION PROTOTYPES *****/
void setup(void);
void loop(void);
void updateOutputs();
void checkAccelerationChange();

/***** DEFINITION OF DIGITAL OUTPUT PINS *****/
const uint8_t Buzzer_ActiveBuzzer_output_PIN_D2 = 2;

/***** DEFINITION OF OUTPUT RAW VARIABLES *****/
/***** used to store raw data *****/
bool Buzzer_ActiveBuzzer_output_PIN_D2_rawData = 0;

/***** DEFINITION OF OUTPUT PHYSICAL VARIABLES *****/
/***** used to store data after characteristic curve transformation *****/
float Buzzer_ActiveBuzzer_output_PIN_D2_phyData = 0.0;

// MPU6050 object
Adafruit_MPU6050 mpu;

// Reference acceleration values
float referenceAccel[3] = {0.0, 0.0, 0.0}; // X, Y, Z
unsigned long changeStartTime = 0; // Time when change started
bool changeDetected = false; // Flag for detecting change

void setup(void)
{
    // Initialize serial communication
    Serial.begin(115200);
    pinMode(Buzzer_ActiveBuzzer_output_PIN_D2, OUTPUT);

    // Initialize MPU6050
    if (!mpu.begin()) {
        Serial.println("Failed to find MPU6050 chip");
        while (1) {
            delay(10);
        }
    }

    // Set accelerometer range
    mpu.setAccelerometerRange(MPU6050_RANGE_2_G);
    delay(100);
    
    // Read initial values for reference
    sensors_event_t a, g, temp;
    mpu.getEvent(&a, &g, &temp);
    referenceAccel[0] = a.acceleration.x;
    referenceAccel[1] = a.acceleration.y;
    referenceAccel[2] = a.acceleration.z;
}

void loop(void)
{
    // Refresh output data
    updateOutputs(); 
    // Check for acceleration changes
    checkAccelerationChange(); 
}

void updateOutputs()
{
    // Write the state of the buzzer
    digitalWrite(Buzzer_ActiveBuzzer_output_PIN_D2, Buzzer_ActiveBuzzer_output_PIN_D2_rawData);
}

void checkAccelerationChange()
{
    sensors_event_t a, g, temp;
    mpu.getEvent(&a, &g, &temp);

    // Calculate percentage change for each axis
    float changeX = abs(a.acceleration.x - referenceAccel[0]) / referenceAccel[0];
    float changeY = abs(a.acceleration.y - referenceAccel[1]) / referenceAccel[1];
    float changeZ = abs(a.acceleration.z - referenceAccel[2]) / referenceAccel[2];

    // Check if any change exceeds 10%
    if ((changeX > 0.1 || changeY > 0.1 || changeZ > 0.1) && !changeDetected) {
        changeDetected = true; // Set flag for change detected
        changeStartTime = millis(); // Record the time change started
    }

    // If change is detected, check if it has been for 3 seconds
    if (changeDetected) {
        if (millis() - changeStartTime >= 3000) {
            Buzzer_ActiveBuzzer_output_PIN_D2_rawData = true; // Activate buzzer
        }
    }

    // Reset if no change is detected
    if (changeX <= 0.1 && changeY <= 0.1 && changeZ <= 0.1) {
        changeDetected = false; // Reset change detected flag
        Buzzer_ActiveBuzzer_output_PIN_D2_rawData = false; // Deactivate buzzer
    }
}

/* END CODE */