我正在尝试使您摇晃以改变随机数的骰子(骰子)。我正在使用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认为我由于某种原因停止了晃动,这让我有时间注意到并停下来,然后再次循环。如果我能获得准确的震动检测,则无需休息。
是否有更好的方法来检测真实的抖动?如果没有,如何改善我的代码以使其正常工作? 谢谢!