Zyxel Keenetic 4G、Arduino、およびDS18B20温度センサー

画像 こんにちはHabrahabr! Arduinoをルーターに接続した方法を共有したいと思います。 行こう!

最近のルーターは、ネットワークトラフィックを分散するための非常に特殊なタスクを実行する小型コンピューターのようなものです。 このような小さなデバイスにオンボードでLinuxがインストールされますが、グラフィカルインターフェイスがなく、ソフトウェア部分が削除されています。 私の前に疑問が生じました。なぜアルドゥイーノをルーターに接続しないのですか-Zyxel Keenetic 4G? 少しグーグルで、参加者の1人がKeenetic 4Gの追加パッケージのインストールをサポートする修正されたファームウェアを作成した素晴らしいフォーラムに出会いました。

私たちの場合、Arduinoはphp_serial.class.phpライブラリとLighttpd + phpに基づいた軽量Webサーバーによって制御されます。 これらのツールを使用して、arduinoに2つの温度センサー(家、街路)からの読み取り値を読み取り、応答をSqlite3データベースに書き込み、Webページに表示するように指示します。



ルーターの準備



まず、ルーターを構成する必要があります。 Zyxel Keenetic 4Gの内部メモリは非常に小さいため、シンプルなUSBハブと小さなフラッシュドライブを用意してください。 設定のすべての微妙な点については説明しませんが、必要なリンクのみを共有します。 長く退屈な手順にすぐに備えましょう。

  1. 代替ファームウェアディスカッション )。 追加パッケージをインストールするためのOpkgシステム。 (私たちはWIKIを注意深く読み、すべてがそこに描かれています)
  2. opkg install <パッケージ名>でSqlite3をインストールします。ここで、<パッケージ名>はパッケージへのフルパスです。 ここで必要なすべてのパッケージを取得します。
  3. Lighttpdとphpをインストールして設定します。


センサー接続



ds18b20温度センサーをArduinoに接続します。 抵抗定格は4.7 kOhmです

画像

スケッチ



スケッチを塗りつぶします。 このレッスンのコードは基礎として使用され、タスク用にわずかに変更されています。

#include <OneWire.h> int nc; OneWire ds(10); //   OneWire ds2(11); //   byte addr[8]; byte addr2[8]; void setup(void) { Serial.begin(9600); ds.search(addr); ds2.search(addr2); } void loop(void) { byte i; byte present = 0; byte data[12]; int Temp; int znak; if (Serial.available() > 0) { nc = Serial.read(); if (nc==1) { ds.reset(); ds.select(addr); ds.write(0x44,1); present = ds.reset(); ds.select(addr); ds.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds.read(); } Temp=(data[1]<<8)+data[0]; Temp=Temp; znak=((Temp%16)*100)/16; if (znak<0){ znak=znak*-1; } Serial.print(Temp/16); Serial.print("."); Serial.print(znak); Serial.println(); } if (nc==2) { ds2.reset(); ds2.select(addr2); ds2.write(0x44,1); present = ds2.reset(); ds2.select(addr2); ds2.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds2.read(); } Temp=(data[1]<<8)+data[0]; Temp=Temp; znak=((Temp%16)*100)/16; if (znak<0){ znak=znak*-1; } Serial.print(Temp/16); Serial.print("."); Serial.print(znak); Serial.println(); } } }
      
      





コマンドを送信し、回答を受け入れます



スケッチには、「1」と「2」の2つのチームが必要です。 Arduinoにコマンドを送信するために、よく知られているJqueryライブラリを使用してjavaスクリプトでボタン処理を使用しました。 私のページには、温度センサーの値が表示される2つのボタンと2つの表形式のフィールドがあります(index.phpを参照)。 スクリプトはPOSTメソッドを使用してarduino.phpを呼び出し、コマンドの値を渡します。 ここでは、コマンドはArduinoに直接送信され、応答は温度の形式で読み取られ、Sqlite3データベースに書き込まれます(arduino.phpを参照)。 readbd.phpファイルは、プレートに温度データを最初に入力するために必要です。 ボタンの美しいデザインは、記事「CSS3を使用した3Dボタン」から引用されました。



index.php:

 <?php include("readbd.php"); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ru"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <head> <link href="style.css" rel="stylesheet" media="all" /> <title>     </title> <link href="flot/examples/layout.css" rel="stylesheet" type="text/css"> <script type="text/javascript" src="jquery.js"></script> </head> <body class="body"> <br> <div class="container"> <header> <h1><span></span></h1> </header> </div> <div class="ul1" > <br> <table width="60px" border="0"><tr> <td><a href="#" id="led6" class="button black" onMouseDown="command(1);"></a></td> <td><a href="#" id="led6" class="button yellow" onMouseDown="command(2);"></a></td> </tr><tr> <td class="c1"><div id="content1" ><?php echo ''.$temp1.""; ?></div></td> <td class="c1"><div id="content2" ><?php echo ''.$temp2.""; ?></div></td> </tr> </table> </div> <br> <script> function command(id) { $.ajax({ type:'POST', url:'arduino.php', data:{msg:id}, cache: false, success: function(html){ $("#content"+id).html(html); } }) } </script> </center> </body> </html>
      
      





arduino.php:

 <?php include "php_serial.class.php"; $serial = new phpSerial; //   Arduino (      ) $serial->deviceSet("/../../../../dev/ttyACM0"); //  $serial->confBaudRate(9600); $serial->confParity("none"); $serial->confCharacterLength(8); $serial->confStopBits(1); $serial->confFlowControl("none"); $serial->deviceOpen(); //  $serial->sendMessage(chr($_POST['msg'])); //  Arduino $read = $serial->readPort(); //  $serial->deviceClose(); try { //        $db = new PDO('sqlite:'.dirname(__FILE__).DIRECTORY_SEPARATOR.'arduino.db'); //   temp,    $db->exec('CREATE TABLE IF NOT EXISTS temp ( idtemp INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, temperature VARCHAR(255) NOT NULL, datetime VARCHAR(255) NOT NULL )'); $db->exec('CREATE TABLE IF NOT EXISTS temp2 ( idtemp INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, temperature VARCHAR(255) NOT NULL, datetime VARCHAR(255) NOT NULL )'); //     $d=date("dmy, G:i:s"); // //$db->exec('UPDATE temp SET temperature="'.$read.'", datetime="'.$d.'" WHERE idtemp='.$_POST['msg'].''); if ($_POST['msg']==1){ //     $db->exec('INSERT INTO temp (temperature, datetime) VALUES ("'.$read.'","'.$d.'" )'); //   $st = $db->query('SELECT MAX(idtemp) as id, temperature FROM temp'); $results = $st->fetchAll(); foreach ($results as $row) { echo ''.$row['temperature']."\n"; } } if ($_POST['msg']==2){ $db->exec('INSERT INTO temp2 (temperature, datetime) VALUES ("'.$read.'","'.$d.'" )'); $st = $db->query('SELECT MAX(idtemp) as id, temperature as tempe FROM temp2'); $results = $st->fetchAll(); foreach ($results as $row) { echo ''.$row['tempe']."\n"; } } } catch (PDOException $e) { die($e->getMessage()); } ?>
      
      





私が遭遇した問題

  1. ルーターのArduinoは、/ dev / ttyUSB0ではなく、/ dev / ttyACM0として定義されました。
  2. PHPが作成された後、常にエラーがポップアップ表示されます-利用可能なsttyはありません、実行できません。」、E_USER_ERROR。
  3. コマンドを送信するとき、Arduinoは常に再起動しました。


解決策

  1. WebサーバーはUSBフラッシュドライブにインストールされているため、PHPスクリプトでデバイスへのパスを正しく指定する必要があります。 また、パーミッション777を/ dev / ttyACM0または/ dev / ttyUSB0に設定します(Arduinoに依存)。

     deviceSet("/../../../../dev/ttyACM0");
          
          



  2. php_serial.class.phpでコードを削除しました:

      if($this->_exec("stty --version") === 0) { register_shutdown_function(array($this, "deviceClose")); } else { trigger_error("No stty availible, unable to run.", E_USER_ERROR); }
          
          



  3. ArduinoのGNDピンとリセットピンの間のスケッチを埋めた後、コンデンサを22 mFに設定しました。 これにより、コマンドの受信中の再起動が防止されます。


いくつかの写真



画像



画像



必要なすべてのファイルを1つのアーカイブにダウンロードします



PS



これは、arduinoをルーターと組み合わせて使用​​する方法のほんの一例です。 もっと深刻なことを書くことができます。 WebインターフェースとArduinoを使用して、家庭内のアプライアンスを制御します。



招待UFOをありがとう!



All Articles