diff --git a/SampleSrc/accel01.ino b/SampleSrc/accel01.ino new file mode 100644 index 0000000..7b8f8ec --- /dev/null +++ b/SampleSrc/accel01.ino @@ -0,0 +1,52 @@ +// https://101010.fun/iot/m5stickc-plus-accel.html +// 加速度センサで検知した振動をグラフにプロットするプログラム +#include + +#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); + } + } +} \ No newline at end of file