Document

ようこそテクノおじさんホームページへ!(2024年4月1日号)

  4月度訪問者カウンター

  2022年度2023年度旧アイテム

旧アイテム(1月 2月 3月)は過去ログ倉庫を参照ください。202201_1 202201_2 202202_1
旧アイテム(4月 5月 6月)は過去ログ倉庫を参照ください。202204_1 202205_1 202206_1
旧アイテム(7月 8月 9月)は過去ログ倉庫を参照ください。202207_1 202208_1 202209_1
旧アイテム(10月 11月 12月)は過去ログ倉庫を参照ください。202210_1 202211_1 202212_1
旧アイテム(2023年1月 2月 3月)は過去ログ倉庫を参照ください。202301_1 202302_1 202303_1
旧アイテム(2023年4月 5月 6月)は過去ログ倉庫を参照ください。202304_1 202305_1 202306_1
旧アイテム(2023年7月 8月 9月)は過去ログ倉庫を参照ください。202307_1 202308_1 202309_1
旧アイテム(2023年10月 11月 12月)は過去ログ倉庫を参照ください。202310_1 202311_1 202312_1
旧アイテム(2024年1月 2月 3月)は過去ログ倉庫を参照ください。202401_1 202402_1202403_1


2024年ももう4月です。桜が咲きました。また日本の株が高値を更新しました。しかし政治の世界には情けない思いで一杯です。

どうして政治家はあのように平気でうそがつけるのでしょうか。自民党の政治も岐路に立っていると思わないといけないです。

民主党が政権を取ってとんでもない政治を行ったことをことを思い出さないといけません。

野党(中には自民党でも)には堂々とロシア、北朝鮮、中国になびく人がいるのです。自民党の先生方目覚めてください。



2024年4月度の記事

    (1)東北新幹線郡山駅での列車オーバーラン発生

    500メートル通り越して止まりました。この駅では同様のオーバーランが昨年にも発生しています。

    以下読売新聞の記事です。

    「JR東日本は3月19日、ブレーキをかけ始めてから約7キロにわたって、車輪が回転しながら滑っていく「滑走」が

    断続的に起きていたと発表した。JR東によると、停止位置の約6・5キロ手前で自動列車制御装置(ATC)が作動したが

    十分に減速せず、運転士が手動で非常ブレーキをかけた。ホーム約250メートル手前の線路を切り替えるポイントでは

    制限速度(時速80キロ)を大幅に上回る約145キロで通過したという。」

    つばさ121号は朝7時30分ごろ郡山に到着する車両で雪と低温の影響を受けやすい時間です。

    つばさ121号はL編成:E3系 7両(5M2T)編成 パンタグラフは2個。他の車両ではE2系またはE5系を併結して運転しているのもあります。

    併結している場合では不具合は起きていません。2022年12月18日にも「つばさ159号」が停止位置を行き過ぎて停車する事象を起こしているので

    このE3系車両単独編成に問題がありそうです。

    今回はブレーキ動作中に一定程度滑走を継続した場合、回生ブレーキ力を完全にゼロとする対策が正常に機能していたそうです。

    これは車輪が滑走した場合に回生制動を一時的にオフにする制御が働いたということです。この期間は車両はノーブレキ状態です。

    自動車でのアンチスキッドブレーキシステム(ABS)に相当します。しかし自動車のABSほど反応は速くはありません。

    以前に名鉄岐阜駅でも回生ブレーキが失効し車止めに追突したことがありました。回生ブレーキの効果は大きいのです。

    自動車のABS技術を新幹線車両にも採用すればこのような問題は防げますがコスト的に無理でしょう。

    ひとつの対策としてレールに強力な電磁石を近づけて渦電流を発生しブレーキ力を得る方法なら採用可能かもしれません。

    (2)民間ロケット開発会社スペースワンのカイロスロケット打ち上げ失敗

    3月13日にカイロスロケットの打ち上げが失敗しました。

    中継もずさんなもので状況がどうなっているのか一切わかりませんでした。

    特に一回目の延期について理由の説明がありません。JAXSAのような用意周到なものではありませんでした。

    失敗後の会見で思ったことです。会見に臨んだ責任者の年齢の高さ。

    イーロンマスクのような人が出てくると思いきや官製ベンチャー会社によくみられる

    天下り式に着任した人らしき人が答えていました。質疑応答も歯切れの悪さが否めません。

    ベンチャーなんだから「一回の失敗は想定のうち」とでも堂々と言ってほしかったです。

    若い人は頑張っている筈。今後の活躍に期待します。「イカロス」のように「カイロス」は太陽まで飛んで行け!
    (3)EVの現状課題を誰もが認識し始めた

    欧州、米国、中国などは脱酸素対策の切り札はEVだとしてエンジン車の生産を制限すると過激な方針を立ててきました。

    しかしここにきてこの方針を見直しています。当然だと思います。為政者はEVの実力を知らずに無茶な方針を立てました。

    ところがこの冬各国でEVの問題が噴出しました。充電が制限される、航続距離が伸びない、電池火災が頻発する、

    電池寿命が短い、電池交換費用が高すぎる、中古車価格が低すぎるなど です。これらは最初から分かっていたことです。

    中国のEV輸出がトヨタの輸出を超えたと話題になっていました。中国が安かろう、悪かろう、危険だろうのEVを

    輸出しまくった帰結です。BYDはもともと自動車製造企業ではありません。ノウハウが全くないそんな企業が世界に

    通用する車ができるとは思えません。中国各地ではEVの墓場ができています。またドイツのEVを運送中の船舶がEVの

    火災で沈没しました。ようやく人々はEVというものを認識し始めました。

    イギリスはトヨタHVを封じ込めるためにEV導入方針を出しましたが見事に失敗しました。

    トヨタHVは爆売れ中らしいです。
    (4)ちょっと解せない日産、ホンダの提携

    新聞やテレビではEVの開発に向けての提携ではないかと言っています。私はそうは思いません。

    ホンダも日産もハイブリッド車を生産しているくらいですからEVの開発力はもう備わっていると思います。

    課題はいかにしてコストを低減するかにあると思われます。それは電動化に必要な部品です。

    すなわち電池、電動パワプラント、制御コンピュータおよびそれらをコントロールするソフトウェアです。

    トヨタHVの強みはソフトウェアの完成度にあると思います。開発には膨大なコストがかかっています。

    ホンダと日産はタッグを組むことで開発費を如何に低減したいかではないかと思います。

    でも社風の異なる2社ですからスムーズに事が運ぶとは思えません。
    (5)3月21日に名鉄空港線が設備故障で止まりました

    場所は空港駅と知多半島を結ぶ海上橋梁です。以前にもほぼ同じ位置で電車が止まりました。

    原因は強風のため架線に不具合が発生したためです。パンタグラフが破損しました。

    今回の事故では名鉄は設備故障としか発表していません。

    しかし前日から強風が吹いていたので今回のトラブルも同様の可能性があります。

    パンタグラフが激しく破損し車体のガラス窓も割れています。

    事故現場は海上であり北西の強い風が吹くところです。

    またしてもこの強風により架線(のハンガー)が外れてそこに特急電車のパンタグラフと衝突したのが原因と思われます。

    この場所では強風に備え架線の横方向の動きを規制するような対策が必要とおもわれます。

    例えば地下鉄で採用されている剛体架線を橋の上にだけ採用するとか。

    ただし剛体架線は重いので追加工事はかなり大掛かりになるでしょう。

    あるいは強風を防止する「風よけ」の設置です。

    従来のままの状態を復元しても再発は必至です。エンジニアリングの世界では「2度あることは3度ある」が常識です。

    名鉄さん頑張ってください。
    (6)小林製薬の「紅麹被害」について

    死者が5名も出ています。大きな問題になってきました。小林製薬が倒産の危機にあります。

    最近の報道ではアオカビの毒素が混入しているとされています。

    紅麹菌の培養は速度を上げるためにほかの麹菌と合わせて培養するそうです。

    味噌や醤油は安全であるということにはあまり疑問を持ちません。しかし欧州は酵母発酵時に毒素を発生する

    可能性が有るということで輸入を禁止しているらしいです。私たちが今口にしている発酵食品は長い歴史を

    通して安全性が保たれた製造方法で作られているのでしょう。

    やはり菌類が出す生産物には「毒にも薬にもなる代物」ということでしょうか。

    ところで私が今食べているものに紅麹が使われているか調べてみました。ありました。

    エビ煎餅とかき餅です。やはり身近なところにもあるのだなと思いました。

    でも赤色に着色しているものは食べずに捨てました。

--------------------------------------------------------------------------------

今月の技術Tips



 
(1)スマホでAruduinoをコントロールする

たとえばスマホでArduinoをコントロールしスイッチのオンオフをしたい場合があるとします。
このときのスケッチの作り方を解説します。これを応用すれば遠隔地からライトを点灯したり
野菜栽培ハウスの水やりなどができるようになります。
少し難しいかもしれませんが興味のある方はご一読ください。

①基本的な考え方
・スマホからLAN機能を持つArduinoにhttp://192.168.*.*のようにアクセスできるようにする。
・スマホにコントロールする機能ボタンを配置する。
ex. ボタン、スクロールバー、数値入力 など

②Arduinoの要件
・LAN通信機能(ハードウェア)
・Webサーバー機能(PCで動くApacheのようなもの)

③機能ボタンに応じたファンクションを記述する(ex. LEDのオンオフ)
クライアントが指定した選択科目の情報を分析しArduinoの機能をコントロールする。

平峯さんの記事を使わせていただきました。
—-----------------------------------------------------------------------------------------------------------------------

全体のプログラムコードです。

// ethernet_ledonoff.ino
//
// Webサーバーにする(Ethernetシールド使用)// 
// Last modified : 2011/12/03

#include <SPI.h>		// for Ethernet.h
#include <Ethernet.h>	// for Ethernet
#define LED1PIN	 7
#define LED2PIN	 8
#define LED3PIN	 9


#define LINEBUFFERSIZE	(128)
#define DELIMITER	("&")

unsigned char MACADDRESS[] = { 0xDD, 0x7B, 0x7E, 0xE5, 0x1C, 0x5C };
unsigned char IPADDRESS[] = { 192, 168, 100, 50 };
EthernetServer g_server(80);


—------------------------------------------------------------------------------------------------------------------------
void setup()
{
	Serial.begin(9600);
	Ethernet.init(10);  // Most Arduino shields
	Ethernet.begin(MACADDRESS, IPADDRESS);
	g_server.begin();
	pinMode(LED1PIN, OUTPUT);
	pinMode(LED2PIN, OUTPUT);
	pinMode(LED3PIN, OUTPUT);
   
	Serial.begin(9600);
}

—---------------------------------------------------------------------------------------------------------------

// HTML出力  HTML(192.168.100.50)に書き込む 
void PrintHtml( EthernetClient& client, boolean led1, boolean led2, boolean led3, boolean led4,boolean led5,int speed )
{   //Changed For CH ADD

	
	client.println("HTTP/1.1 200 OK");
	client.println("Content-Type: text/html");
	client.println();

	client.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
	client.println("<html lang=\"ja\">");
	//ここからhead部分
	client.println("<head>");
	client.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
	client.println("<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">");
	client.println("<title></title>");
	client.println("</head>");
//head部分の終わり

//ここからbody部分
	client.println("<body>");

	client.println("<p>");
	client.print("LED1 : "); client.print( led1 ? "ON" : "off" ); client.println("<br>");  //3項演算子 A ? B : C Aがtrueの場合はBを実行する Aがfalseの場合はCを実行する 
	client.print("LED2 : "); client.print( led2 ? "ON" : "off" ); client.println("<br>");
	client.print("LED3 : "); client.print( led3 ? "ON" : "off" ); client.println("<br>");
    client.println("<br>");
	client.println("速さ:");
	client.println(speed);
	client.println("</p>");

	client.println("<hr>");

	client.println("<form method=\"post\" action=\"\">");
	client.print("<input type=\"checkbox\" name=\"led1\" value=\"1\""); if(led1){ client.print(" checked"); } client.println(">LED1<br>");
	client.print("<input type=\"checkbox\" name=\"led2\" value=\"1\""); if(led2){ client.print(" checked"); } client.println(">LED2<br>");
	client.print("<input type=\"checkbox\" name=\"led3\" value=\"1\""); if(led3){ client.print(" checked"); } client.println(">LED3<br>");
	
	client.println("<br>");

  //ここからラジオボタンの記述
	client.println("速さ<br>");
	client.println("1 ");
 

	client.print("<input type=\"radio\" name=\"speed\" value=\"1\""); if(1==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"2\""); if(2==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"3\""); if(3==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"4\""); if(4==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"5\""); if(5==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"6\""); if(6==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"7\""); if(7==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"8\""); if(8==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"9\""); if(9==speed){ client.print(" checked"); } client.println("> ");
	client.println(" 10<br>");
 //ラジオボタンの記述終了
 
	client.println("<br>");
 
 //  サブミットボタンの記述
 
	client.println("<input type=\"submit\" value=\"送信\">");
	client.println("<input type=\"reset\" value=\"リセット\"></form>");
	client.println("<hr>");
	
	client.println("</body>");
	client.println("</html>");
}

—------------------------------------------------------------------------------------------------------------------------

//受信したストリングの解析

boolean AnalyzeLineString( char* pszLine, boolean& rbLed1, boolean& rbLed2, boolean& rbLed3,boolean& rbLed4,boolean& rbLed5, int& riSpeed )
{   //Changed For CH ADD
	char* pszToken = strtok(pszLine, DELIMITER);
	while(pszToken)
	{
		if( 6 == strlen(pszToken)
		 && 0 == strncmp(pszToken, "led", 3) )
		{	// led?=1
			if(      '1' == pszToken[3] ){ rbLed1 = true; }
			else if( '2' == pszToken[3] ){ rbLed2 = true; }
			else if( '3' == pszToken[3] ){ rbLed3 = true; }
      else if( '4' == pszToken[3] ){ rbLed4 = true; }  //Add New
      else if( '5' == pszToken[3] ){ rbLed5 = true; }   //Add New
		}
		else if( 7 == strlen(pszToken)
		 && 0 == strncmp(pszToken, "speed", 5) )
		{	// speed=?
			riSpeed = pszToken[6] - '0';
		}
		pszToken = strtok(NULL, DELIMITER);
	}
	return true;
}

// clientからの情報を返す 読み込み

boolean readHttpRequest( EthernetClient& client, boolean& rbLed1, boolean& rbLed2, boolean& rbLed3, boolean& rbLed4,boolean& rbLed5,int& riSpeed )
{   //Changed For CH ADD
	if( !client )
	{
		return false;
	}

	// HTTPリクエスト空行(\r\n\r\n)で終わる。ので、空行を探す。

	boolean foundRNRN = false;
	boolean currentLineIsBlank = true;
	char szLine[LINEBUFFERSIZE];
	int iIndex = 0;
  int n;
  int j;
  int k;
  char c;
  String str;
  String line[1024];
  
	while( client.connected() )
	{
		if( !client.available() )
		{
			//continue;
			break;
		}
		
c= client.read();
	
//	Serial.print(c);   //for Debug

	////Test Print
 // str=client .readStringUntil('\n');
 //Serial.println(str);


  //test--------------------------------------------------------------------------------------------------------------------
  
		
		
		
		
		if( '\n' == c && currentLineIsBlank )
		{	// 空行発見。
			foundRNRN = true;
		}
		if( '\n' == c )
		{
			// httpリクエストの1行の解析
			if( foundRNRN
			 && 0 != iIndex )
			{
				szLine[iIndex] = '\0';
				AnalyzeLineString( szLine, rbLed1, rbLed2, rbLed3,riSpeed );   //Changed For CH ADD
			}
			// 新しい行の始まり。
			currentLineIsBlank = true;
			iIndex = 0;
		}
		else if( '\r' != c )
		{	// この行は空行ではなかった。
			currentLineIsBlank = false;
			if( foundRNRN )
			{
				if( LINEBUFFERSIZE - 1 > iIndex )
				{
					szLine[iIndex] = c;
					++iIndex;
				}
		//// Serial.println(szLine);  //<<<<この位置でszLineを解析すると良い>>>>>>>>>
		}
  
		}
  
	}

 Serial.println(szLine);   //<<<<この位置でszLineを解析すると良い>>>>>>>>>
	// httpリクエストの終端行の解析
	if( foundRNRN
	 && 0 != iIndex )
	{
		szLine[iIndex] = '\0';
		AnalyzeLineString( szLine, rbLed1, rbLed2, rbLed3, rbLed4,rbLed5,riSpeed );   //Changed For CH ADD
	}
	
	
  //Serial.println(szLine);
 
	return foundRNRN;
}
//////////////////////////// main Loop ////////////////////--------------------------------------------------------------------------------------------------------------
void loop()
{
	static boolean s_led1 = false;
	static boolean s_led2 = false;
	static boolean s_led3 = false;
  
  
	static int s_interval = 0;
	
	EthernetClient client = g_server.available();
	boolean led1 = false;
	boolean led2 = false;
	boolean led3 = false;
  
 
	int speed = 5;
 if( readHttpRequest(client, led1, led2, led3, led4,led5,speed) )     //Request read  //Changed For CH ADD//
   {
		// Html出力
 		PrintHtml(client, led1, led2, led3, led4,led5,speed);  //Changed For CH ADD

		// Webブラウザに対して、データを取得するための時間を与える。
 		delay(1);
		
		// コネクションを閉じる。
 	client.stop();

 	s_led1 = led1;
 	s_led2 = led2;
 	s_led3 = led3;
  s_led4 = led4;  //ADD New
  s_led5 = led5;  //ADD New
  
   
		// speed        |   1         9
		// 間隔[秒]     |   0.5       0.01
		// interval[ms] | 500        10
 		s_interval = (int)(500L + (speed - 1) * (10L - 500L) / (9-1));
 	}

	if( s_led1 ){ digitalWrite(LED1PIN, HIGH); }
	if( s_led2 ){ digitalWrite(LED2PIN, HIGH); }
	if( s_led3 ){ digitalWrite(LED3PIN, HIGH); }
    delay(s_interval);     
	
	digitalWrite(LED1PIN, LOW);
	digitalWrite(LED2PIN, LOW);
	digitalWrite(LED3PIN, LOW);

	delay(s_interval);
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

それでは区分けして説明します。下の写真はArduinoとイーサーネットシールドです。
      写真
        Arduinoとイーサーネットシールド
まず初期設定部です。
イーサーネットシールドを使ってWebサーバー化するためのヘッダーファイルなどを規定します。
 
// ethernet_ledonoff.ino
//
// Webサーバーにする(Ethernetシールド使用)// 
//
#include <SPI.h>		// for イーサーネットシールドはSPIバスでコントロール
#include <Ethernet.h>	// for Ethernet イーサーネットを使うためのヘッダファイル
#define LED1PIN	 7          //LEDをArduinoの7,8,9ピンに接続
#define LED2PIN	 8
#define LED3PIN	 9

#define LINEBUFFERSIZE	(128)
#define DELIMITER	("&")     //Submitボタンを押したときに送られる伝文のデリミターは &です

unsigned char MACADDRESS[] = { 0xDD, 0x7B, 0x7E, 0xE5, 0x1C, 0x5C };    //ArduinoイーサーネットシールドのMACアドレス
unsigned char IPADDRESS[] = { 192, 168, 100, 50 };                      //ArduinoイーサーネットシールドのIPアドレス
EthernetServer g_server(80);


//

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

次はセットアップ記述です。
ここではシリアル通信、イーサーネット通信の初期化を行います。
 
------------------------------------------------------------------------------------------------------------------------
void setup()
{
	Serial.begin(9600);
	Ethernet.init(10);  // Most Arduino shields ほとんどのシールドは10番ピンを使います
	Ethernet.begin(MACADDRESS, IPADDRESS);  //イーサネットを立ち上げます
	g_server.begin();                       //Webサーバーを立ち上げます
	pinMode(LED1PIN, OUTPUT);               //各LEDピンの動作モードをOutputに設定します
	pinMode(LED2PIN, OUTPUT);
	pinMode(LED3PIN, OUTPUT);
   
 }
—---------------------------------------------------------------------------------------------------------------
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

次はPCやスマホからのクライアントの画面(ブラウザー)に表示する部分の記述です。
WebサーバーであるApachのhddocsに格納するHTMLファイルに相当するものです。
 
 // HTML出力  HTML(192.168.100.50)に書き込む 
void PrintHtml( EthernetClient& client, boolean led1, boolean led2, boolean led3,int speed )
{   //Changed For CH ADD

	
	client.println("HTTP/1.1 200 OK");
	client.println("Content-Type: text/html");
	client.println();

	client.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");
	client.println("<html lang=\"ja\">");
	//ここからhead部分
	client.println("<head>");
	client.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
	client.println("<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">");
	client.println("<title></title>");
	client.println("</head>");
//head部分の終わり

//ここからbody部分
	client.println("<body>");

	client.println("<p>");
	client.print("LED1 : "); client.print( led1 ? "ON" : "off" ); client.println("<br>");  //3項演算子 A ? B : C Aがtrueの場合はBを実行する Aがfalseの場合はCを実行する 
	client.print("LED2 : "); client.print( led2 ? "ON" : "off" ); client.println("<br>");
	client.print("LED3 : "); client.print( led3 ? "ON" : "off" ); client.println("<br>");
 
	client.println("<br>");
	client.println("速さ:");
	client.println(speed);
	client.println("</p>");

	client.println("<hr>");

	client.println("<form method=\"post\" action=\"\">");
	client.print("<input type=\"checkbox\" name=\"led1\" value=\"1\""); if(led1){ client.print(" checked"); } client.println(">LED1<br>");
	client.print("<input type=\"checkbox\" name=\"led2\" value=\"1\""); if(led2){ client.print(" checked"); } client.println(">LED2<br>");
	client.print("<input type=\"checkbox\" name=\"led3\" value=\"1\""); if(led3){ client.print(" checked"); } client.println(">LED3<br>");
	
	
	client.println("<br>");

  //ここからラジオボタンの記述
	client.println("速さ<br>");
	client.println("1 ");
 

	client.print("<input type=\"radio\" name=\"speed\" value=\"1\""); if(1==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"2\""); if(2==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"3\""); if(3==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"4\""); if(4==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"5\""); if(5==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"6\""); if(6==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"7\""); if(7==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"8\""); if(8==speed){ client.print(" checked"); } client.println("> ");
	client.print("<input type=\"radio\" name=\"speed\" value=\"9\""); if(9==speed){ client.print(" checked"); } client.println("> ");
	client.println(" 10<br>");
 //ラジオボタンの記述終了
 
	client.println("<br>");
 
 //  サブミットボタンの記述
 
	client.println("<input type=\"submit\" value=\"送信\">");
	client.println("<input type=\"reset\" value=\"リセット\"></form>");
	client.println("<hr>");
	
	client.println("</body>");
	client.println("</html>");
}


 

これが実行されると次の様な画面がクライアントのブラウザーに表示されます。
      写真
         表示画面
次はブラウザーからsendボタンが押されたときにブラウザーからArduinoに送られるストリングを解析する部分です
sendボタンが押されると一連の情報が送られますがその中に一行のブランク行が送られその後に続いて
選択されたLED情報とスピード情報が”&”文字で区切られて出力されます。プログラムはブランク行の
検出と”&”文字で区切られて出力された行の解析を行いLED番号とスピードレベルを読みます。
 
 //受信したストリングの解析

boolean AnalyzeLineString( char* pszLine, boolean& rbLed1, boolean& rbLed2, boolean& rbLed3,boolean& rbLed4,boolean& rbLed5, int& riSpeed )
{   //Changed For CH ADD
	char* pszToken = strtok(pszLine, DELIMITER);
	while(pszToken)
	{
		if( 6 == strlen(pszToken)
		 && 0 == strncmp(pszToken, "led", 3) )
		{	// led?=1
			if(      '1' == pszToken[3] ){ rbLed1 = true; }
			else if( '2' == pszToken[3] ){ rbLed2 = true; }
			else if( '3' == pszToken[3] ){ rbLed3 = true; }
      else if( '4' == pszToken[3] ){ rbLed4 = true; }  //Add New
      else if( '5' == pszToken[3] ){ rbLed5 = true; }   //Add New
		}
		else if( 7 == strlen(pszToken)
		 && 0 == strncmp(pszToken, "speed", 5) )
		{	// speed=?
			riSpeed = pszToken[6] - '0';
		}
		pszToken = strtok(NULL, DELIMITER);
	}
	return true;
}

// clientからの情報を返す 読み込み

boolean readHttpRequest( EthernetClient& client, boolean& rbLed1, boolean& rbLed2, boolean& rbLed3, boolean& rbLed4,boolean& rbLed5,int& riSpeed )
{   //Changed For CH ADD
	if( !client )
	{
		return false;
	}

	// HTTPリクエスト空行(\r\n\r\n)で終わる。ので、空行を探す。

	boolean foundRNRN = false;
	boolean currentLineIsBlank = true;
	char szLine[LINEBUFFERSIZE];
	int iIndex = 0;
  int n;
  int j;
  int k;
  char c;
  String str;
  String line[1024];
  
	while( client.connected() )
	{
		if( !client.available() )
		{
			//continue;
			break;
		}
		
c= client.read();
	
//	Serial.print(c);   //for Debug

	////Test Print
 // str=client .readStringUntil('\n');
 //Serial.println(str);


  //test--------------------------------------------------------------------------------------------------------------------
  
		
		
		
		
		if( '\n' == c && currentLineIsBlank )
		{	// 空行発見。
			foundRNRN = true;
		}
		if( '\n' == c )
		{
			// httpリクエストの1行の解析
			if( foundRNRN
			 && 0 != iIndex )
			{
				szLine[iIndex] = '\0';
				AnalyzeLineString( szLine, rbLed1, rbLed2, rbLed3,rbLed4,rbLed5, riSpeed );   //Changed For CH ADD
			}
			// 新しい行の始まり。
			currentLineIsBlank = true;
			iIndex = 0;
		}
		else if( '\r' != c )
		{	// この行は空行ではなかった。
			currentLineIsBlank = false;
			if( foundRNRN )
			{
				if( LINEBUFFERSIZE - 1 > iIndex )
				{
					szLine[iIndex] = c;
					++iIndex;
				}
		//// Serial.println(szLine);  //<<<<この位置でszLineを解析すると良い>>>>>>>>>
		}
  
		}
  
	}

 Serial.println(szLine);   //<<<<この位置でszLineを解析すると良い>>>>>>>>>
	// httpリクエストの終端行の解析
	if( foundRNRN
	 && 0 != iIndex )
	{
		szLine[iIndex] = '\0';
		AnalyzeLineString( szLine, rbLed1, rbLed2, rbLed3, rbLed4,rbLed5,riSpeed );   //Changed For CH ADD
	}
	
	
  //Serial.println(szLine);
 
	return foundRNRN;
}
 
  
次の様な状態で送信ボタンが押された時の伝文です
      写真
        写真
 
次はメインループです
 
 
 //////////////////////////// main Loop ////////////////////--------------------------------------------------------------------------------------------------------------
void loop()
{
	static boolean s_led1 = false;
	static boolean s_led2 = false;
	static boolean s_led3 = false;
  
  
	static int s_interval = 0;
	
	EthernetClient client = g_server.available();
	boolean led1 = false;
	boolean led2 = false;
	boolean led3 = false;
  
 
	int speed = 5;
 if( readHttpRequest(client, led1, led2, led3, speed) )     //Request read 
   {
		// Html出力
 		PrintHtml(client, led1, led2, led3, speed);  

		// Webブラウザに対して、データを取得するための時間を与える。
 		delay(1);
		
		// コネクションを閉じる。
 	client.stop();

 	s_led1 = led1;
 	s_led2 = led2;
 	s_led3 = led3;
   
   
		// speed        |   1         9
		// 間隔[秒]     |   0.5       0.01
		// interval[ms] | 500        10
 		s_interval = (int)(500L + (speed - 1) * (10L - 500L) / (9-1));
 	}

	if( s_led1 ){ digitalWrite(LED1PIN, HIGH); }
	if( s_led2 ){ digitalWrite(LED2PIN, HIGH); }
	if( s_led3 ){ digitalWrite(LED3PIN, HIGH); }
    delay(s_interval);     
	
	digitalWrite(LED1PIN, LOW);
	digitalWrite(LED2PIN, LOW);
	digitalWrite(LED3PIN, LOW);

	delay(s_interval);
}
 
 
 
 

メールはこちら