サーバールーム管理システム作りたい!
【マイコン・バックエンド編】
経緯
実家の私の部屋は、様々なサーバーPCを置いてしまっています。
さらには大学進学で実家から離れることにより私の部屋が完全に
サーバールーム化
してしまった。(笑)
そこで、このサーバールームを 実家にいなくても管理できるシステム を作りたいなぁ...なんて思ったので、行動に移しました 行動力◎
構成内容
今回、私は少し変わった構成にしてみました。
本来ならRaspberry Pi(ラズパイ)をLANに接続し、Webサーバー化してしまえば簡単です。
しかし私の場合は、Webサーバーが既にあるため、あえて
サーバーにArduinoをUSBでつなぎ通信
して表示させるシステムにしました。
使用した物
-
Arduino Uno 互換品
ELEGOO UNO R3
Arduino uno R3 互換品
amazon.co.jp -
ドアセンサー(磁器センサ)
ドアセンサースイッチ(リードスイッチ) SPS-320
ドアや窓の開閉を検知するスイッチです。
akizukidenshi.com -
銅線(AWG28)
家にあったものを使用(購入元が分からなかったです) -
温湿度センサー(DHT22)
家にあったものを使用(購入元が分からなかったです)
Webサーバー関連の使用した物については別でブログを書いてますのでそちらを参照ください
製作手順
センサ取り付け
まずはセンサをつなぐところから始めましょう。
実写画像汚すぎる
てなわけで、こいつらをはんだ付けとか色々して、Arduinoに読み込ませていきます。
スイッチ系はプルアップで制作しています。
Arduinoのプルアップ機能を使用せず、自分で抵抗を使ってプルアップしました。
10kΩ抵抗が300本近くあるから使いたいんですよぉ~
- プルアップを知らない方へ:
-
マイコンのデジタル入力はHigh(5v,3.3v...etc)とLow(0v)でなければならない。
しかし、スイッチというのは電気の道を繋ぐ/切るしかしません。
ただスイッチを挟むだけだと、接点時にはHighですが、非接点時はHighかLowかわからない(浮き)状態になります。
そのため、Vcc(High)と入力ピンを線で繋ぎ、GNDへの線にスイッチを挟むことにより、マイコンの内部抵抗の差を利用して浮きを無くします。
無接点時はHighで、接点時に短絡しLowになることから「プルアップ」という。その逆を「プルダウン」という。
※左下のユニバーサル基盤は、もともと使用していた入室管理システムのものである。
GPIOに刺してセンサを読み込ませていきます。
プログラムを作る
ハードウェアが完成したら次はソフトウェアに入っていきます。
私が書いたプログラムから説明していきます。
※高1で作った入室管理システムのプログラムを改造しているため、コメントアウトなどが恥ずかしいです。
気にしないで
元々の入室管理システムのプログラムはそのまま残して利用しているため、一部は使用していません。
今回追加したのは44行「output」コメントアウトから64行までです。
先にこちらの実行結果を見てくれた方が分かりやすいかと思いますので見てください
このようになっています。
まず、この出力ですが、Arduino IDEのシリアルモニタで確認しています。
つまり、USBを通してサーバーには
シリアル通信
を用いて通信します。
サーバー側でシリアル通信ができるライブラリを導入して通信します。(後述)
続いて通信しているこの文字列ですが、見ればわかる通りweb構造物の代表
自称、
Json形式です!
jsonってマジでフロントエンドからすると便利すぎる
データ構造をわかりやすくすると、このように出力されます
英語の話ですが、データの内容は次の形です。
- temp: temperature(温度)
- rh: relative humidity(相対湿度)
- isOpen: 開いているか
- プログラミングにおける変数 "is_..."
-
プログラミングで"is_~"と始まる変数は基本的にyesかnoのどちらかを格納する変数が多いです。
そのため、isから始まる変数はboolean型(真偽型)であることがセオリーです。
今回のisOpenでは、開いていたら1(True)、閉じていたら0(False)をデータとしています。
これをwebサーバーバックエンドに読み込ませ、フロントエンドに反映という形を取ることに。
webサーバーのバックエンドを作る
次はwebサーバーのバックエンドを作っていきます。
サーバー側は様々な言語を使用して、htmlに表示できるようにします。具体的には次の形です
- 通信を受け取る/jsonに変換: 使用言語Python ↓
- データを読み取る/ページに表示: 使用言語Java Script
このシステムだけで、
Arduino C , Python , JavaScript
といった言語を使用します。
言語を覚えるにはぜひ構築してほしい構成です!
では、Arduinoからの通信を受け取るプログラムを作りましょう。
シリアル通信をpythonでするためのライブラリは「serial」です。
また、jsonファイルに変換するため、「json」ライブラリも一応入れます。
5行目、ser変数にArduinoのシリアル通信のための変数を定義
11行目、readlineメソッドで読み込み、decodeメソッドで変換、stripメソッドで整理
13行目でjson形式に変換
15行目より、httpディレクトリ、info.jsonにデータを上書き
一応何かあったときのために、try-except文を入れ、通信不能時の例外処理+出力も追加
こんなところでしょうか。
これで自動的に
htmlファイル直下にinfo.jsonが更新
されますので、後はそれをJava Scriptを使って読み込んで反映させていきます。
次回予告【フロントエンド編】
あ”あ”ぁ”ーーーここまで書くの疲れたぁぁw
次回はjs及びhtml-cssをやっていきます。
「htmlなんて知っているのばっかりだしもういいか」
なんて思ってるそこのあなた!
温湿度やドアの開閉状態を
文字ではなく"図"で分かりやすく表示
しますよ。
しかもこれは
画像ではなく図として全てHTMLで書いてます
よ。
気になった方は次回もご期待を!