温度計からの表示-ルーターのWebインターフェース経由

良い一日! ルーターを少し調整すること、より正確には、デジタル温度計を追加し、ルーター自体を使用してそこからデータを表示することについてお話したいと思います。



卒業証書の作成中、DS18B20センサーが手に落ちました。







これは、1-wireプロトコルを使用してデータを送信するデジタル出力温度計です。 少し考えた後、統計のために、好奇心から外へ、外気温度を表示するために私の辛抱強いルーターを教えることに決めました。 別のファームウェアDD-WRT v24-sp2(11/11/04)の大きいLinksys E3000があります。 このような場合の通常のファームウェアは適切ではなく、将来必要なルーター機能へのアクセスを提供しません。 私個人の意見では、DD-WRTは最良かつ最もリッチな代替ファームウェアです。 さて、64 MBのRAMを搭載したホームルーターでBGPをサポートするファームウェアに夢中にならないようにするには)DD-WRTファームウェアのWebインターフェイスを以下に示します。







通常、1-wireを介したデータ転送では、COMまたはLPTポートを使用しますが、残念ながら、このルーターにはUSBコネクタが1つしかありません。 より正確には、ボード自体にUART用の配線がありますが、ルーターのカバーが足りないため、ルートでLinksysの設計能力が損なわれます。 この場合、pl2303などのUSB-RS-232コンバーターを使用してセンサーを操作できます。 ただし、このコンバーターを正しく動作させるには、ドライバーが必要です。 pl2303のドライバーはすでにDD-WRTファームウェアに含まれており、ロードされていないため、私のように振る舞ってソースからコンパイルする必要はありません。ダウンロードするには、sshまたはtelnetプロトコルを使用してログインする必要があります(ユーザー名はroot、パスワードはWebインターフェイスで設定したものと同じです)すべてがうまくいった場合、次のようなものが表示されます。







既に理解しているように、これはUnixシステム(残念ながらiOSではなく、LinksysはCiscoではありません)であるため、シェルへの適応に問題はないはずです。



ドライバーはディレクトリ/lib/modules/2.6.24.111/kernel/drivers/usb/serialにあり、usbserial.koおよびpl2303.koと呼ばれます。 2.6.24.111はカーネルバージョンであり、将来変更される可能性があります)それらは含まれているディレクトリからinsmod usbserial.koおよびinsmod pl2303.koコマンドでロードされます。 USB-RS-232アダプターが接続されている場合、これらのコマンドの後、デバイスはアドレス/ dev / usb / tts / <デバイス番号>に表示されるはずです。私の場合は0です。dmesgを使用してドライバーのロードを制御できます。 :



登録済みの新しいインターフェイスドライバーusbserial

drivers / usb / serial / usb-serial.c:USBシリアルドライバーコア

ドライバー/ usb /シリアル/ usb-serial.c:pl2303に登録されたUSBシリアルサポート

pl2303 1-1.3:1.0:pl2303コンバーターが検出されました

usb 1-1.3:ttyUSB0に接続されたpl2303コンバーター

usbcore:登録済みの新しいインターフェイスドライバーpl2303

ドライバー/ usb /シリアル/ pl2303.c:Prolific PL2303 USB to serial adapter driver



次に行うことは、1-wireで動作できるプログラムを追加することです。



これはdigitempと呼ばれ、GNU General Public Licenseの下で配布されています。 ルーター用にコンパイルするか、コンパイルされたプログラムでインターネット上のファームウェアを検索できます。 ただし、小さな落とし穴があります。ルーターのハードウェア機能により、プログラムを直接ROMに書き込むことはできません。 / tmp、つまり、再起動後に安全に消去されるRAM、またはUSBハブを介して接続されるUSBフラッシュドライブに書き込むことができます。 ハブがアクティブであることが非常に望ましいです。そうしないと、ルーターをロードするときにUSBフラッシュドライブとpl2303に同時に十分な電力が供給されず、システムで一方/両方のデバイスが誤って認識されます。



フラッシュドライブを機能させるには、ルーターのWebインターフェイスで[USBコアサポート]、[自動ドライブマウント]の項目を選択し、[ディスクマウントポイント]のマウントポイントを指定する必要があります。 これらはすべて、 Services> USBの下のWebインターフェイスにあります 。 フラッシュドライブが/ optにマウントされました。



次に確認するのは、digitempの動作です。 これは、コマンド./digitemp -s / dev / usb / tts / 0 –i(デバイスの初期化)および./digitemp -a(まだ一体型であるすべてのセンサーから温度を読み取る)によってチェックされます。 マニュアルに書かれているように、一度初期化する必要がありましたが、スケジュールに従ってデータを読み取ると、毎回再初期化する必要がありました。 すべてがうまくいった場合、コマンドの出力は次のようになります。



DigiTemp v3.3.2 Copyright 1996-2004 by Brian C.Lane

GNU Public License v2.0-http:#www.brianlane.com

すべてのDS2409カプラーをオフにする



1-Wire LANを検索する

28B6ACDA020000EC:DS18B20温度センサー

ROM#0:28B6ACDA020000EC

.digitemprcを書いた

11月1日16:40:13センサー0 C:20.88 F:69.57



すべてのハードウェアアセンブリ:







残っているのは、温度を表示するためのWebインターフェイスを作成することだけです。



作成には多くのオプションがありましたが、私はcgi-binに基づいて動的なWebページを作成することに決めました。 テキストファイルからデータを受信します。これは、基本的にクラウンでdigitempを実行した結果です。 クラウンが正しく機能するには、データを取得する時間が正確になるように、ルーターでNTPクライアントを構成する必要があります。 これは、DD-WRT Webインターフェイスの[設定]-> [基本設定]-[時間設定]セクションで行います。 そこで、最初に起動(有効オプションを選択)してから、タイムゾーン(サマーゾーン)、サマータイム(DST)(夏時間)を設定し、サーバーIP /名前をNTPサーバーの名前またはアドレスに設定する必要があります。 VNIIFTRIアドレス(ntp1.vniiftri.ru)。 変更を保存して再起動すると、ルーターは時刻を状態標準の時刻と頻度と同期します。



残念ながら、DD-WRTの脆弱性により、最新バージョンではユーザーディレクトリからのcgi-binスクリプトが無効になっているため、動的ページには、lighttpdを選択した別のWebサーバーをインストールする必要があります。 ページ自体はperlで記述されており、microperlがハンドラーとして選択されているため、lighttpd構成ではmod_cgiのコメントが解除されています。Webページが機能する必要があります。 以下は、標準のlighttpd設定の変更点です。



server.document-root = "/ opt / share / www /"

#Webページファイルが配置されるディレクトリ。

index-file.names =( "index.cgi")

#デフォルトページ。

server.event-handler = "poll"

#イベント処理のタイプ。

server.tag = "lighttpd"

#Webサーバーの署名、私たちは丁寧になります

static-file.exclude-extensions =( ".fcgi"、 ".php"、 ".pl"、 ".py"、 ".rb"、 ".cgi")

#次のページを静的として処理しないようにします。

server.port = 8081

#Webサーバーが動作するポート。

server.username = "nobody"

#Webサーバーが動作するユーザー名。

server.groupname = "65534"

#Webサーバーが動作するユーザーグループ。

cgi.assign =( ".pl" => "/ opt / bin / microperl"、

".cgi" => "/ opt / bin / microperl")

#cgi-binベースのWebページに使用するハンドラーを設定します。



Raphaelライブラリは、温度グラフを表示するために使用されます。 情報量が多く情報量が少ないため、自分でリストを提供することはしません。



そして最後のタッチ-再起動後もすべてが機能するように、DD-WRT Webインターフェースの起動スクリプト構成に編集が追加されました。



insmod /lib/modules/2.6.24.111/kernel/drivers/usb/serial/usbserial.ko

insmod /lib/modules/2.6.24.111/kernel/drivers/usb/serial/pl2303.ko

//温度計のドライバーをロードする

chmod 666 / dev / usb / tts / 0

chmod 666 /opt/var/log/lighttpd/error.log

chmod 666 /opt/var/log/lighttpd/access.log

//ファイルのパーミッションを変更しますが、そのような数字ではデーモンのみを起動する必要があります。

grep -q nobody / etc / passwd || echo "nobody:*:65534:65534:nobody:/ var:/ bin / false" >> / etc / passwd

// lighttpdが動作するユーザーを作成します(小さな妄想はまだ誰も傷つけていません!)

lighttpd -f /opt/etc/lighttpd/lighttpd.conf

// lighttpd自体をデーモンモードで起動します(オペレーティングシステムは私ではなく、そのようなものです...)。



別の行がcronに追加され、スケジュールされたデータの取得を担当します。

0 * * * * root sh /opt/input.sh



スクリプトinput.shの内容(1時間ごとにセンサーからデータを読み取ります)



#!/ bin /

/opt/share/./digitemp -s / dev / usb / tts / 0 -i;

/opt/share/./digitemp -a -o%.2C | tail -n 1 >> /opt/share/www/temp1.txt

#センサーからの温度を摂氏で小数点以下2桁でtemp1.txtファイルに書き込みます。

tail -n 24 /opt/share/www/temp1.txt> /opt/share/www/temp.txt

#ファイルから最新の24個の温度値を切り取ります。

日付+%R >> /opt/share/www/time1.txt

#データが取得された時間を記録します。

tail -n 24 /opt/share/www/time1.txt> /opt/share/www/time.txt

#ファイルから最新の24個の温度値を切り取ります。



したがって、最終日の温度を取得します。

すべての設定後、ページ192.168.1.1:8081にアクセスすると次のように表示されます。







1線規格自体は共通のバスで動作しますが、最大300メートルのライン長を許可しているため、家全体およびそれ以降の温度を測定できます。 さらに、センサーだけでなくアクチュエータも1線で動作するため、このプロトコルとホームルーターに基づいて、インターネット制御を備えた小さなスマートハウスを構築できます。



All Articles