MCP23017 の使い方(I2C接続) について、簡単にまとめておく。
また、各レジスタアクセス, レジスタダンプの スケッチを作成する。
接続回路:
スケッチで wire.begin() を実行することで IO21(SDA),IO22(SCL) が弱プルアップ(30KΩ程度 ?) されるが、このプルアップでは動作不安定。(アクセスの繰り返しで誤動作発生。)
この為、外部プルアップ(3.3KΩ) を追加した。
使用方法:
主な内容は、以下のとおり。
- スレーブアドレスは、0x2X。
Pin A2,A1,A0 の設定で下位アドレスが決定。
上回路図の場合、A2='L', A1='L', A1='H' で、0x21。 - 初期のレジスタアドレスマッピングは、IOCON.BANK=0 で、A/Bレジスタが連続アドレスになっている 。
- 各レジスタの意味は、下表のとおり。
- GPIO の使用は、IODIR, IPOL, GPPU を設定し、GPIO の ライト/リードで行う。
- 割込みは、GPINTEN,INTCON,DEFVAL を設定し、INTF, INTCAP を確認する。
- INTF は、INTCAP 又は GPIO のリードでクリアされる。
レジスタ一覧
| レジスタ名 | アドレス | R/W | 初期値 | 内容 |
| IODIRA | 0x00 | R/W | 0xFF | I/O 方向。 0: 出力 1:入力 |
| IODIRB | 0x01 | R/W | 0xFF | |
| IPOLA | 0x02 | R/W | 0x00 | I/O 極性。 0: 0が'L' 1が'H' , 1: 1が'L' 0 が 'H' |
| IPOLB | 0x03 | R/W | 0x00 | |
| GPINTENA | 0x04 | R/W | 0x00 | 状態変化割り込み 0:無効 1:有効 |
| GPINTENB | 0x05 | R/W | 0x00 | |
| DEFVALA | 0x06 | R/W | 0x00 | 状態変化割り込みの規定値。 |
| DEFVALB | 0x07 | R/W | 0x00 | この値と逆になったら割り込み発生 |
| INTCONA | 0x08 | R/W | 0x00 | 状態変化割り込みの比較値 |
| INTCONB | 0x09 | R/W | 0x00 | 0: 前の値と比較 1:DEFV の値と比較 |
| IOCON | 0x0A | R/W | 0x00 | コンフィグレーションレジスタ。欄外参照 |
| IOCON | 0x0B | R/W | 0x00 | (アドレス a と b は同じレジスタ) |
| GPPUA | 0x0C | R/W | 0x00 | プルアップ制御 |
| GPPUB | 0x0D | R/W | 0x00 | 0: プルアップ無効 1:プルアップ有効 |
| INTFA | 0x0E | R | 0x00 | 割込みフラグレジスタ (INTCAP 又は GPIO リードでクリア) |
| INTFB | 0x0F | R | 0x00 | 0: 割り込みなし 1:割り込み発生 |
| INTCAPA | 0x10 | R | 0x00 | 割込みキャプチャレジスタ |
| INTCAPB | 0x11 | R | 0x00 | 割込み発生時の GPIO の値 |
| GPIOA | 0x12 | R/W | 0x00 | ポートレジスタ |
| GPIOB | 0x13 | R/W | 0x00 | GPIOの値 |
| OLATA | 0x14 | R/W | 0x00 | 出力ラッチレジスタ |
| OLATB | 0x15 | R/W | 0x00 | 出力ラッチの値 |
IOCON 内容
bit 7 BANK レジスタのアドレス指定を制御する
1 = 各ポートに関連付けられているレジスタが別々のバンクに分かれる
0 = レジスタが全部同じバンクに入れられる( アドレスが連続した状態)
bit 6 MIRROR INT ピンのMirror ビット
1 = INT ピン同士を内部接続する
0 = INT ピン同士を接続しない。INTA はPORTA に関連付けられ、
INTB はPORTB に関連付けられる。
bit 5 SEQOP シーケンシャル動作モードビット
1 = シーケンシャル動作が無効になり、アドレスポインタはインクリメントされない
0 = シーケンシャル動作が有効になり、アドレスポインタがインクリメントされる
bit 4 DISSLW SDA 出力のスルーレート制御ビット
1 = スルーレートは無効
0 = スルーレートは有効
bit 3 HAEN ハードウェア アドレス イネーブル ビット(MCP23S17 のみ)
MCP23017は値に関わらず、アドレスピンは常に有効。
bit 2 ODR INT ピンをオープンドレイン出力として設定する
1 = オープンドレイン出力(INTPOL ビットよりも優先される)
0 = アクティブ ドライバ出力( 極性はINTPOL ビットで設定する)
bit 1 INTPOL このビットでINT 出力ピンの極性を設定する
1 = アクティブHigh
0 = アクティブLow
bit 0 未実装 0」として読み出し
尚、BANK を変更すると、アドレスマッピングが変更されるため、注意の事。
( 1バイトアクセスでライトすること。)
<レジスタアクセス スケッチ>
”softAP で WiFI設定” の スケッチをベースに レジスタへの ライト/リード 及び レジスタダンプを行うコードを作成。(内容は各スケッチのコメント参照)
設定ファイルが無い状態では APモード で立ち上がるため、
SSID : ESP32_AP
( パスワード : password )
に接続し、ブラウザで IPアドレス 192.168.4.1 に アクセスして、WiFi 設定を行う。
WEB画面サンプル:
MAIN HTML (main.html)
WiFi設定 HTML (wifi_conf.html)
XHR 応答 HTML (resp_cnfld.html)
<スケッチ>
MAIN (変数定義, setup, loop 関数)
WIFI設定 (主に WiFI 設定用 の関数)
WIFI処理 (主に MAIN処理(レジスタアクセス)の WEB画面処理 )
MAIN処理 (主に I2Cアクセス の関数)
<!DOCTYPE html><html lang='ja'><head><meta charset='UTF-8'>
<style>
#base {font-size:16pt; text-align:center; width:410px; border:solid 4px #93ff93; background-color:#f0f0f0; }
#set_box1 {height:19pt;font-size:10pt; text-align:left; border:solid 0px #111111; }
#set_box2 {height:15pt;font-size:10pt; text-align:left; border:solid 0px #111111; }
#text_box {font-size:10pt; margin : 3px 0px 0px 0px ;float:left ; text-align:left; width:150px;}
#regname {font-size:10pt; margin : 0px 0px 0px 0px ;float:left ; text-align:left; width:80px;border:solid 1px #000000;}
#regadr {font-size:10pt; margin : 0px 0px 0px 0px ;float:left ; text-align:left; width:40px;border:solid 1px #000000;}
#regwdt {font-size:10pt; margin : 0px 0px 0px 0px ;float:left ; text-align:left; width:100px;}
#regrdt {font-size:10pt; margin : 0px 3px 0px 0px ;float:left ; text-align:left; width:75px;border:solid 1px #000000;}
#button {font-size:12pt; margin : 10px 0px 10px 0px ;clear:both; }border:solid 1px #000000;
#btn_conf {font-size:12pt; margin : 10px 0px 10px 0px ;text-align:left ; width:83%; }
#text_in {height: 12pt ; margin:14px 0px 0px 5px ; font-size:8pt; float:right; }
#foot {font-size:16pt; clear:both;}
input {margin:0px 8px 0px 8px ;width:50px;}
input.button {margin:0px 8px 0px 8px ;width:100px;}
input.btncnf {margin:0px 0px 0px 28px ;width:100px;}
output {margin:0px 8px 0px 8px ;}
div {font-size:16pt;text-align:center;}
</style>
<title>MCP23017 Access</title></head>
<body>
<div id="base">
<p>MCP23017 レジスタ アクセス</p>
<form method='get'>
<div id=set_box1>
<div id=text_box>スレーブアドレス</div>
<div id=regwdt> <span>0x</span><input type='text' name='sadr' value=$s_adr > </div>
</div>
</form>
<form method='get'>
<div id=set_box1>
<div id=text_box>レジスタアドレス</div>
<div id=regwdt> <span>0x</span><input type='text' name='regadr' value=$reg_adr > </div>
</div>
<div id=set_box1>
<div id=text_box>ライトデータ</div>
<div id=regwdt> <span>0x</span><input type='text' name='wrdt' value=$wr_dt > </div>
</div>
<div id=set_box1>
<div id=text_box>リードデータ</div>
<div id=regwdt> <span>0x</span><output name='rddt' >$rd_dt</output> </div>
</div>
<div id=button>
<input class=button type='submit' name='read' value='rd' >
<input class=button type='submit' name='write' value='wr' >
</div>
</form>
<span>レジスタダンプ</span>
<div id=set_box2>
<div id=regname>レジスタ名</div>
<div id=regadr>adr</div>
<div id=regrdt>データ</div>
<div id=regname>レジスタ名</div>
<div id=regadr>adr</div>
<div id=regrdt>データ</div>
</div>
<div id=set_box2>
<div id=regname> IODIRA</div>
<div id=regadr> 00</div>
<div id=regrdt> <span>0x</span><output name='rddt00' >$rdt00</output> </div>
<div id=regname> IODIRB</div>
<div id=regadr> 01</div>
<div id=regrdt> <span>0x</span><output name='rddt01' >$rdt01</output> </div>
</div>
<div id=set_box2>
<div id=regname> IPOLA </div>
<div id=regadr> 02</div>
<div id=regrdt> <span>0x</span><output name='rddt02' >$rdt02</output> </div>
<div id=regname> IOOLB</div>
<div id=regadr> 03</div>
<div id=regrdt> <span>0x</span><output name='rddt03' >$rdt03</output> </div>
</div>
<div id=set_box2>
<div id=regname> GPINTENA </div>
<div id=regadr> 04</div>
<div id=regrdt> <span>0x</span><output name='rddt04' >$rdt04</output> </div>
<div id=regname> GPINTENB</div>
<div id=regadr> 05</div>
<div id=regrdt> <span>0x</span><output name='rddt05' >$rdt05</output> </div>
</div>
<div id=set_box2>
<div id=regname> DEFVALA </div>
<div id=regadr> 06</div>
<div id=regrdt> <span>0x</span><output name='rddt06' >$rdt06</output> </div>
<div id=regname> DEFVALB</div>
<div id=regadr> 07</div>
<div id=regrdt> <span>0x</span><output name='rddt07' >$rdt07</output> </div>
</div>
<div id=set_box2>
<div id=regname> INTCONA </div>
<div id=regadr> 08</div>
<div id=regrdt> <span>0x</span><output name='rddt08' >$rdt08</output> </div>
<div id=regname> INTCONB</div>
<div id=regadr> 09</div>
<div id=regrdt> <span>0x</span><output name='rddt09' >$rdt09</output> </div>
</div>
<div id=set_box2>
<div id=regname> IOCON </div>
<div id=regadr> 0a</div>
<div id=regrdt> <span>0x</span><output name='rddt0a' >$rdt0a</output> </div>
<div id=regname> IOCON </div>
<div id=regadr> 0b</div>
<div id=regrdt> <span>0x</span><output name='rddt0b' >$rdt0b</output> </div>
</div>
<div id=set_box2>
<div id=regname> GPPUA </div>
<div id=regadr> 0c</div>
<div id=regrdt> <span>0x</span><output name='rddt0c' >$rdt0c</output> </div>
<div id=regname> GPPUB </div>
<div id=regadr> 0d</div>
<div id=regrdt> <span>0x</span><output name='rddt0d' >$rdt0d</output> </div>
</div>
<div id=set_box2>
<div id=regname> INTFA </div>
<div id=regadr> 0e</div>
<div id=regrdt> <span>0x</span><output name='rddt0e' >$rdt0e</output> </div>
<div id=regname> INTFB </div>
<div id=regadr> 0f</div>
<div id=regrdt> <span>0x</span><output name='rddt0f' >$rdt0f</output> </div>
</div>
<div id=set_box2>
<div id=regname> INTCAPA </div>
<div id=regadr> 10</div>
<div id=regrdt> <span>0x</span><output name='rddt10' >$rdt10</output> </div>
<div id=regname> INTCAPB </div>
<div id=regadr> 11</div>
<div id=regrdt> <span>0x</span><output name='rddt11' >$rdt11</output> </div>
</div>
<div id=set_box2>
<div id=regname> GPIOA </div>
<div id=regadr> 12</div>
<div id=regrdt> <span>0x</span><output name='rddt12' >$rdt12</output> </div>
<div id=regname> GPIOB</div>
<div id=regadr> 13</div>
<div id=regrdt> <span>0x</span><output name='rddt13' >$rdt13</output> </div>
</div>
<div id=set_box2>
<div id=regname> OLATA </div>
<div id=regadr> 14</div>
<div id=regrdt> <span>0x</span><output name='rddt14' >$rdt14</output> </div>
<div id=regname> OLATB</div>
<div id=regadr> 15</div>
<div id=regrdt> <span>0x</span><output name='rddt15' >$rdt15</output> </div>
</div>
<form method='get'>
<div id='button'>
<input class='button' type='submit' name='dump' value='dmp' >
</div>
</form>
<div id="btn_conf">
<form method="get">
<input class='btncnf' type='submit' name='config' id='config' value='WiFi設定画面'>
<div id="text_in">
<a href="#" onclick='cnfdl();'>設定をダウンロードする</a>
</div>
</form>
</div>
</div>
<script>
function cnfdl() {
"use strict";
var xhr = new XMLHttpRequest();
xhr.open("get", "?cnfdl");
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) ) {
var filename = "config.txt" ;
var str = xhr.response.getElementById("output").innerHTML ;
var blob = new Blob([str],{type:'text/plain'}) ;
if (window.navigator.msSaveBlob) {
//window.navigator.msSaveBlob(blob, filename);
window.navigator.msSaveOrOpenBlob(blob,filename) ;
}
else {
var objectURL = window.URL.createObjectURL(blob);
var link = document.createElement("a");
document.body.appendChild(link);
link.href = objectURL;
link.download = filename;
link.click();
document.body.removeChild(link);
}
}
}
xhr.send();
}
</script>
</body>
</html>
<!DOCTYPE html><html lang='ja'><head><meta charset='UTF-8'>
<style>
#base {font-size:16pt; text-align:center; width:600px; border:solid 4px #00000000; background-color:#c0c0c0; }
#text_box {height: 25px; font-size:12pt; float:left ; text-align:left; width:45%;}
#input_box {height: 25px; font-size:12pt; float:right; text-align:left; width:55%;}
#ip_box {height: 25px; font-size:12pt; float:right; text-align:left; width:15%;}
#radio_box {font-size:12pt; clear:both; margin : 0% 20% ; width : 60% ;}
#button {font-size:12pt; clear:both; width 50%}
#foot {font-size:16pt; clear:both;}
input.val {width: 90%;}
input.ip {width: 20%;}
input.button {margin:10px 10% ; width: 25%;}
input.radio {margin:10px 0px 0px 15% ; }
</style>
<title>設定画面</title></head>
<body>
<div id="base">
<p>設定画面</p>
<div id="text_box">
<span> WiFi 接続先 SSID </span>
</div>
<form method="get">
<div id="input_box">
<input class='val' type='text' name='ssid' id='ssid' value=$ssid>
</div>
<div id="text_box">
<span> WiFi 接続先 PASSWORD </span>
</div>
<div id="input_box">
<input class='val' type='text' name='pass' id='pass' value=$pass>
</div>
<div id="text_box">
<span> WiFi 接続 IP アドレス </span>
</div>
<div id="input_box">
<input class='ip' type='number' name='ip1' id='ip1' min=0 max=255 value=$ip1 >
<input class='ip' type='number' name='ip2' id='ip2' min=0 max=255 value=$ip2 >
<input class='ip' type='number' name='ip3' id='ip3' min=0 max=255 value=$ip3 >
<input class='ip' type='number' name='ip4' id='ip4' min=0 max=255 value=$ip4 >
</div>
<div id="text_box">
<span> WiFi 接続 サブネットマスク</span>
</div>
<div id="input_box">
<input class='ip' type='number' name='sn1' id='sn1' min=0 max=255 value=$sm1 >
<input class='ip' type='number' name='sn2' id='sn2' min=0 max=255 value=$sm2 >
<input class='ip' type='number' name='sn3' id='sn3' min=0 max=255 value=$sm3 >
<input class='ip' type='number' name='sn4' id='sn4' min=0 max=255 value=$sm4 >
</div>
<div id="text_box">
<span> WiFi 接続 デフォルトゲートウェイ</span>
</div>
<div id="input_box">
<input class='ip' type='number' name='gw1' id='gw1' min=0 max=255 value=$gw1 >
<input class='ip' type='number' name='gw2' id='gw2' min=0 max=255 value=$gw2 >
<input class='ip' type='number' name='gw3' id='gw3' min=0 max=255 value=$gw3 >
<input class='ip' type='number' name='gw4' id='gw4' min=0 max=255 value=$gw4 >
</div>
<div id="text_box">
<span> WiFi 接続 DNSアドレス</span>
</div>
<div id="input_box">
<input class='ip' type='number' name='dns1' id='dns1' min=0 max=255 value=$dns1 >
<input class='ip' type='number' name='dns2' id='dns2' min=0 max=255 value=$dns2 >
<input class='ip' type='number' name='dns3' id='dns3' min=0 max=255 value=$dns3 >
<input class='ip' type='number' name='dns4' id='dns4' min=0 max=255 value=$dns4 >
</div>
<div id="radio_box">
<input class='radio' type='radio' name='wifi_stamode' id='rad_sta' value='sta' $checked_sta > STA MODE
<input class='radio' type='radio' name='wifi_stamode' id='rad_ap' value='ap' $checked_ap > AP MODE
</div>
<div id="button">
<input class='button' type='submit' name='set' id='set' value='設定'>
<input class='button' type='submit' name='rtn' id='rtn' value='戻る'>
</div>
</form>
<div id="foot">
<span>$footer</span>
</div>
</div>
</body>
</html>
<!DOCTYPE html><html lang='ja'>
<head> <title>MCP23017</title></head>
<html> <body>
<output id='output'>$cnf_text</output>
</body> </html>
/* +========================================================================+ */
/* | MCP23017 TEST | */
/* +========================================================================+ */
//
#include <Wire.h> //
#include <WiFi.h> //
#include "FS.h" // SPIFFS 用
#include "SPIFFS.h" // SPIEES 用
//
// +------------------------------------------------------------------------+
// | WiFi 設定用定義 |
// +------------------------------------------------------------------------+
// AP モード用 WIFI 設定 ----------------------------------------------------
const char ssid[] = "ESP32_AP"; // SSID for softAP
const char pass[] = "password"; // password for softAP
const IPAddress ip(192, 168, 4, 1); // IPアドレス for softAP
const IPAddress subnet(255, 255, 255, 0); // サブネットマスク for softAP
// AP/STA 動作モードフラグ --------------------------------------------------
bool stamode = true ; // WiFi STA 接続モード : true
bool sta_exec = false ; // WiFi STA接続モード実行中フラグ
bool config_mode = false ; // 初期設定モード ; true
bool config_exec = false ; // 初期設定実行中フラグ
// WiFi 設定ファイル用 ------------------------------------------------------
String s_config ; // 設定ファイル用 String
char wifi_ssid[128] = "" ; // SSID for WiFi STA
char wifi_pass[128] = "" ; // password for WiFi STA
IPAddress wifi_ip(192,168,1,66) ; // IP Address for WiFi STA
IPAddress wifi_gw(192,168,1,1) ; // gate way for WiFi STA
IPAddress wifi_sm(255,255,255,0) ; // subnet mask for WiFi STA
IPAddress wifi_dns(192,168,1,1) ; // dns address for WiFi STA
char wifi_mode[16] = "" ; // wifi mode
String foot_msg ="" ; // リブートメッセージ用
bool config_dl = false ; // 設定ファイルダウンロード要求フラグ
WiFiServer server(80);
String html_CONF ; // 設定用 HTML
String html_MAIN ; // メイン HTML
String html_resp ; // XHR レスポンス用
// --------------------------------------------------------------------------
// +------------------------------------------------------------------------+
// | MCP23017 用定義 |
// +------------------------------------------------------------------------+
bool wadr = false ; // 2B モードフラグ
bool rd_req = false ; // リード要求フラグ
bool wr_req = false ; // ライト要求フラグ
bool dmp_req = false ; // ダンプ要求フラグ
byte sadr = 0x21 ; // slave address
byte regadr = 0x0 ; // regadr
byte wrdt = 0x00 ; // write data
byte rddt = 0x00 ; // read date
byte dmpdt[32] = {0,0,0,0,0,0,0,0, // dump data
0,0,0,0,0,0,0,0, //
0,0,0,0,0,0,0,0, //
0,0,0,0,0,0,0,0 } ; //
byte IODIRA = 0x00 ; // IODIRA Register Address
byte IODIRB = 0x01 ; // IODIRB Register Address
byte GPPUA = 0x0C ; // GPPUA Register Address
byte GPPUB = 0x0D ; // GPPUA Register Address
byte GPIOA = 0x12 ; // GPIOA Register Address
byte GPIOB = 0x13 ; // GPIOA Register Address
/* +========================================================================+ */
/* | 初期設定 | */
/* +========================================================================+ */
void setup()
{
// +------------------------------------------------------------------------+
// | Serial 出力用 SetUp |
// +------------------------------------------------------------------------+
Serial.begin(115200); // シリアル 開始
SPIFFS.begin(true) ; // SPIFFS 開始
//
// +------------------------------------------------------------------------+
// | WiFi 用 SetUp |
// +------------------------------------------------------------------------+
int res = 0 ; // 結果格納用 (ワーク)
//
// 初期設定用 HTML ファイルの読み込み ---------------------------------------
res = rd_SPIFFS("/WiFi_Config.html",html_CONF) ;
// html_CONF に Config.html を格納
// 本体 HTML ファイルの読み込み ----------------------------------------------
res = rd_SPIFFS("/main.html",html_MAIN) ; // html_MAIN に main.html を格納
//
// レスポンス用HTML ファイルの読み込み ----------------------------------------
res = rd_SPIFFS("/resp_cnfld.html",html_resp) ;
// html_resp に resp_confld.html を格納
// 初期設定ファイルを読み込み、グローバル変数に設定し、wifi,画面モードを決定 ---
res = rd_config() ; //
//
// wifiモード(stamode) に応じて AP か STA かを選択してサーバー起動 -------------
if (stamode == false) { // APモードの場合 softAP WiFi 開始
start_AP_server() ; // APモードでサーバー起動
sta_exec = false ; //
} else { // STAモードの場合 Wifi 開始
start_STA_server() ; // APモードでサーバー起動
sta_exec = true ; //
} //
//
// 実行中のモード (設定かメインか) を設定 -------------------------------------
if (config_mode) config_exec = true ; // config_mode なら config_exec を '1'
else config_exec = false ; //
//
Serial.println("Server start!"); //
//
// +------------------------------------------------------------------------+
// | メイン処理用設定 |
// +------------------------------------------------------------------------+
Wire.begin();
// set direction IOA,IOB
//I2C_BWR(MCP23017,IODIRA,0xFE) ; // set IOA0 : output
//I2C_BWR(MCP23017,IODIRB,0x7F) ; // set IOB7 : output
//I2C_BWR(MCP23017,GPPUA,0x80) ; // set IOA7 : PullUp
}
/* +========================================================================+ */
/* | メインループ | */
/* +========================================================================+ */
void loop()
{
// +------------------------------------------------------------------------+
// | WiFi 処理 |
// +------------------------------------------------------------------------+
WiFiClient client = server.available();
String htmlwk = "" ; // html 用 ワーク変数
String line = "" ; // クライアントからの入力用
int xhr = 0 ; // xhr 要求フラグ
// HTML クライアント処理 ------------------------------------------------------
if (client) {
Serial.println(" +++++++++++++++++ new client! +++++++++++++++++ ");
while (client.connected()) { // クライアントから接続されたとき
if (client.available()) { //
line = client.readStringUntil('\n'); // 1行分取得
// # ifdef DEBUG_HTML //
Serial.println(line) ; //
// # endif //
if (line.indexOf("GET /?") != -1) { // GET 処理
if (config_mode) // 初期設定用 フォームデータ処理
set_form2param(line) ; // フォームデータを変数に格納
else { // メイン用 処理
xhr = proc_form(line) ; // フォームデータのメイン処理
} //
} //
// 最終行(空行)を受信した時 -------------------------------------------
if (line.length() == 1 && line[0] == '\r'){ // 最終行判定
if (stamode != sta_exec) { // sta_mode が変わった場合
if (strcmp(wifi_mode,"ap") == 0){ // リブートメッセージを設定
foot_msg = "アクセスポイントモードに移行します。<br>" ;
foot_msg += "この画面を閉じてアクセスポイントに接続して下さい。" ;
}else{
foot_msg = "ステーションモードに移行します。<br>";
foot_msg += "この画面を閉じて 設定したアドレスに接続して下さい。" ;
}
if (config_exec) { // 初期設定中なら
send_CONF_html(client) ; // 初期設定 HTML 送信
} else { // メイン画面なら
send_MAIN_html(client) ; // メイン HTML 送信
} // ( その後 リブート)
} else { // sta_mode が変わらない場合
if (config_mode) { // 次に初期設定を表示するなら
send_CONF_html(client) ; // 初期設定 HTML 送信
config_exec = true ; //
} else { // 次にメイン画面なら
if (rd_req) { // リード要求フラグが ON なら
rddt = I2C_BRD(sadr,regadr) ; // リードを実行
rd_req = false ; //
} //
if (wr_req) { // ライト要求フラグが ON なら
I2C_BWR(sadr,regadr,wrdt) ; // ライトを実行
rddt = I2C_BRD(sadr,regadr) ; // リードを実行
wr_req = false ; //
} //
if (dmp_req) { // ダンプ要求フラグが ON なら
reg_dmp() ; // ダンプ動作を実行
dmp_req = false ; //
} //
if (xhr) { // XHR 応答の場合
send_resp_html(client) ; // XHR 応答 送信
} else { // HTML 送信なら
send_MAIN_html(client) ; // メイン HTML 送信
config_exec = false ; //
} //
} //
} //
# ifdef DEBUG_HTML //
Serial.println("Send HTML") ; //
# endif //
break ; // ループ終了
} //
//-------------------------------------------------------------------
}
}
// 接続が切れた場合 ------------------------------------------------------
client.stop();
Serial.println("client disonnected");
Serial.println("----------------------------------------------------");
}
if (stamode != sta_exec) { // sta_mode が変わった場合
Serial.println("------------------- リブートします------------------- ");
delay(500); //
ESP.restart() ; // リブート
} else {
}
// --------------------------------------------------------------------------
// byte DATA ;
// DATA = I2C_BRD(MCP23017,GPIOA) ;
// if ( (DATA & 0x80) == 0x00 ) {
// I2C_BWR(MCP23017,GPIOA,0x01) ; // set IOA0 = H
// I2C_BWR(MCP23017,GPIOB,0x00) ; // set IOB7 = L
// DATA = I2C_BRD(MCP23017,GPIOA) ;
// Serial.print("REG GPIOA : 0x");
// Serial.println(DATA, HEX);
// DATA = I2C_BRD(MCP23017,GPIOB) ;
// Serial.print("REG GPIOB : 0x");
// Serial.println(DATA, HEX);
// delay(2000); // wait 2 seconds for next
// I2C_BWR(MCP23017,GPIOA,0x00) ; // set IOA0 = L
// I2C_BWR(MCP23017,GPIOB,0x80) ; // set IOB7 = H
// DATA = I2C_BRD(MCP23017,GPIOA) ;
// Serial.print("REG GPIOA : 0x");
// Serial.println(DATA, HEX);
// DATA = I2C_BRD(MCP23017,GPIOB) ;
// Serial.print("REG GPIOB : 0x");
// Serial.println(DATA, HEX);
// delay(2000); // wait 2 seconds for next
// } else {
// I2C_BWR(MCP23017,GPIOA,0x00) ; // set IOA0 = L
// I2C_BWR(MCP23017,GPIOB,0x00) ; // set IOB7 = L
// delay(4000); // wait 4 seconds for next
// }
}
// *****************************************************************************
// * 初期設定ファイル をリードし、グローバル変数に値をセットする *
// *****************************************************************************
int rd_config() { //
File fp ; // 設定ファイル用ファイルポインタ
int result = 0 ; // 戻り値
//
if (SPIFFS.exists("/config.txt")) { // 設定ファイル存在確認
// ファイルがあった場合 ---------------------//
result = rd_SPIFFS("/config.txt",s_config) ; // s_config に config.txt を格納
} else { //
// ファイルが無かった場合 -------------------//
Serial.println("設定ファイルなし") ; // 無かったら、APモード
result = -1 ; //
} //
// ファイルが読み込めたら、グローバル変数にセットする
if (result == 0) //
# ifdef DEBUG // デバッグ用表示
Serial.println("--- s_config --- ") ; //
Serial.println(s_config ) ; //
# endif //
set_conf2param() ; // s_config の内容を変数に設定
// 初期設定ファイルの状態で wifiモード, 画面モードを設定 ----------------------
if (result != -1) { // 変数に設定できた場合
if (( strcmp(wifi_ssid,"") ==0) || (strcmp(wifi_pass,"") ==0)) {
// ssid,pass 設定なければ
stamode = false ; // APモード
if ( strcmp(wifi_mode,"ap") == 0) // wifi_mode が "ap" なら
config_mode = false ; // メイン画面
else // wifi_mode が "ap" でなければ
config_mode = true ; // 初期設定画面
} else { // ssid,pass の設定があれば、
config_mode = false ; // メイン画面
if ( strcmp(wifi_mode,"ap") == 0) // wifi_mode が "ap" なら
stamode = false ; // APモード
else // "ap" でなければ
stamode = true ; // STAモード
}
} else { // 変数に設定できなかった場合
stamode = false ; // APモード
config_mode = true ; // 初期設定画面
}
return result ; //
}
// ----------------------------------------------------------------------------
// - 設定ファイルの内容を グローバル変数に 設定する -
// ----------------------------------------------------------------------------
void set_conf2param() {
int pos = 0 ;
int npos = 0 ;
String s_work ;
String s_name ;
String s_data ;
// 記載内容を順次処理 ( 設定情報を取り出し、グローバル変数に設定する ) ------
while(1) {
if (s_config.charAt(pos) == '/') { // 先頭が '/' なら 次の行へ
npos = s_config.indexOf('\n',pos) ; //
pos = npos + 1 ; //
} else { //
npos = s_config.indexOf(':',pos) ; // ':' までの文字をs_name に取得
if (npos == -1) break ; // 見つからなければ終了
s_name = s_config.substring(pos,npos) ; //
s_name.trim() ; //
pos = npos+1 ; // ポインタを ':' の次へ
npos = s_config.indexOf('\n',pos) ; // '\n' までの文字をs_data に取得
if (npos == -1) npos = s_config.length() ; //
s_data = s_config.substring(pos,npos) ; //
s_data.trim() ; //
pos = npos+1 ; //
set_param(s_name,s_data) ; // 取得した内容をグローバル変数に設定
} //
} //
} //
// - 設定内容を判定し、グローバル変数に設定 ------------------------------------
void set_param(String &name, String &data) { //
if (name.compareTo("wifi_ssid")==0) { // 'wifi_ssid' の場合
data.toCharArray(wifi_ssid,128) ; //
} //
if (name.compareTo("wifi_pass")==0) { // 'wifi_pass' の場合
data.toCharArray(wifi_pass,128) ; //
} //
if (name.compareTo("wifi_ip")==0) { // 'wifi_ip' の場合
wifi_ip = stoip(data) ; // 取得情報(文字列)をIPAddressに変換
} //
if (name.compareTo("wifi_gw")==0) { // 'wifi_gw' の場合
wifi_gw = stoip(data) ; //
} //
if (name.compareTo("wifi_sm")==0) { // 'wifi_sm' の場合
wifi_sm = stoip(data) ; //
} //
if (name.compareTo("wifi_dns")==0) { // 'wifi_dns' の場合
wifi_dns = stoip(data) ; //
} //
if (name.compareTo("wifi_mode")==0) { // 'wifi_mode' の場合
data.toCharArray(wifi_mode,16) ; //
} //
} //
// - 文字列 から IPAddress へ変換 ----------------------------------------------
IPAddress stoip(String &data) { //
IPAddress ip ;
String num = "" ;
int pos = 0 ;
while(data.charAt(pos) != '.') { // 先頭から '.' までの文字を取得
num += data.charAt(pos++) ; //
} //
ip[0] = num.toInt() ; // 数値に変換して 第1オクテット に 代入
pos++ ; // '.' の次から
num=""; //
while(data.charAt(pos) != '.') { // '.' までの文字を取得
num += data.charAt(pos++) ; //
} //
ip[1] = num.toInt() ; // 数値に変換して 第2オクテットに代入
pos++ ; // '.' の次から
num=""; //
while(data.charAt(pos) != '.') { // '.' までの文字を取得
num += data.charAt(pos++) ; //
} //
ip[2] = num.toInt() ; //
pos++ ; // '.' の次から
num=""; //
while(data.charAt(pos) != '.') { // '.' または 最後まで の 文字を取得
num += data.charAt(pos++) ; //
if (pos > data.length()) break ; //
} //
ip[3] = num.toInt() ; // 数値に変換して 第4オクテットに代入
//
return ip ; // IPAddress を戻り値とする
} //
// ****************************************************************************
// * アクセスポイント モードで サーバーを起動 *
// ****************************************************************************
void start_AP_server() {
Serial.println(" AP Server exec") ;
WiFi.softAP(ssid, pass); // SSIDとパスの設定
delay(100); // delayが必要
WiFi.softAPConfig(ip, ip, subnet); // IP address, gateway, subnetmask の設定
IPAddress myIP = WiFi.softAPIP(); // WiFi.softAPIP()でWiFi起動
server.begin(); // サーバーを起動(htmlを表示させるため)
}
// ****************************************************************************
// * デバッグ表示用 *
// ****************************************************************************
void disp_mode() {
# ifdef DEBUG_HTML // デバッグ用表示
Serial.print("config_mode - exec : ") ; // 設定画面か メイン画面か
if (config_mode) // 変数の状態と実行状況を表示
Serial.print("Config MODE - ") ; //
else //
Serial.print("Main MODE - ") ; //
if (config_exec) //
Serial.println("Config MODE") ; //
else //
Serial.println("Main MODE") ; //
//
Serial.print("wifi_mode - exec : ") ; // Wifi モードを
if (stamode) // 変数の状態と実行状況を表示
Serial.print("STA - ") ; //
else //
Serial.print("AP - ") ; //
if (sta_exec) //
Serial.println("STA") ; //
else //
Serial.println("AP") ; //
# endif //
}
// ****************************************************************************
// * クライアントからのフォームデータを変数にセットし、設定ファイルに書き出す *
// ****************************************************************************
void set_form2param(String &line) {
String s_work ="" ;
if (line.indexOf("set=") != -1) { // stamode set
// クライアントからのデータを グローバル変数にセットする。 ------------------
if (line.indexOf("GET /?ssid=") != -1) { // wifi_ssid
s_work = getvalue_s(line,"?ssid=") ; // ssid に続く文字列を取得
s_work.toCharArray(wifi_ssid,128) ; // 変数にセット
}
if (line.indexOf("pass=") != -1) { // wifi_pass
s_work = getvalue_s(line,"pass=") ; // pass に続く文字列を取得
s_work.toCharArray(wifi_pass,128) ; // 変数にセット
}
if (line.indexOf("ip1=") != -1) { // wifi_ip
wifi_ip[0] = getvalue_i(line,"ip1=") ; // ip1 に続く数値を変数にセット
}
if (line.indexOf("ip2=") != -1) { //
wifi_ip[1] = getvalue_i(line,"ip2=") ; // ip2 に続く数値を変数にセット
}
if (line.indexOf("ip3=") != -1) { //
wifi_ip[2] = getvalue_i(line,"ip3=") ; // ip3 に続く数値を変数にセット
}
if (line.indexOf("ip4=") != -1) { //
wifi_ip[3] = getvalue_i(line,"ip4=") ; // ip4 に続く数値を変数にセット
}
if (line.indexOf("gw1=") != -1) { // wifi_gw
wifi_gw[0] = getvalue_i(line,"gw1=") ; // gw1 に続く数値を変数にセット
}
if (line.indexOf("gw2=") != -1) { //
wifi_gw[1] = getvalue_i(line,"gw2=") ; // gw2 に続く数値を変数にセット
}
if (line.indexOf("gw3=") != -1) { //
wifi_gw[2] = getvalue_i(line,"gw3=") ; // gw3 に続く数値を変数にセット
}
if (line.indexOf("gw4=") != -1) { //
wifi_gw[3] = getvalue_i(line,"gw4=") ; // gw4 に続く数値を変数にセット
}
if (line.indexOf("sm1=") != -1) { // wifi_sm
wifi_sm[0] = getvalue_i(line,"sm1=") ; // sm1 に続く数値を変数にセット
}
if (line.indexOf("sm2=") != -1) { //
wifi_sm[1] = getvalue_i(line,"sm2=") ; // sm2 に続く数値を変数にセット
}
if (line.indexOf("sm3=") != -1) { //
wifi_sm[2] = getvalue_i(line,"sm3=") ; // sm3 に続く数値を変数にセット
}
if (line.indexOf("sm4=") != -1) { //
wifi_sm[3] = getvalue_i(line,"sm4=") ; // sm4 に続く数値を変数にセット
}
if (line.indexOf("dns1=") != -1) { // wifi_dns
wifi_dns[0] = getvalue_i(line,"dns1=") ; // dns1 に続く数値を変数にセット
}
if (line.indexOf("dns2=") != -1) { //
wifi_dns[1] = getvalue_i(line,"dns2=") ; // dns2 に続く数値を変数にセット
}
if (line.indexOf("dns3=") != -1) { //
wifi_dns[2] = getvalue_i(line,"dns3=") ; // dns3 に続く数値を変数にセット
}
if (line.indexOf("dns4=") != -1) { //
wifi_dns[3] = getvalue_i(line,"dns4=") ; // dns4 に続く数値を変数にセット
}
if (line.indexOf("stamode=") != -1) { // stamode set
s_work = getvalue_s(line,"stamode=") ; // ssid に続く文字列を取得
s_work.toCharArray(wifi_mode,16) ; // 変数にセット
if (s_work == "sta") { // 設定値により、モードをセット
stamode = true ; //
config_mode = false ; //
} else { //
stamode = false ; //
config_mode = false ; //
}
}
// グローバル変数を 設定ファイルに書き出す -----------------------------------
wr_config() ; // 設定を初期設定ファイルに書き出し
}
if (line.indexOf("rtn") != -1) { // return
config_mode = false ; //
}
}
// -----------------------------------------------------------------------------
// - グローバル変数の内容を設定ファイルに書き出す -
// -----------------------------------------------------------------------------
void wr_config() {
char s_work[128] ;
File fp ;
// String に 変数の内容を書き込む -------------------------------------------
sprintf(s_work,"wifi_ssid : %s\n",wifi_ssid) ; //
s_config = String(s_work) ; //
sprintf(s_work,"wifi_pass : %s\n",wifi_pass) ; //
s_config += String(s_work) ; //
sprintf(s_work,"wifi_ip : %3d.%3d.%3d.%3d\n",wifi_ip[0],wifi_ip[1],wifi_ip[2],wifi_ip[3]) ;
s_config += String(s_work) ; //
sprintf(s_work,"wifi_sm : %3d.%3d.%3d.%3d\n",wifi_sm[0],wifi_sm[1],wifi_sm[2],wifi_sm[3]) ;
s_config += String(s_work) ; //
sprintf(s_work,"wifi_gw : %3d.%3d.%3d.%3d\n",wifi_gw[0],wifi_gw[1],wifi_gw[2],wifi_gw[3]) ;
s_config += String(s_work) ; //
sprintf(s_work,"wifi_dns : %3d.%3d.%3d.%3d\n",wifi_dns[0],wifi_dns[1],wifi_dns[2],wifi_dns[3]) ;
s_config += String(s_work) ; //
sprintf(s_work,"wifi_mode : %s\n",wifi_mode) ; //
s_config += String(s_work) ; //
// 設定ファイルに書き込む ----------------------------------------------------
fp = SPIFFS.open("/config.txt",FILE_WRITE) ; // 設定ファイルを開く
if (!fp) {
Serial.println(" 設定ファイル オープンエラー !!") ;
} else {
// 初期設定ファイル書き込み -------------------------------------------------
if(fp.print(s_config)) { // ファイルに書き込み
Serial.println("s_config written") ; // 終了メッセージ
} else { //
Serial.println("s_config write error !!") ; // 失敗メッセージ
} //
fp.close() ; // ファイルクローズ
} //
//
} //
// *****************************************************************************
// * HTML 送信処理 *
// *****************************************************************************
// ----------------------------------------------------------------------------
// - CONF_HTML 送信 -----------------------------------------------------------
// ----------------------------------------------------------------------------
void send_CONF_html(WiFiClient client) {
String htmlwk ;
// 変数置換え処理 ------------------------------------------------------------
htmlwk = html_CONF ;
htmlwk.replace("$ssid",String(wifi_ssid)) ;
htmlwk.replace("$pass",String(wifi_pass)) ;
htmlwk.replace("$ip1",String(wifi_ip[0])) ;
htmlwk.replace("$ip2",String(wifi_ip[1])) ;
htmlwk.replace("$ip3",String(wifi_ip[2])) ;
htmlwk.replace("$ip4",String(wifi_ip[3])) ;
htmlwk.replace("$sm1",String(wifi_sm[0])) ;
htmlwk.replace("$sm2",String(wifi_sm[1])) ;
htmlwk.replace("$sm3",String(wifi_sm[2])) ;
htmlwk.replace("$sm4",String(wifi_sm[3])) ;
htmlwk.replace("$gw1",String(wifi_gw[0])) ;
htmlwk.replace("$gw2",String(wifi_gw[1])) ;
htmlwk.replace("$gw3",String(wifi_gw[2])) ;
htmlwk.replace("$gw4",String(wifi_gw[3])) ;
htmlwk.replace("$dns1",String(wifi_dns[0])) ;
htmlwk.replace("$dns2",String(wifi_dns[1])) ;
htmlwk.replace("$dns3",String(wifi_dns[2])) ;
htmlwk.replace("$dns4",String(wifi_dns[3])) ;
if (stamode) { // ステーションモード時
htmlwk.replace("$checked_sta","checked") ; //
htmlwk.replace("$checked_ap","") ; //
} else { // アクセスポイントモード時
htmlwk.replace("$checked_sta","") ; //
htmlwk.replace("$checked_ap","checked") ; //
}
htmlwk.replace("$footer",foot_msg ) ;
// --------------------------------------------------------------------------
send_html(client,htmlwk) ; // HTML 送信処理
}
// *****************************************************************************
// * SPIFFS ファイルを String に読み込む *
// *****************************************************************************
int rd_SPIFFS(String fname, String &sname) { //
File fp = SPIFFS.open(fname,"r") ; // ファイルをオープンする
if (!fp) { // オープン失敗の場合
Serial.print(fname) ; //
Serial.println(" : file open error") ; //
return -1 ; // 戻り値 -1
}else { // オープン出来たら
sname = fp.readString() ; // String変数に読み込む
fp.close() ; //
} //
return 0 ; // オープン出来た時のみ
} // 戻り値 0
//
// ****************************************************************************
// * ステーションモードで サーバーを起動 *
// ****************************************************************************
void start_STA_server() {
int lpcnt = 0 ; // ループカウント
int lpcnt2 = 0 ; // ループカウント2
WiFi.config(wifi_ip, wifi_gw, wifi_sm, wifi_dns); // Set fixed IP address
delay(10) ; //
WiFi.begin(wifi_ssid, wifi_pass); // wifi 開始
lpcnt = 0 ; //
lpcnt2 = 0 ; //
while (WiFi.status() != WL_CONNECTED) { // 接続確認
lpcnt += 1 ; //
if (lpcnt > 4) { //
WiFi.begin(wifi_ssid, wifi_pass); // 4回目(2秒) で再度開始指示
lpcnt = 0 ; //
lpcnt2 += 1 ; //
} //
if (lpcnt2 > 5) { // 2秒x5 接続できなければ、
stamode = false ; // APモードにして
ESP.restart() ; // 再起動
} //
Serial.print("."); //
delay(500); // 0.5秒毎にチェック
} //
server.begin(); // サーバー開始
}
// *****************************************************************************
// * HTML 送信処理 *
// *****************************************************************************
// ----------------------------------------------------------------------------
// - CONF_HTML 送信 -
// ----------------------------------------------------------------------------
void send_MAIN_html(WiFiClient client) {
String htmlwk ;
htmlwk = html_MAIN ; // htmlwk に HTML をコピー
htmlwk.replace("$s_adr",String(sadr,HEX)) ; // 変数を値に置き換える
htmlwk.replace("$reg_adr",String(regadr,HEX)) ; // 変数を値に置き換える
htmlwk.replace("$wr_dt",String(wrdt,HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rd_dt",String(rddt,HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt00",String(dmpdt[0],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt01",String(dmpdt[1],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt02",String(dmpdt[2],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt03",String(dmpdt[3],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt04",String(dmpdt[4],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt05",String(dmpdt[5],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt06",String(dmpdt[6],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt07",String(dmpdt[7],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt08",String(dmpdt[8],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt09",String(dmpdt[9],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt0a",String(dmpdt[10],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt0b",String(dmpdt[11],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt0c",String(dmpdt[12],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt0d",String(dmpdt[13],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt0e",String(dmpdt[14],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt0f",String(dmpdt[15],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt10",String(dmpdt[16],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt11",String(dmpdt[17],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt12",String(dmpdt[18],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt13",String(dmpdt[19],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt14",String(dmpdt[20],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$rdt15",String(dmpdt[21],HEX)) ; // 変数を値に置き換える
htmlwk.replace("$footer",foot_msg ) ; // 変数を値に置き換える
send_html(client,htmlwk) ; // HTML 送信処理
}
// ----------------------------------------------------------------------------
// - HTML 送信処理 -
// ----------------------------------------------------------------------------
void send_html(WiFiClient client, String &html ) {
client.println("HTTP/1.1 200 OK"); //
client.println("Content-type:text/html"); //
client.println(); //
//
client.print(html) ; //
# ifdef DEBUG //
Serial.println( " --- send html --- "); //
#endif //
}
// ----------------------------------------------------------------------------
// - XHR RESPONSE_HTML 送信 -
// ----------------------------------------------------------------------------
void send_resp_html(WiFiClient client) { //
String htmlwk ; // HTML 編集用 ワーク
//
htmlwk = html_resp ; // htmlwk に HTML をコピー
//
// 変数を値に変換-----------------------------//
htmlwk.replace("$cnf_text",s_config) ; // 変数に 設定文字列をセット
//
send_html(client,htmlwk) ; // HTML 送信処理
Serial.print("xhr html :"); Serial.println(htmlwk);
# ifdef DEBUG_WiFi //
Serial.print("xhr value :"); Serial.println(duty);
#endif //
} //
//
// *****************************************************************************
// * フォームデータ処理 *
// *****************************************************************************
int proc_form(String &line) {
String s_work ="" ;
int xhr = 0 ;
if (line.indexOf("GET /?") != -1) { // "form" が押下された時
if (line.indexOf("config=") != -1) { // wifi 設定なら
config_mode = true ; // 設定モードにする
} //
if (line.indexOf("cnfdl") != -1) { // config.txt のダウンロード時
config_dl = true ; // 設定ダウンロード要求フラグ ON
xhr = 1 ; // XHR 応答にする。
} //
if (line.indexOf("read") != -1) { // "read" が押下された時
if (line.indexOf("sadr=") != -1) { // sadr
sadr = getvalue_h(line,"sadr=") ; // sadr に続く数値を変数にセット
} //
if (line.indexOf("regadr=") != -1) { // regadr
regadr = getvalue_h(line,"regadr=") ; // sadr に続く数値を変数にセット
} //
rd_req = true ; // リード要求フラグを ON
} //
if (line.indexOf("write") != -1) { // "write" が押下された時
if (line.indexOf("sadr=") != -1) { // sadr
sadr = getvalue_h(line,"sadr=") ; // sadr に続く数値を変数にセット
} //
if (line.indexOf("regadr=") != -1) { // regadr
regadr = getvalue_h(line,"regadr=") ; // sadr に続く数値を変数にセット
} //
if (line.indexOf("wrdt=") != -1) { // wrdt
wrdt = getvalue_h(line,"wrdt=") ; // wrdt に続く数値を変数にセット
} //
wr_req = true ; // ライト要求フラグをON
} //
if (line.indexOf("dump") != -1) { // "dump" が押下された時
dmp_req = true ; // ダンプ動作要求フラグを ON
} //
} //
return xhr ; //
} //
//
// 要素名に続く値(文字列)を取得する --------------------------------------------
String getvalue_s(String &line,String param) {
String val="" ;
int pos = 0 ;
if ((pos=line.indexOf(param)) != -1) { // 要素名の位置を取得
pos += param.length() ; //
while((line.charAt(pos) != '&') & (line.charAt(pos) != '\n')) {
val += line.charAt(pos++) ; // '&' か 行末 まで文字を取得
} //
} //
return val ; // 取得した文字列を返す
}
// 要素名に続く値(数値)を取得する ---------------------------------------------
int getvalue_i(String &line,String param) {
String val="" ;
int pos = 0 ;
if ((pos=line.indexOf(param)) != -1) { // 要素名の位置を取得
pos += param.length() ; //
while((line.charAt(pos) >= '0') & (line.charAt(pos) <= '9')) {
val += line.charAt(pos++) ; // 数値でなくなるまで文字を
} // 取得
} //
return val.toInt() ; // 数値に変換して返す
}
// 要素名に続く値(数値(HEX))を取得する ----------------------------------------
int getvalue_h(String &line,String param) {
String val="" ;
int pos = 0 ;
byte c= 0 ;
int dt = 0 ;
if ((pos=line.indexOf(param)) != -1) { // 要素名の位置を取得
pos += param.length() ; //
do { //
c = line.charAt(pos++) ; //
if ((c>='0') & (c<='9')) { // 数値の場合
dt = dt*16 + ( c - 0x30) ; //
} else if ((c>='a') & (c<='f')) { //
dt = dt*16 + (c - 87) ; // 小文字 a~f の場合
} else if ((c>='A') & (c<='F')) { // 大文字 A~F の場合
dt = dt*16 + (c - 55) ; //
} else { // 16進数値以外
c = 0xff ; //
} //
} while (c != 0xff) ; //
} //
return dt ; // 数値を返す
}
// -----------------------------------------------------------------------------
/* +=======================================================================+ */
/* | MAIN 処理 | */
/* +=======================================================================+ */
// I2C WR/READ ----------------------------------------------------------------
void I2C_BWR(byte TGT, byte REGADR, byte DATA) {
Wire.beginTransmission(TGT); // transmit to device #TGT
Wire.write(REGADR); // send REG address (REGADR)
Wire.write(DATA); // send write data (DATA)
Wire.endTransmission(); // end transmit
Serial.print("TGT=") ;
Serial.print(TGT) ;
Serial.print(" , REGADR=") ;
Serial.print(REGADR) ;
Serial.print(" , WRDT=") ;
Serial.print(DATA) ;
Serial.println(" ") ;
}
byte I2C_BRD(byte TGT,byte REGADR) {
byte data = 0 ;
Wire.beginTransmission(TGT); // transmit to device #TGT
Wire.write(REGADR); // send REG address (REGADR)
Wire.endTransmission(); // end transmit
Wire.requestFrom(TGT, 1); // request 1 byte from slave device #TGT
data = Wire.read(); // receive 1 byte
Serial.print("TGT=") ;
Serial.print(TGT) ;
Serial.print(" , REGADR=") ;
Serial.print(REGADR) ;
Serial.print(" , RDDT=") ;
Serial.print(data) ;
Serial.println(" ") ;
return data ;
}
void reg_dmp() {
//
dmpdt[0] = I2C_BRD(sadr,0) ; // REG0 リード
dmpdt[1] = I2C_BRD(sadr,1) ; // REG0 リード
dmpdt[2] = I2C_BRD(sadr,2) ; // REG0 リード
dmpdt[3] = I2C_BRD(sadr,3) ; // REG0 リード
dmpdt[4] = I2C_BRD(sadr,4) ; // REG0 リード
dmpdt[5] = I2C_BRD(sadr,5) ; // REG0 リード
dmpdt[6] = I2C_BRD(sadr,6) ; // REG0 リード
dmpdt[7] = I2C_BRD(sadr,7) ; // REG0 リード
dmpdt[8] = I2C_BRD(sadr,8) ; // REG0 リード
dmpdt[9] = I2C_BRD(sadr,9) ; // REG0 リード
dmpdt[10] = I2C_BRD(sadr,10) ; // REG0 リード
dmpdt[11] = I2C_BRD(sadr,11) ; // REG0 リード
dmpdt[12] = I2C_BRD(sadr,12) ; // REG0 リード
dmpdt[13] = I2C_BRD(sadr,13) ; // REG0 リード
dmpdt[14] = I2C_BRD(sadr,14) ; // REG0 リード
dmpdt[15] = I2C_BRD(sadr,15) ; // REG0 リード
dmpdt[16] = I2C_BRD(sadr,16) ; // REG0 リード
dmpdt[17] = I2C_BRD(sadr,17) ; // REG0 リード
dmpdt[18] = I2C_BRD(sadr,18) ; // REG0 リード 18 : 0x12
dmpdt[19] = I2C_BRD(sadr,19) ; // REG0 リード 19 : 0x13
dmpdt[20] = I2C_BRD(sadr,20) ; // REG0 リード 20 : 0x14
dmpdt[21] = I2C_BRD(sadr,21) ; // REG0 リード 21 : 0x15
}


0 件のコメント:
コメントを投稿