Adafruit: Circuit Playground - Использование задержки для получения данных акселерометра после события касания - PullRequest
0 голосов
/ 22 сентября 2018

Привет, ребята. Я пытаюсь прочитать данные акселерометра после события Tap.Идея заключается в том, что после обнаружения события касания он воспроизводит звук с помощью функции playTone, ожидает 2 секунды и затем регистрирует данные XYZ с акселерометра.Проблема, с которой я сталкиваюсь, заключается в использовании задержки.Это не похоже на работу, поскольку XYZ записываются непосредственно после события Tap.Вы можете код ниже и проверить на последовательном мониторе:

Код:

#include <Adafruit_CircuitPlayground.h>
#include <Wire.h>
#include <SPI.h>

#define CLICKTHRESHHOLD 120

int registry=1; //set initial move

void setup(void) {
  while (!Serial);
  Serial.begin(9600);
  CircuitPlayground.begin();
}

void printAxis() {
  float x, y, z;
  x = CircuitPlayground.motionX();
  y = CircuitPlayground.motionY();
  z = CircuitPlayground.motionZ();
  Serial.print("X: ");
  Serial.print(x);
  Serial.print("  Y: ");
  Serial.print(y);
  Serial.print("  Z: ");
  Serial.println(z);

}

void tap() {
  CircuitPlayground.playTone(50, 100);
  Serial.print("Registry Number: " );
  Serial.println(registry);
  printAxis();
  registry++;

}

void loop() {

// Only take action when either button is pressed.
  if ( (CircuitPlayground.leftButton()  == true) ) {
    CircuitPlayground.setAccelRange(LIS3DH_RANGE_2_G);

      // Tapping function
      CircuitPlayground.setAccelTap(1, CLICKTHRESHHOLD);

  // have a procedure called when a tap is detected
    attachInterrupt(digitalPinToInterrupt(7), tap, RISING);
    }
}

Я попытался добавить функцию задержки в цикле, в printAxis.Но, кажется, зависает при использовании задержки -

  Serial.print("Delaying...");
  delay(2000);
  Serial.print("Delay ready!");

У вас есть какие-нибудь советы или рекомендации?Лучший!

1 Ответ

0 голосов
/ 23 сентября 2018

Я понял это.Я отвечаю на это, если кто-то сталкивается с подобной проблемой.

Сначала я установил прерывание только в настройке.

void setup(void) {
while (!Serial);
Serial.begin(9600);
CircuitPlayground.begin();
CircuitPlayground.setAccelRange(LIS3DH_RANGE_2_G);
CircuitPlayground.setAccelTap(1, CLICKTHRESHHOLD);
attachInterrupt(digitalPinToInterrupt(7), isTapped, FALLING);
tapped = false;
}

Затем я создал логический флаг «Tapped», который был установлен вобработчик прерываний.В цикле отслеживается флаг Tapped.Если установлено, то я выполняю задержки ... Цикл выглядит так:

bool tapped;
void isTapped() {
tapped = true;
}
...
if (tapped) {
delay(3000);
Serial.println("Now!" );
tap();
tapped = false;
}
...