アドベントカレンダー5日目

# 4つ目　長時間座り防止システム
　4つ目は、長時間座り防止システムです。

# きっかけ
　これまで学生生活の中で、椅子に座っている時間が長かったのではないかと感じました。小学校から大学まで、体育や課外活動以外はほとんど座って受ける授業ばかりでした。脳に酸素を回すため、数分のストレッチを設けてくれる授業もたまにありますが、ほとんどの場合授業時間は座りっぱなしになることが多いです。大学4年にもなると、研究室でずっと座ったまま作業する時間が増加したと私は感じました。
 　調べると日本の座位時間は世界の中でもトップクラスで長いことが判明しました。しかも、座位の姿勢を長くとっていればいるほど、血流や筋肉代謝が低下し、病気のリスクが高まるだけでなく、メンタルにも悪影響があるとされています。
　この事態を解消できないかと考え、リアルタイムで距離の情報を取得し、一定時間距離が近いままだったら椅子に長い間座っているとみなし、アラームで知らせてくれるシステムを作ることにしました。

# 実際に作ってみる
　今回使用したのは、M5Core2、HC-SR04、BUZZERセンサーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/3c02adc6-5198-1c35-f4ee-497c9ccf4662.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/51f8f2fa-33f8-38d1-23ae-ad71c979a1ec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/0f2e217d-1411-da19-6565-d84051316798.png)

# プログラム
　タイマーの開始を0として、距離が30cmよりも近くなったらカウントをスタートさせています。そのまま30cm以下の状態が30分間続いたらブザーで知らせ、一旦作業を中断することを促します。距離センサーの更新は15秒ごとに行っています。

~~~Arduino:chair.ino
#include <M5Core2.h>

#define TRIG_PIN 26
#define ECHO_PIN 25
#define BUZZER_PIN 33

long duration;
float distance;
unsigned long myTimerStart = 0;  // タイマー開始時間
const unsigned long timerDuration = 1800000; // 30分（60000ミリ秒）
bool alarmTriggered = false;  // アラームが鳴ったかどうかのフラグ

void setup() {
  M5.begin();
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  
  Serial.begin(115200);
  M5.Lcd.setTextSize(2);
}

void loop() {
  // 距離測定
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  duration = pulseIn(ECHO_PIN, HIGH);
  distance = (duration * 0.034) / 2; // 距離（cm）

  // LCDに距離を表示
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.fillScreen(BLACK); // 画面クリア
  M5.Lcd.print("Distance: ");
  M5.Lcd.print(distance);
  M5.Lcd.println(" cm");

  // 距離が30cm以下の場合
  if (distance < 30) {
    if (myTimerStart == 0) {
      // 距離が30cm以下になった時にタイマーを開始
      myTimerStart = millis();
    }

    // 30分経過したか確認
    if ((millis() - myTimerStart >= timerDuration) && !alarmTriggered) {
      // アラームを一回だけ鳴らす
      digitalWrite(BUZZER_PIN, HIGH);
      delay(1000); // 1秒間鳴らす
      digitalWrite(BUZZER_PIN, LOW);
      alarmTriggered = true; // アラームが鳴ったことを記録
    }
  } else {
    // 距離が30cmを超えたらタイマーとアラームフラグをリセット
    myTimerStart = 0;
    alarmTriggered = false;
  }

  delay(15000); // 15秒ごとに更新
}
~~~

　今回も色々なサイトを参考にさせていただきました。
 
https://github.com/m5stack/M5Stack

https://github.com/arduino/reference-jp

https://qumcum.com/manabi/arduino/hcsr04/

https://chatgpt.com/

# 結果
　研究室で使用している椅子は、背もたれの下部分が開いているのでそこに取り付けました。HC-SR04を背中部分に捻じ込んで、体との位置を測れるようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/284a24bc-15b0-be13-3c93-9c0fbb6a7075.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/0b6be024-0396-d4f7-c482-906fcd774cf9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924203/72671814-e841-91c9-d1fd-1ad08df567ab.png)
　使用してみた結果、きちんと30分経ったらBUZZERが鳴りました。

# 反省点
　これは研究室の椅子を元に作ったため、他の椅子(例えば、大学の教室のように腰の位置が無い椅子や直角の椅子)には対応しにくいことが、今回の反省点です。

# 感想
　ずっと座っているとアラームが鳴るため、椅子から立ち上がってストレッチなど定期的にするように心がけることが増えました。これは、当初の目的を達成できたと思います。