トイレ利用時間を計測するハードを作った話

# 概要
なにか動くものを作ってみたい。
ということで「トイレのドアにつけると利用時間が見える機械」を作ってみました。

動画も作成してみましたのでよろしくおねがいします。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/R0XSR1csggA/0.jpg)](http://www.youtube.com/watch?v=R0XSR1csggA)


## 結論
このような仰々しい形になりました。

<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/a29e67d1-2adf-1abb-7c7c-d9a3fe9b78af.jpeg">

## 利用した部品

総額2,336円です。
ただ、ジャンパワイヤキットが高いので…
もう少し圧縮できるかと思います。

※2020年3月15日の価格です。
**[Digispark Kickstarter Attiny85](https://www.amazon.co.jp/gp/product/B07437LK9N/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1)**
249円+100円

**[Door Sensor](https://ja.aliexpress.com/item/4000138461602.html?spm=a2g0s.9042311.0.0.27424c4daU7DDx)**
62円

**[4セグLED](https://ja.aliexpress.com/item/4000174141889.html?spm=a2g0s.9042311.0.0.27424c4dboG22l)**
68円

**[ブレッドボード](https://www.amazon.co.jp/gp/product/B01MYZO4K6/ref=ppx_yo_dt_b_asin_image_o03_s00?ie=UTF8&psc=1)**
231円

**[ジャンパケーブル系](https://www.amazon.co.jp/gp/product/B00P9BVKOK/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1)**
180円

**[抵抗セット](https://ja.aliexpress.com/item/32630219755.html?spm=a2g0s.9042311.0.0.27424c4dEvS7gT)**
121円

**[スイッチ](https://www.amazon.co.jp/gp/product/B076FN81B8/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1)**
131円

**[ジャンパワイヤキット](https://www.amazon.co.jp/%E3%82%B5%E3%83%B3%E3%83%8F%E3%83%A4%E3%83%88-SKS-140-%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%97%E3%83%AF%E3%82%A4%E3%83%A4%E3%82%AD%E3%83%83%E3%83%88-%E5%8D%98%E7%B7%9A%E3%82%BF%E3%82%A4%E3%83%97%E3%81%AE%E3%83%AF%E3%82%A4%E3%83%A4%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E5%93%81/dp/B00IHTMUEA/ref=sr_1_33?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%96%E3%83%AC%E3%83%83%E3%83%89%E3%83%9C%E3%83%BC%E3%83%89%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB&qid=1584217454&sr=8-33)**
1,043円

**[電池ケース](https://ja.aliexpress.com/item/32994333081.html?spm=a2g0s.9042311.0.0.27424c4dF21p2Y)**
41円

**電池(100円ショップの安物です)**
110円


# 手順
## 1.Digispark Kickstarter Attiny85への書き込み準備
`Digispark Kickstarter Attiny85`はArduinoの標準として利用できないため、下記のサイトを参考に進めます。
https://digistump.com/wiki/digispark/tutorials/connecting

**【Windowsの方のみ】**
ドライバが必要ということなので、こちらからダウンロード
https://github.com/digistump/DigistumpArduino/releases/download/1.6.7/Digistump.Drivers.zip

[Arduino]>[Preferences]
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/58c45492-d1fa-a974-2616-2c13adc00f17.png">

[追加のボードマネージャーのURL]
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/db49ade2-4824-924f-aa06-2c8e887843fd.png">

こちらに下記のJSONファイルURLを追加します。

```
http://digistump.com/package_digistump_index.json
```

**【MACの方のみ】**
これだけだとコンパイルでErrorが発生します。

```
***** bad CPU type in executable
```

下記のフォーラムにある通り、「MACが32bitをサポートしなくなったため発生している」ということらしいです。
https://digistump.com/board/index.php?topic=3249.0

フォーラムの最後に書いてあるコマンドを実行したところ、改善しました。

```shell
cd ~/Library/Arduino15/packages/arduino/tools/avr-gcc
mv 4.8.1-arduino5 orig.4.8.1
ln -s /Applications/Arduino.app/Contents/Java/hardware/tools/avr 4.8.1-arduino5
```

## 2.[7セグLED]ライブラリ準備
7セグLEDに関しても標準のものでは動作しません。

こちらのフォーラムを参考にさせていただきました。
https://forum.arduino.cc/index.php?topic=442087.0

こちらのGITHUBにあるコードで動作するということでしたので、ZIP形式でダウンロードしてLibraryフォルダにコピーしました。
https://github.com/reeedstudio/libraries/tree/master/DigitalTube

Libraryは下記のPathにあるそうです

```:windows
C:\Users\{user name}\Documents\Arduino\libraries
```

```:mac
/Users/{user name}/Documents/Arduino/libraries
```
## 3.図面

下記のような図面で作成しました。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/9119df2d-4a3f-376d-1e92-4bb1fba3420b.png">

ドアセンサがD0でLEDはD3,D4を利用しています。
注意点としては電池以外でテストする場合電圧が安定しないもので行うと、表示がうまく出来ません。
ご注意ください。

## 4.コーディング

```c
#include "TM1637.h"
#define CLK 3
#define DIO 4

TM1637 tm1637(CLK,DIO);
unsigned long opentm = millis();
    
void setup()
{
  pinMode(0, INPUT);
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);
  tm1637.point(1);
}

void loop()
{
  unsigned long nowtm = millis();
  uint8_t door = digitalRead(0);
  if(!door){
    opentm = nowtm;
  }
  
  tm1637.display(3,((nowtm-opentm)/1000%60)%10);
  tm1637.display(2,((nowtm-opentm)/1000%60)/10);
  tm1637.display(1,((nowtm-opentm)/1000/60)%10);
  tm1637.display(0,((nowtm-opentm)/1000/60)/10);
  delay(1000);
}
```
`millis()`で起動からの`ms`が取得できるため、`door`に依存して初期化するような単純なコードです。
表示に関しては0が一番上らしいので、この様になっています。

## 5.動作確認

![download-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/7a082df6-f86f-ea95-52fa-fb8e9e0e0b2f.gif)

[YOUTUBEの方](http://www.youtube.com/watch?v=R0XSR1csggA)にもう少し長い動画も細かいところも乗っているので参考いただけると幸いです。
ありがとうございました