Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino-Based Vibration, RPM, and Wind Speed Monitoring System with MPU9250 and Sensors

View and Edit Project In Cirkit DesignerImage of Arduino-Based Vibration, RPM, and Wind Speed Monitoring System with MPU9250 and Sensors

Circuit Documentation

Summary

This circuit is designed to measure vibration using an MPU9250 sensor, blade RPM using a proximity sensor, and wind speed using an anemometer sensor. The MPU9250 is connected via I2C, the proximity sensor is connected to pin D2, and the anemometer is connected to pin D3 on an Arduino UNO. The Arduino UNO reads data from the sensors and prints the results to the Serial Monitor.

Component List

  1. Arduino UNO

    • Description: A microcontroller board based on the ATmega328P.
    • Pins: UNUSED, IOREF, Reset, 3.3V, 5V, GND, Vin, A0, A1, A2, A3, A4, A5, SCL, SDA, AREF, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0
  2. MPU-9250/6500/9255

    • Description: A 9-axis motion tracking device that combines a 3-axis gyroscope, 3-axis accelerometer, and 3-axis magnetometer.
    • Pins: VCC, GND, SCL/SCLK, SDA/SDI, EDA, ECL, ADO/SDO, INT, NCS, FSYNC
  3. LJ18A3-H-ZBX Inductive Proximity Sensor

    • Description: An inductive proximity sensor used to detect the presence of metal objects.
    • Pins: VO (BLU), VI (BRN), SIG (BLK)
  4. Anemometer

    • Description: A device used for measuring wind speed.
    • Pins: vcc, gnd, sig

Wiring Details

Arduino UNO

MPU-9250/6500/9255

LJ18A3-H-ZBX Inductive Proximity Sensor

Anemometer

Code Documentation

/*
 * This Arduino sketch measures vibration using the MPU9250 sensor, blade RPM
 * using a proximity sensor, and wind speed using an anemometer sensor. The
 * MPU9250 is connected via I2C, the proximity sensor is connected to pin D2,
 * and the anemometer is connected to pin D3. The sketch reads data from the
 * sensors and prints the results to the Serial Monitor.
 */

#include <Wire.h>
#include <MPU9250.h>

MPU9250 mpu;

volatile int bladeCount = 0; // Counter for proximity sensor
volatile int windCount = 0;  // Counter for anemometer

unsigned long prevTimeRPM = 0;
unsigned long prevTimeWind = 0;

// Constants for calculations
float bladeTimeInterval = 0; 
float windTimeInterval = 0;

const int proximityPin = 2; // Proximity sensor pin
const int anemometerPin = 3; // Anemometer pin

void setup() {
  Serial.begin(9600);
  
  // Initialize MPU9250
  Wire.begin();
  if (!mpu.begin(MPU9250_SCALE_2000DPS, MPU9250_RANGE_2G)) {
    Serial.println("MPU9250 Initialization Failed");
    while (1);
  }
  Serial.println("MPU9250 Initialized");

  // Set up Proximity Sensor
  pinMode(proximityPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(proximityPin), countBlade, FALLING);

  // Set up Anemometer
  pinMode(anemometerPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(anemometerPin), countWind, FALLING);
}

void loop() {
  // MPU9250 - Get Vibration Data
  mpu.readSensor();
  float accelX = mpu.getAccelX_mss();
  float accelY = mpu.getAccelY_mss();
  float accelZ = mpu.getAccelZ_mss();
  Serial.print("Acceleration X: "); Serial.println(accelX);
  Serial.print("Acceleration Y: "); Serial.println(accelY);
  Serial.print("Acceleration Z: "); Serial.println(accelZ);

  // Calculate RPM from Proximity Sensor
  if (millis() - prevTimeRPM >= 1000) { // Every second
    noInterrupts();
    bladeTimeInterval = bladeCount; 
    bladeCount = 0;
    interrupts();
    float rpm = (bladeTimeInterval * 60.0) / 1.0; // RPM calculation
    Serial.print("Blade RPM: "); Serial.println(rpm);
    prevTimeRPM = millis();
  }

  // Calculate Wind Speed from Anemometer
  if (millis() - prevTimeWind >= 1000) { // Every second
    noInterrupts();
    windTimeInterval = windCount; 
    windCount = 0;
    interrupts();
    float windSpeed = (windTimeInterval * 2.4); // Example: Adjust based on anemometer spec
    Serial.print("Wind Speed: "); Serial.println(windSpeed);
    prevTimeWind = millis();
  }

  delay(100); // Small delay
}

void countBlade() {
  bladeCount++;
}

void countWind() {
  windCount++;
}

This code initializes the MPU9250 sensor, sets up the proximity sensor and anemometer with interrupts, and continuously reads data from the sensors. The vibration data from the MPU9250 is printed to the Serial Monitor, and the RPM and wind speed are calculated and printed every second.