Newer
Older
M5StickCPlus_FactoryTest2022 / SampleSrc / accel01.ino
// https://101010.fun/iot/m5stickc-plus-accel.html
// 加速度センサで検知した振動をグラフにプロットするプログラム
#include <M5StickCPlus.h>

#define SAMPLE_PERIOD 20    // サンプリング間隔(ms)
#define SAMPLE_SIZE 240     // サンプリング間隔(20) x 画面幅(240) = 4.8s
#define BUTTON_A 37

bool isPause = false;

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.IMU.Init();
  M5.IMU.SetAccelFsr(M5.IMU.AFS_4G);
  pinMode(BUTTON_A, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(BUTTON_A), handleInterrupt, FALLING);
}

float ax, ay, az[SAMPLE_SIZE];

#define X0 5  // 横軸の描画開始座標

// 水平静止で重力加速度1000mGが常にかかることを考慮する
#define MINZ -1000  // 縦軸の最小値 mG
#define MAXZ 3000  // 縦軸の最大値 mG

void handleInterrupt() {
  isPause = !isPause;
}

void loop() {
  if (!isPause) {
    M5.Lcd.fillScreen(BLACK); // 画面クリア

    for (int i = 0; i < SAMPLE_SIZE; i++) {
      if (isPause) break;
      
      M5.IMU.getAccelData(&ax,&ay,&az[i]);  // IMUから加速度を取得
  
      az[i] *= 1000;  // mGに変換
      if (i == 0) continue;
      
//        Serial.println(az[i]); // シリアルモニタは115200baudで通信
  
      int y0 = map((int)(az[i - 1]), MINZ, MAXZ, M5.Lcd.height(), 0);
      int y1 = map((int)(az[i]), MINZ, MAXZ, M5.Lcd.height(), 0);
      M5.Lcd.drawLine(i - 1 + X0, y0, i + X0, y1, YELLOW);
      delay(SAMPLE_PERIOD);
    }
  }
}