使用arduino和MPU6050检测震动

时间:2019-12-23 14:41:47

标签: arduino mpu6050

我正在尝试使您摇晃以改变随机数的骰子(骰子)。我正在使用arduino nano,MPU6050(加速度计)和oled i2c 128x64显示器。我已经设法对其进行编程以检测小震动,但是我需要能够检测大震动,而不仅仅是突然的微小震动。 这是我的一些代码:

#include <SPI.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <Wire.h>
#include "I2Cdev.h"
#include "MPU6050.h"

#define MODE_PIN 2

MPU6050 accelgyro;

bool detect;

int mode = 1;

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


void setup() {

  // if have a switch to choose between different modes
  pinMode(MODE_PIN, INPUT_PULLUP);
  if (digitalRead(MODE_PIN)) mode = 1;
  else mode = 2;

  Wire.begin();


  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setCursor(36, 24);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Hi!");
  display.display();


  accelgyro.initialize();
  accelgyro.setAccelerometerPowerOnDelay(3);
  accelgyro.setIntZeroMotionEnabled(false);
  accelgyro.setIntMotionEnabled(true);
  accelgyro.setDHPFMode(1);
  accelgyro.setMotionDetectionThreshold(20);
  accelgyro.setZeroMotionDetectionThreshold(4);
  accelgyro.setMotionDetectionDuration(5);
  accelgyro.setZeroMotionDetectionDuration(2);


}

void loop() {

  // wait until shaken
  detect = false;
  while (detect == false) {
    detect = accelgyro.getIntMotionStatus();
    delay(100);
  }

  // different modes do different things, but are basically the same
  if (mode == 1) {
    // wait until shake has stopped
    while (detect) {
      detect = accelgyro.getIntMotionStatus();
      // displays some more stuff here
      delay(100);
    }
    int ran = random(1, 7);
    // does stuff here (displays a random number with dots like dice)
  }

  // mode 2
  else {
    // wait until shake has stopped
    while (detect) {
      detect = accelgyro.getIntMotionStatus();
      delay(100);
    }
    int ran = random(1, 11);
    // does stuff here (displays a random number from 1-10)

  }
  // 2 sec break
  delay(2000);
}

我的2.问题是,当您在2秒间隔内晃动时,一旦间隔结束,它将检测到另一次晃动。我需要2秒的休息时间,因为很多时候我的arduino认为我由于某种原因停止了晃动,这让我有时间注意到并停下来,然后再次循环。如果我能获得准确的震动检测,则无需休息。

是否有更好的方法来检测真实的抖动?如果没有,如何改善我的代码以使其正常工作? 谢谢!

0 个答案:

没有答案