Arduino＋照度センサ＋TWELITEで会社のお昼消灯アラームを作る


## モチベーション

会社でISO14000の活動として，お昼休みにオフィスの電灯を消灯しています（節電らしい・・・．）

いままでは，お昼休みになったら電気を消して，お昼休みが終わったら電気を付けて，というのを庶務の方がやってました．
でも特定の人が担当していると何気に負荷が高そうで，お昼休み中も「早く戻らなきゃ」とプレッシャーがあるとのことだったので，消灯・点灯がされていなかったらアラームが鳴るようなマシンをArduinoで作ってみました（それに気づいた人が消す・点ける．）

本当は電灯のスイッチ自体（[こういうやつ](http://fanblogs.jp/sabu36/file/36/U1cy3No.jpg)）を自動でON/OFFしてくれるマシンが作れると良かったんですが，工事が必要なレベルだったのでアラームマシンにしました．

## 構成

### 全体

![overall-diagram.png](https://qiita-image-store.s3.amazonaws.com/0/35592/614a8b42-8e29-8455-fcd8-4923757c4264.png "overall-diagram.png")


アラームが鳴るマシンの位置は電灯スイッチの近くがよいのですが，その場所で電灯のON/OFFが検知できるか微妙だったので，照度を測るセンサを遠隔（電灯の真下）に置いて，TWELITEで無線通信するようにしています．

### 照度センサ

![IMG_7679.jpg](https://qiita-image-store.s3.amazonaws.com/0/35592/d81a6b55-379d-20fd-1935-a8c0bc9af418.jpeg "IMG_7679.jpg")

![illuminance-sensor-circuit.png](https://qiita-image-store.s3.amazonaws.com/0/35592/954bd2d5-a95f-ac35-b3f8-c665e2e4b2d1.png "illuminance-sensor-circuit.png")

![illuminance-sensor-pcb.png](https://qiita-image-store.s3.amazonaws.com/0/35592/9d2975a2-68d6-c98c-3d46-2bca1646de66.png "illuminance-sensor-pcb.png")

* 照度センサとTWELITEだけの簡単な構成です
* TWELITEは子機に設定してあり，接続しているA4ポートへのCdsの抵抗に応じたアナログ入力値が，親機（アラームマシン）のPWM4ポートに出力されます
* TWELITEの間欠動作はMode4（1秒間隔）にしました

### アラームマシン

![IMG_7680.jpg](https://qiita-image-store.s3.amazonaws.com/0/35592/23cd192b-25a3-16ff-a386-ff11e86f8016.jpeg "IMG_7680.jpg")

![IMG_7682.jpg](https://qiita-image-store.s3.amazonaws.com/0/35592/e7ac700b-2d07-38e2-520f-be73be942f22.jpeg "IMG_7682.jpg")

![alarm-machine-circuit.png](https://qiita-image-store.s3.amazonaws.com/0/35592/45133f73-1af8-b819-9507-a0780084e96d.png "alarm-machine-circuit.png")

![alarm-machine-pcb.png](https://qiita-image-store.s3.amazonaws.com/0/35592/6a35686b-9df4-886c-40e1-642396304bb7.png "alarm-machine-pcb.png")

* 配線が下手くそですが・・・，基板外に出ている配線はジャンパワイヤしています
* TWELITEから出力されたPWM4をArduinoのA0に入力しています
* お昼の消灯・点灯時刻が重要なので，時刻はRTCから取るようにしていて，時刻設定やモード変更などのためのボタンをS1, S2, S3で実装しています
* 照度は現地の環境によってしきい値を変えたかったため，ボリューム抵抗（R6）で設定できるようにしました
* アラームを止めるためにLED付モメンタリスイッチ(S4, LED1．実際は1つのパーツ)を実装しています
* アラームはメロディIC（IC4）と圧電スピーカ（J1）で鳴らしています（メロディは[「かっこうワルツ」](https://www.youtube.com/watch?v=n6T4rlxKV-c)！）
* 時刻の表示や設定用に液晶ディスプレイ（IC3）を実装しています

### パーツリスト

#### 照度センサ

| No | 配線番号 | 品名                    | 値・型名など    | 価格  | 入手先 | 注文番号 |
|:---|:---------|:------------------------|:----------------|------:|:-------|:---------|
| 1  | BAT1     | 単３電池ボックス        | BH-311P-1       | 30    | 秋月   | P-00308  |
| 2  | IC1      | 3.3V昇圧DCDCコンバータ  |                 | 500   | 秋月   | M-08937  |
| 3  | IC2      | TWELITE                 | TWE-Lite-Dip-WA | 1,620 | 秋月   | K-06759  |
| 4  | R1       | Cdsセル                 |                 | 30    |        |          |
| 5  | R2       | 抵抗                    | 470Ω           | 5     |        |          |
| 6  | R3       | 抵抗                    | 10kΩ           | 5     |        |          |
| 7  | R4       | 抵抗                    | 10kΩ           | 30    |        |          |
| 8  | S1       | トグルスイッチ          |                 | 20    |        |          |
| 9  |          | ユニバーサル基板Cタイプ |                 | 60    |        |          |
| 10 |          | スペーサー x4           |                 | 120   |        |          |
| 11 |          | ナット x4               |                 | 12    |        |          |
| 12 |          | ピンソケット1x14 x2     |                 | 100   |        |          |
|    |          | 合計                    |                 | 2,532 |        |          |


#### アラームマシン

| No | 配線番号 | 品名                              | 値・型名など     | 価格  | 入手先 | 注文番号                             |
|:---|:---------|:----------------------------------|:-----------------|------:|:-------|:-------------------------------------|
| 1  | Part1    | Arduino Uno                       | Arduino Uno Rev3 | 2,940 | 秋月   | M-07385                              |
| 2  | IC1      | TWELITE                           | TWE-Lite-Dip-WA  | 1,620 | 秋月   | K-06759                              |
| 3  | IC2      | RTC                               | DS3231+AT24C32   | 70    | Aamzon | [3rcccL9A](http://amzn.asia/3rccL9A) |
| 4  | IC3      | LCDディスプレイ                   | AE-AQM0802       | 700   | 秋月   | M-09109                              |
| 5  | IC4      | メロディIC                        | UTC UM66T32LK    | 30    | 秋月   | I-07055                              |
| 6  | J1       | 圧電スピーカ                      | PKM13EPYH4000-A0 | 30    | 秋月   | P-04118                              |
| 7  | LED1+R4  | LED付モメンタリスイッチ           | ST12-303FCG      | 150   | 秋月   | P-02009                              |
| 8  | R1       | 抵抗                              | 10kΩ            | 5     |        |                                      |
| 9  | R2       | 抵抗                              | 10kΩ            | 5     |        |                                      |
| 10 | R3       | 抵抗                              | 10kΩ            | 5     |        |                                      |
| 11 | R4       | 抵抗                              | 10kΩ            | 5     |        |                                      |
| 12 | R5       | 抵抗                              | 100Ω            | 5     |        |                                      |
| 13 | R6       | ボリューム抵抗                    | 10kΩ            | 40    |        |                                      |
| 14 | S1       | モメンタリスイッチ                |                  | 10    |        |                                      |
| 15 | S2       | モメンタリスイッチ                |                  | 10    |        |                                      |
| 16 | S3       | モメンタリスイッチ                |                  | 10    |        |                                      |
| 17 |          | ピンソケット1x14 x2               |                  | 100   |        |                                      |
| 18 |          | ピンソケット1x4                   |                  | 20    |        |                                      |
| 19 |          | ピンソケット1x5                   |                  | 25    |        |                                      |
| 20 |          | ピンソケット1x8（長足） x3        |                  | 150   |        |                                      |
| 21 |          | ピンソケット1x6（長足）           |                  | 40    |        |                                      |
| 22 |          | Arduinoシールド用ユニバーサル基板 | AE-ARDUINO_UNI-G | 200   | 秋月   | P-06877                              |
|    |          | 合計                              |                  | 6,170 |        |                                      |

* RTCはCR2032電池を使いたかったため，[こちら](https://forum.arduino.cc/index.php?topic=278270.0)を参考に抵抗を外しています

## アラームマシンのプログラム

回路図のFritzingファイルと共にに[こちら](https://github.com/ottijp/eco-light-notifier)にコミットしています．

### アプリケーションモード

* 次の４つのモードを持ち，モードボタン（`modeBtnPin`）で変更できるようにしています
    * normal: 稼働モード
    * timeset: 時刻修正コード
    * calibration: ボリューム抵抗の値を表示するモード
    * test: 時刻に関係なくしきい値を超えていたらアラームを鳴らすモード


### 使っているライブラリ

* [JChristensen/DS3232RTC](https://github.com/JChristensen/DS3232RTC)
    * RTCモジュールの制御
    * RTCの現在時刻の取得や設定がとっても簡単に実現できたので助かりました😆
* [tomozh/arduino_ST7032](https://github.com/tomozh/arduino_ST7032)
    * LCDディスプレイの制御
* [Time Library](https://www.pjrc.com/teensy/td_libs_Time.html)
    * `time_t`から時分秒エレメントへの展開やその逆変換
* [MajicDesigns/MD_KeySwitch](https://github.com/MajicDesigns/MD_KeySwitch)
    * モメンタリスイッチのクリックやダブルクリックやロングクリックの検出
    * 自前でコードを書くと結構面倒なので，とても助かりました😆

## やってみて

### RTCの時間の正確さ

* 今回はじめてRTC使ってみましたが，１ヶ月で数秒のズレ程度でした
* 初めはArduinoのクロックだけで時刻をカウントするようなライブラリも使ってみましたが，それだと１日で１０秒以上ずれました
* 今回のように時刻が重要な用途にはRTCが必須ですね

### 引っかかったこととか学んだこと

* TWE-LITEのアナログ入力の電圧範囲は0.1Vから1.5V（[こちら](http://akizuki-fan.bbs.fc2.com/?act=reply&tid=10538244)のinara1さんの投稿＠2014/06/29 (Sun) 17:45:51より）
    * はじめ0〜3.3Vだと思いこんでいた
* Arduinoシールド用ユニバーサル基板はArduinoとの接続用ホールとそのすぐ隣のホールがつながっている！！（脚長ピンソケットに直接つながなくて良いようになっている）ので，間違って他の配線が触れないよう注意が必要（AREFなどがタッチしててアナログ入力が常に1024になり続け相当ハマった・・・）

    ![arduino-shield-hole.png](https://qiita-image-store.s3.amazonaws.com/0/35592/738ff590-e56c-b0d7-a438-06a8a05f1701.png "arduino-shield-hole.png")


* Arduinoシールド用の脚長ピンソケットは結構長いものにしないとシールドの配線がArduinoのUSBソケットに触れてしまう
* `;`が必須な言語を久しぶりに書いたけど辛い・・・
* fritzingのPCGビューでユニバーサル基板実装の回路をデザインしたけど，とても良かった
    * 今まで間違ってブレッドボードビューでやってた
* 電池が結構もつと思っていたら１ヶ月くらいで切れてしまう．TWE-LITEの間欠処理の時間間隔とか電源の組み方とかうまくできていないところがありそう．

## 効果

* 当初１人で消灯・点灯操作をしていた人のプレッシャーは解消されたとのことでした
* よかった😆

## 参考ページ

* [USB driver for serial comm (FTDI) | Official Apple Support Communities](https://discussions.apple.com/thread/7656357?start=0&tstart=0)
* [arduino使い方：ＣＤＳでＬＥＤ点灯](http://www.geocities.jp/zattouka/GarageHouse/micon/Arduino/CDStoLED/CDStoLED.htm)
* [AQM0802AをArduinoで使ってみる。 | icchi's blog](http://blog.icchi.me/arduino-aqm0802a/)
* [ArduinoでLCD表示 - ロマンティック・アイロニー](http://nonkuru.hateblo.jp/entry/2015/12/11/222755)
* [I2C液晶のArduinoライブラリ – ST7032 | オレ工房](http://ore-kb.net/archives/195)
* [データシート - MNO-PDS-TWE001L-JP-2.10-2.pdf](http://akizukidenshi.com/download/ds/monowireless/MNO-PDS-TWE001L-JP-2.10-2.pdf)
* [TOCOS TWE Liteを使ってGPSデータを無線で飛ばすのに少し躓いたので - ネット偽善者でもいいじゃない](http://yhei.hatenablog.com/entry/2015/08/13/150455)
* [tkamada_の日々: FTDI VCPドライバが正常動作しない場合（El Capitan 10.11.6)](https://tkamada.blogspot.jp/2016/08/resolving-unstable-ftdi-vcp-driver-on-my-el-capitan-mac.html)
* [MacOSX : まごころせいじつ堂](http://blog.livedoor.jp/hardyboy/tag/MacOSX)
* [FTDI : まごころせいじつ堂](http://blog.livedoor.jp/hardyboy/archives/cat_232781.html)
* [ToCoStick（TWE-LITE-USB）を使ってみた - 人と技術のマッシュアップ](http://tomowatanabe.hatenablog.com/entry/2013/12/20/234913)
* [Arduinoで遊ぼう - 日付と時刻を表示する - なんでも作っちゃう、かも。](http://arms22.blog91.fc2.com/blog-entry-211.html)
* [ArduinoでRTCモジュールを使う | Program Resource](http://programresource.net/2015/04/05/2519.html)
* [ArduinoでDS1302クロック・モジュールを作動する « osoyoo.com](http://osoyoo.com/ja/2016/07/26/ds1302_clock_module/)
* [【Arduino電子工作】可変抵抗器の入力を読む - いそぷろのブログ](http://www.isopro91.com/entry/2015/06/03/make/robot/arduino/potentiometer)
* [RTC (リアルタイムクロック) (DS3231)](http://ht-deko.com/arduino/rtc_ds3231.html)
* [Raspberry Pi 2 B + RTC DS3231 (ZS-042) | Blue,Blue,Blue…](http://ncc.sytes.net/wordpress/2015/07/16/raspberry-pi-2-b-rtc-ds3231-zs-042/)