睡眠不足が続いているので、永久の眠りにつかせてくれる世界を作った

## 永久の眠りにつきたい
睡眠不足が続くと、もう永遠に眠りたい衝動に駆られます。
そんなとき、こんなものを発見しました。

https://twitter.com/UmeUmeTanTanR/status/1578735105295933440

これ、アラームが鳴ったらスヌーズを押して、永久にスヌーズにする装置なんです。
衝撃的なのは、アラームをつけているのに、消すんです！！
私はこれをみた時に、 **これだ！** と思いました。
いわばこれは、己の意志とは関係なく、アラームが消されるわけですよね？つまり、誰が悪いわけではなく、ただそういう世界なだけなんです。これで起きなくても誰も責めることはできないはず！:heart_eyes:(それはない？)

つまり、**「私自身は起きようとしている、だけど世界がそれを許してくれないならずっと寝ててもいいんじゃないか？」**

私はそんな世界を目指しました。

## やりたいこと

手元にあるものでできることを考えた結果、**自動照明OFF装置**を作ることにしました。

イメージとしては、朝起きて部屋の明かりをつけようとしたら、永遠に照明をOFFにする装置です。

OFFにされたらもう仕方がないですよね？
それはもう起きるな！　寝ろ！
ということです。

では、そんな世界を目指していざゆかん！

## 事前準備
### 必要部品
**obniz**
今回はその使いやすさから、こちらのボードを使用しました。
簡単にIotを構築することができるIot開発ボードです。Wi-Fiに接続すれば、Wi-Fi経由でのプログラムの書き込みができるなど、使いやすいです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/dbc63f7b-cf30-6d7f-0956-12bd799f0a5a.png
" width="30%">

 > obnizの詳細はこちらからご覧ください：[obnizとは | すべての人にIoT開発の機会を](https://obniz.io/ja/how_obniz_works)

**サーボモーター**
照明スイッチのOFFをするために使用します。

> サーボモーターはこちらを使用しました：[マイクロサーボ９ｇ　ＳＧ－９０](https://akizukidenshi.com/catalog/g/gM-08761/)

**光センサー**
光で抵抗値が変わるもので、照明が点灯したことを検知するために使用します。

> 光センサーはこちらを使用しました：[ＣｄＳセル　５ｍｍタイプ](https://akizukidenshi.com/catalog/g/gI-00110/)

**抵抗**
光センサーの抵抗値が変化することを検知するために、必要な部品となります。

> 抵抗はこちらを使いました:[カーボン抵抗（炭素皮膜抵抗）　１／２Ｗ３３０Ω　（１００本入）](https://akizukidenshi.com/catalog/g/gR-07812/)
::: note warn
使用する抵抗の抵抗値を大きく変えると、私の環境と設定する閾値が大きく変わりますので、そこだけ注意してください。
:::

**ブレッドボード**
抵抗と、光センサー使って、照度を測定する回路を作ります。

> ブレッドボードはこちらを使いました：[ミニブレッドボード　ＢＢ－６０１（白）](https://akizukidenshi.com/catalog/g/gP-05155/)


**電源(モバイルバッテリー)**
こちらは、obnizの電源を確保するために使用します。

::: note
PC等のUSBから給電できる場合はなくても大丈夫です。
obnizがType-Cケーブルなので、それに対応できるものをお使いください。
:::


### 配線
**全体としてはこんな形に配線します。**




**obnizとサーボモーターの接続**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/bbccf0a0-3764-d9bf-7dfb-817712c9c0c7.jpeg" width="30%"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/e791d2ed-f194-4dd5-1237-9229b7e0f13f.jpeg" width="17%">


**obnizと光センサーの接続**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/653f868d-6886-5756-7ae8-b00d8ab069b3.jpeg" width="30%"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/35aa32ec-d7ef-03c8-743b-395e93153537.jpeg" width="30%">

::: note warn
サーボモーター・光センサーとobnizの接続するピン番号を間違えると正常に動作しないので、プログラムコードに記載しているコメントと画像を照らし合わせて、接続してください。
:::

### 温度センサとサーボモーターの挙動を確認！

光センサーの値からサーボモーターを動かすことができました！

![サーボ光センサ動作.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/b7cb36a7-8fe3-3c50-5ea3-10bef7d532f1.gif)


## いざゆかん！永久の眠りへ！！

### まずはサーボモーターの取り付け！
無理やり感は否めないが、動けばよいんだ！！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/433ba499-5f0c-ae5b-c6a7-4781966d1418.jpeg" width="30%">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/34136748-dfd5-6450-c5f5-9d917626022f.jpeg" width="52%">


### 永久の眠りへ！！

https://twitter.com/UmeUmeTanTanR/status/1579294875522306048

あれ？照明スイッチが押されて、、、ないぞ！:open_mouth:
よくみたら、サーボモーターの力に貼り付けたテープが耐えきれなくて、うまく押すことができてない、、、

### 試行錯誤の末最後は力が全てだと悟る

ここから私はあらゆるテープの貼り方を考案しましたが、どれもうまくいきません。
手で押さえたらうまくいくのに！

試行錯誤した末、私は究極の結論に辿り着きました！

力だけが私を救ってくれる！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2756612/27b004b4-641c-bb5e-7331-d548f31da278.jpeg" width="30%">

**押さえつけました。**
ちなみに、押さえつけているのは電子レンジです。
サーボモーターがなんかかわいそうに見えるのは気のせいです。彼は強い子です！

## 今度こそゆかん！永久の眠りへ！！

https://twitter.com/UmeUmeTanTanR/status/1579298523086221313

## 環境・ソースコード

 - Node.js v16.16.0
 - npm v8.11.0
 - obniz v3.23.0
 - Visual Studio Code v1.71.2

```javascript:eternalSleep
const Obniz = require('obniz');
// ここはお使いのobnizのIDにしてください。
const obniz = new Obniz('*******');

obniz.onconnect = async () => {
    // 光センサーを使用するための処理
    obniz.io7.output(true);  // io7電圧を5Vに（電源＋）
    obniz.io9.output(false); // io9電圧を0Vに（電源−）
    // サーボモータを利用 io0にGND,io1を電源(5V),io2にシグナルを設定する
    const servo = obniz.wired("ServoMotor", {gnd:0, vcc:1, signal:2});
    // サーボモーターの初期位置 接続する向きによりここは調整する必要がある
    servo.angle(95.0);
  
    // io8をアナログピンに(光センサーの値を取得)
    obniz.ad8.start((voltage) => {
        // センサーの値が変わるたびに実行される
        console.log(`changed to ${voltage} v`);
        if (voltage > 0.1){
            // 電圧値が0.1Vを超えていたら明かりが付いていると判定する
            // この値は、
            // サーボを指定の角度まで動かす
            servo.angle(120);
        }
        else {
            // サーボを初期位置に戻す
            servo.angle(95.0);
        }
    });

}
```

::: note
光センサーの閾値は環境により変わるので、ご自宅に合わせて設定してください。
:::

## 最後に

これでもう朝、無理に起きる必要は無くなりました！
何せ、部屋が明かりをつけることを許してくれないんだから、もう寝るしかないですよね？
みなさんが私と同じ気持ちであることを願っています:blush:
ありがとうございました！