HTML の確認をESP32を使用せずに行う。
理由:
HTMLの修正(見栄え、動作確認等) の度に コンパイル,書き込みを行うのは面倒。
方法:
Apache, PHP をインストールした raspberry pi 3 があるため、これを webサーバーとして、HTML部分を確認する。
ESP32 の応答部分は PHP で模擬。
Windows PC のみでも XAMPP 等のツールを使用すればできるとの事。
PHP 概要:
PHPで 今回試してみた部分の概要は以下の通り。
- PHPは、html に埋め込むスクリプト
- スクリプトは <?php と ?> で囲む。複数行でも可
- 実行はサーバ側で行う
- 変数は $で始まる
- 変数の NULL と 空白(空文字, "") は異なる
- NULL の判定は is_null() や === NULL を使用する。 == NULL だと 空文字との区別ができない
- セッションとは、接続から切断までの間、個々のユーザ毎にデータを格納する仕組み
- セッションは、session_start() ; で開始する
- セッションデータは、$_SESSIONに格納する
「LED調光_WEBからと外付けのボリュームからを切り替えて調光」の HTML を PHPで動作できる様に変更。(ハイライト部分を追加/変更)
<?php session_start() ; if ( is_null($_SESSION['checked_lo']) and is_null($_SESSION['checked_rm']) ) { $_SESSION['checked_lo'] = "checked" ; $_SESSION['checked_rm'] = "" ; } $remote = $_GET["remote"] ; if ($remote == "local") { $_SESSION['checked_lo'] = "checked" ; $_SESSION['checked_rm'] = "" ; } if ($remote == "remote") { $_SESSION['checked_lo'] = "" ; $_SESSION['checked_rm'] = "checked" ; } if ($_SESSION['led_val'] == NULL ) $_SESSION['led_val'] = 0 ; if ($_GET['led_s'] != NULL) $_SESSION['led_val'] = $_GET['led_s'] ; if ($_GET['led_v'] != NULL) $_SESSION['led_val'] = $_GET['led_v'] ; if ($_GET['on'] == "ON") $_SESSION['led_val'] = $_SESSION['led_val'] + 1 ; if ($_GET['off'] == "OFF") $_SESSION['led_val'] = 0 ; $checked_lo = $_SESSION['checked_lo'] ; $checked_rm = $_SESSION['checked_rm'] ; $led_brightness = $_SESSION['led_val'] ; ?> <!DOCTYPE html><html lang='ja'><head><meta charset='UTF-8'> <style> #base {font-size:16pt;text-align:center;width:300px;border:solid 4px #93ff93; } #radio_box {font-size:12pt;float:left ;text-align:left; width:45%; } #disp_box {font-size:12pt;float:right;text-align:left; width:50%; } #brightness {font-size:12pt;text-align:right; } #val_box {font-size:12pt;text-align:center; clear:both ;} #ctl_box {text-align:center; } input.radio {margin-left:8px; width:30px;} input.value {margin-left:8px; width:30px;} input.setbutton{margin-left:8px; width:40px;} input.slider {margin-left:8px; width:250px;} input.button {margin:0px 15px; width:100px;} </style> <title>Color LED Controller</title></head> <body> <div id="base"> <p>LED ON/OFF</p> <div id="radio_box"> <form method="get"> <?php echo '<input class="radio" type="radio" name="remote" id="rad_lo" value="local" ' ; ?> <?php echo $checked_lo ; ?> <?php echo ' onclick="disp_ctrl(this.value); submit(this.value)">local<br>' ; ?> <?php echo '<input class="radio" type="radio" name="remote" id="rad_rm" value="remote" ' ; ?> <?php echo $checked_rm ; ?> <?php echo ' onclick="disp_ctrl(this.value); submit(this.value)">remote<br>' ; ?> </form> </div> <div id="disp_box"> <span> brightness value</span><br> <?php echo '<div id="brightness"><output id="o1">' ; ?> <?php echo $led_brightness ; ?> <?php echo '</output></div>' ; ?> </div> <div id="val_box"> <form method="get"> <span style="font-size:10pt;"> LED brightness (0-255)</span> <?php echo "<input class='value' type='text' name='led_v' value=" ; ?> <?php echo $led_brightness ; ?> <?php echo " id='led_v' disabled>" ; ?> <input class='setbutton' type='submit' name='set' id='set' value='SET' disabled> </form> <form method='get'> <?php echo "<input class='slider' type='range' name='led_s' id='led_s' value=" ; ?> <?php echo $led_brightness ; ?> <?php echo "min='0' max='255' step='1' disabled" ; ?> <?php echo " onchange='setval(this.value)' ; oninput='setval(this.value)' ; onmouseup='submit(this.form)' ; ontouchend='submit(this.form)'>" ?> </form> </div> <div id="ctl_box"> <form method='get'> <input class='button' type='submit' name='on' id='on' value='ON' disabled > <input class='button' type='submit' name='off' id='off' value='OFF' disabled><br> </form> </div> </div> <script> var polling = null ; function setval(ledval){ var xhr = new XMLHttpRequest(); xhr.open("get", "pwm_vol_rspval.php?slid="+ledval ); xhr.setRequestHeader('Cache-Control', 'no-cache'); xhr.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT'); xhr.responseType = 'document' ; xhr.onreadystatechange = function() { if( (xhr.readyState == 4) && (xhr.status == 200) ) { document.getElementById('led_v').value = xhr.response.getElementById("output1").innerHTML; document.getElementById('o1').innerHTML = xhr.response.getElementById("output1").innerHTML; } } ntimeout = function(e) { xhr.abort() ; } xhr.send(); } function getval(){ var xhrget = new XMLHttpRequest(); xhrget.open("get", "pwm_vol_rsppol.php?pol" ); xhrget.setRequestHeader('Cache-Control', 'no-cache'); xhrget.setRequestHeader('If-Modified-Since', 'Thu, 01 Jun 1970 00:00:00 GMT'); xhrget.responseType = 'document' ; xhrget.onreadystatechange = function() { if( (xhrget.readyState == 4) && (xhrget.status == 200) ) { document.getElementById('o1').innerHTML = xhrget.response.getElementById("output1").innerHTML; } } ntimeout = function(e) { xhrget.abort() ; } xhrget.send(); } function disp_ctrl( radioid ) { if(radioid == 'remote') { document.getElementById('led_v').disabled = false; document.getElementById('set').disabled = false; document.getElementById('led_s').disabled = false; document.getElementById('on').disabled = false; document.getElementById('off').disabled = false; clearInterval(polling); } else { document.getElementById('led_v').disabled = true; document.getElementById('set').disabled = true; document.getElementById('led_s').disabled = true; document.getElementById('on').disabled = true; document.getElementById('off').disabled = true; polling = setInterval(getval,100) ; } } window.onload = function() { if(document.getElementById("rad_rm").checked) { document.getElementById('led_v').disabled = false; document.getElementById('set').disabled = false; document.getElementById('led_s').disabled = false; document.getElementById('on').disabled = false; document.getElementById('off').disabled = false; clearInterval(polling); } else if(document.getElementById("rad_lo").checked) { document.getElementById('led_v').disabled = true; document.getElementById('set').disabled = true; document.getElementById('led_s').disabled = true; document.getElementById('on').disabled = true; document.getElementById('off').disabled = true; polling = setInterval(getval,100) ; } } </script> </body> </html>
<?php $led_brightness = $_GET['slid'] ; ?> <!DOCTYPE html><html lang='ja'> <head> <title>Color LED Controller</title></head> <body> <?php echo "<output id='output1'>" ; echo $led_brightness ; echo "</output>" ; ?> </body> </html>
<?php session_start() ; if (is_null($_SESSION['led_val'])) { $_SESSION['led_val'] = 0 ; } $led_brightness = $_SESSION['led_val'] + 1 ; if ($led_brightness > 255) $led_brightness = 0 ; $_SESSION['led_val'] = $led_brightness ; ?> <!DOCTYPE html><html lang='ja'> <head> <title>Color LED Controller</title></head> <body> <?php echo "<output id='output1'>" ; echo $led_brightness ; echo "</output>" ; ?> </body> </html>
以下、変更部分の覚書等:
--- < HTML 本体 > ---
( 行# 1-28 )
スケッチ部分(GET を受けた時の処理)を模擬。
セッションを使用して ラジオボタンの状態やLEDの明るさを保存する。
3-6 : ラジオボタンの状態の初期設定 (セッションデータ が存在しない場合は初期値を設定)
7-15 : ラジオボタン (REMOTE/LOCAL) が押された場合(GET) の状態をセッションデータに保持。
17 : LEDの明るさの初期設定。
19-22 : スライダーや各ボタン操作の場合(GET)の処理。
24-26 : セッションデータを 変数に代入。
( 元のHTML で使用していた変数名に合わせる )
(行#52-59, 65-67, 72-74, 78-81)
変数を値にして HTML を出力する。
( スケッチでは 変数を値に 置換 してから 送信 )
(行#99, 120)
xhr.open で レスポンス用のファイル (PHP) を指定。
( スケッチ用では、ファイル名は無し )
--- < スライダー操作時の XHR レスポンス用 > ---
(行#1)
GET で受け取った値を変数に代入。
(行#7-11)
変数を値にして HTML を出力する。
--- < Local時のポーリングの XHR レスポンス用 > ---
(行#1-10)
ポーリングの度に、LED の明るさを インクリメントする。
(LEDの明るさ (セッションデータ) は、HTML本体と同じ。
(行#16-20)
変数を値にして HTML を出力する。
0 件のコメント:
コメントを投稿