圧力センサーを使って、デスクワークでどれだけ寿命が縮んでるか測ってみた

# 概要
M5Stackと圧力センサーFSR406を組み合わせて椅子の座面に着け、
どれだけの時間自分が座っているのかを測ってみます。

# きっかけ
椅子の座面に圧力センサーを仕込んで座っているかを判別していたのですが、
時たま[「デスクワークは寿命が縮む」という記事](https://part.shufu-job.jp/news/work/9074/)が出てきました。
オーストラリアの研究によると、11時間以上座っていると死亡リスクが40%増加するそうです。
また、「健康上の問題で日常生活が制限なく送ることができる期間」である健康寿命が縮む、という記事もありました。
興味が湧いたので、自分が仕事をしている最中、どれだけ寿命が縮んでいるのかを測ってみることにしました。

# 材料
- M5Stack
- 圧力センサーFSR406
- 10kΩ抵抗 × 1
- ジャンパーワイヤ
- ブレッドボード
 
# 配線
M5Stackに、圧力センサーFSR406を繋ぎます。
FSR406は、センシング部を表にした時、左が+、右が-です。
![FSR406_+-.png.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/41474ab2-f342-3d54-1fc4-ce0883dd22b4.jpeg)


FSR406に10kΩ抵抗を噛ませて、G36にアナログ入力します。
<img width="389" alt="M5Stack_FSR406.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/61779a7d-2fac-9a91-12ca-f58a68511fc2.png">
![MicrosoftTeams-image (38).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/567005b0-35bf-8b49-32ec-e41478f51dd1.jpeg)


接続できたら、圧力センサーを椅子の座面に敷き、その上に座るようにします。
![DSC5707.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/b7f97e45-40e4-cc53-6caf-85f1bc35833a.jpeg)

# プログラム
### 基本動作
座っていたら秒数を加算する、という単純なコードです。
Bボタン(真ん中ボタン)を押すとカウントをリセットします。

```c:sitCount.ino
#include <Arduino.h>
#include <time.h>
#include <M5Stack.h>

#define ANALOG_PIN 36

int val = 0;
unsigned long sitTime = 0;

void setup() {
  M5.begin();
  Serial.begin(115200);  // シリアル通信速度
  Serial.println("setup");
  M5.Lcd.fillScreen(TFT_LIGHTGREY);
}

void loop() {
  val = analogRead(ANALOG_PIN);

  M5.update();

  // 座っていたら秒数を増やす
  if(val <= 2000){
    sitTime = sitTime + 1;
  }

  // 時間リセット
  if(M5.BtnB.wasPressed()){
    sitTime = 0;
  }

  M5.Lcd.setTextFont(7);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(TFT_BLACK, TFT_LIGHTGREY);

  // 『分：秒』で表示
  draw_first2digits(sitTime / 60);
  draw_last2digits(sitTime % 60);

//  // 『時間：分』で表示
//  draw_first2digits(sitTime / 3600);
//  draw_last2digits((sitTime / 60) % 60);

  Serial.print("value:");  Serial.println(val);
  Serial.print("sitTime:");  Serial.println(sitTime);
  Serial.println();
  delay(1000);
}

// 上2桁の表示
void draw_first2digits(unsigned long mm) {
  if (mm < 10) {
    M5.Lcd.setCursor(10, 40);
    M5.Lcd.print("0");
    M5.Lcd.print(mm); 
    M5.Lcd.setCursor(150, 40);
    M5.Lcd.print(":");          
  } else {
    M5.Lcd.setCursor(10, 40);
    M5.Lcd.print(mm); 
    M5.Lcd.setCursor(150, 40);
    M5.Lcd.print(":");       
  }
}

// 下2桁の表示
void draw_last2digits(unsigned long ss) {
  if (ss < 10) {
    M5.Lcd.setCursor(180, 40);
    M5.Lcd.print("0");
    M5.Lcd.print(ss);
  } else {
    M5.Lcd.setCursor(180, 40);
    M5.Lcd.print(ss);          
  }
}
```

### 寿命計算
「1時間座ると22分寿命が縮む」と記事に書いてあったので、
座った時間と縮んだ時間をボタンで切り替えて表示できるようにしました。
Aボタン（左ボタン）で座った時間、Cボタン（右ボタン）で縮んだ時間が見れます。

```c:shrinkCalc.ino
#include <Arduino.h>
#include <time.h>
#include <M5Stack.h>

#define ANALOG_PIN 36

int val = 0;
unsigned long sitTime = 0;
unsigned long shrinkTime = 0;
bool flag = 0;

void setup() {
  M5.begin();
  Serial.begin(115200);  // シリアル通信速度
  Serial.println("setup");
  M5.Lcd.fillScreen(TFT_LIGHTGREY);
}

void loop() {
  val = analogRead(ANALOG_PIN);

  M5.update();

  if(M5.BtnA.wasPressed()){
    flag = 0;
  }else if(M5.BtnC.wasPressed()){
    flag = 1;
  }

  // 座っていたら秒数を増やす
  if(val <= 2000){
    sitTime = sitTime + 1;
  }

  // 時間のリセット
  if(M5.BtnB.wasPressed()){
    sitTime = 0;
  }

  // 縮んだ時間の計算
  // 22分 / 60分 = 0.3666... 
  shrinkTime = sitTime * 0.36;

  M5.Lcd.setTextFont(7);
  M5.Lcd.setTextSize(2);
 
  if(flag == 0){  // 座った時間の表示
    M5.Lcd.fillScreen(TFT_LIGHTGREY);
    M5.Lcd.setTextColor(TFT_BLACK, TFT_LIGHTGREY);
    draw_first2digits(sitTime / 3600);
    draw_last2digits((sitTime / 60) % 60);
  }else if(flag == 1){  // 縮んだ時間の表示
    M5.Lcd.fillScreen(TFT_RED);
    M5.Lcd.setTextColor(TFT_BLACK, TFT_RED);
    draw_first2digits(shrinkTime / 3600);
    draw_last2digits((shrinkTime / 60) % 60);
  }
  
  Serial.print("value:");  Serial.println(val);
  Serial.print("sitTime:");  Serial.println(sitTime);
  Serial.print("shrinkTime:");  Serial.println(shrinkTime);
  Serial.println();
  delay(1000);
}

// 上2桁の表示
void draw_first2digits(unsigned long mm) {
  if (mm < 10) {
    M5.Lcd.setCursor(10, 40);
    M5.Lcd.print("0");
    M5.Lcd.print(mm);
    M5.Lcd.setCursor( 150, 40);
    M5.Lcd.print(":");        
  } else {
    M5.Lcd.setCursor(10, 40);
    M5.Lcd.print(mm);
    M5.Lcd.setCursor( 150, 40);
    M5.Lcd.print(":");        
  }
}

// 下2桁の表示
void draw_last2digits(unsigned long ss) {
  if (ss < 10) {
    M5.Lcd.setCursor( 180, 40);
    M5.Lcd.print("0");
    M5.Lcd.print(ss);
  } else {
    M5.Lcd.setCursor( 180, 40);
    M5.Lcd.print(ss);          
  }
}
```

### ブザー音を鳴らす
30分〜1時間に一度立ち上がって運動をすると、死亡リスクが抑えられるそうなので、
一定時間座るとブザーが鳴るようにしてみました。
M5Stackはブザー音の音量調整が効かないようで、かなり大きい音が出ますのでお気を付けください！
（私はとうとうスピーカー穴にガムテープを貼りました……）

```c:alert.ino
#include <Arduino.h>
#include <time.h>
#include <M5Stack.h>

#define ANALOG_PIN 36;

int val = 0;
unsigned long sitTime = 0;

void setup() {
  M5.begin();
  Serial.begin(115200);  // シリアル通信速度
  Serial.println("setup");
  M5.Lcd.fillScreen(TFT_LIGHTGREY);
}

void loop() {

  val = analogRead(ANALOG_PIN);

  M5.update();

  // 座っていたら秒数を増やす
  if(val <= 2000){
    sitTime = sitTime + 1;
  }

  // 一定時間以上座っていたらブザー音を鳴らす
  if(sitTime >= 10 && sitTime % 10 == 0){  // テスト用に10秒で設定
    M5.Speaker.tone(100, 200); // 200ミリ秒鳴らす
    delay(200);
    M5.Speaker.mute();
  }else{
    M5.Speaker.mute();
  }

  // 時間リセット
  if(M5.BtnB.wasPressed()){
    sitTime = 0;
  }

  M5.Lcd.setTextFont(7);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(TFT_BLACK, TFT_LIGHTGREY);

  // 『分：秒』で表示
  draw_first2digits(sitTime / 60);
  draw_last2digits(sitTime % 60);

//  // 『時間：分』で表示
//  draw_first2digits(sitTime / 3600);
//  draw_last2digits((sitTime / 60) % 60);
  
  Serial.print("value:");  Serial.println(val);
  Serial.print("sitTime:");  Serial.println(sitTime);
  Serial.println();
  delay(1000);
}

// 上2桁の表示
void draw_first2digits(unsigned long mm) {
  if (mm < 10) {
    M5.Lcd.setCursor(10, 40);
    M5.Lcd.print("0");
    M5.Lcd.print(mm); 
    M5.Lcd.setCursor(150, 40);
    M5.Lcd.print(":"); 
  } else {
    M5.Lcd.setCursor(10, 40);
    M5.Lcd.print(mm); 
    M5.Lcd.setCursor(150, 40);
    M5.Lcd.print(":");        
  }
}

// 下2桁の表示
void draw_last2digits(unsigned long ss) {
  if (ss < 10) {
    M5.Lcd.setCursor(180, 40);
    M5.Lcd.print("0");
    M5.Lcd.print(ss);
  } else {
    M5.Lcd.setCursor(180, 40);
    M5.Lcd.print(ss);          
  }
}
```

# まとめ
寿命計算のプログラムを使って、1時間ほどデスクワークをしてみました。
座った時間と、
![sittingTime.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/4034067f-6b6a-a317-ba60-270cab815fba.jpeg)
寿命が縮んだ時間です。
![shrinkTime.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/4716436e-f9e3-3f87-fc52-c40bbd1ed11a.jpeg)

お手洗いや雑務で席を何度か外していますが、56分座り、20分寿命が縮んだことが分かりました。

「これから少しでも運動する機会を増やそう」と決断する良い機会になりました。
少しでも健康寿命を延ばせるよう、デスクワークの多い方は意識してみてはいかがでしょうか？