// TCPサーバ(Webサーバ)の例 // // Webアクセスで、照度センサの値と RGB LEDの値を表示する。 // また、ブラウザからの指示でRGB LEDの明るさを変更できる。 // // 2010/11/01 ver1.0 H.Inoue, HCU // #include // LCD用 #include // IDE19 or up #include // Ethernetシールド LiquidCrystal lcd(15, 2, 4, 7, 8, 9); // rs, enable, d4, d5, d6, d7 // パラメータ #define LIGHT_PORT 0 // 照度センサの入力ポート(SW入力と共有) #define LIGHT_COEF 0.35 // 1ルクスあたりのmV #define LED_R 3 // 赤LEDのポート #define LED_G 5 // 緑LEDのポート #define LED_B 6 // 青LEDのポート #define LOOP_DELAY 100 // 全体のループの待ち時間 (ms) // LAN関係のパラメータ byte mac[] = { 0x00, 0x50, 0xC2, 0x97, 0x22, 0xCD }; // MACアドレス(要変更) byte ip[] = { 192, 168, 0, 177 }; // 自分のIPアドレス byte subnet[] = {255, 255, 255, 0}; // サブネットマスク byte gateway[] = {192, 168, 0, 1}; // デフォルトゲートウェイ #define SERVER_PORT 80 // サーバのTCPポート番号(80=Web) // サーバの設定 Server server(SERVER_PORT); // グローバル変数 float light; // 照度センサの値(ルクス) int led_r, led_g, led_b; // RGB LEDの値 // 初期化 void setup() { // 入出力ポートの初期化 pinMode(LIGHT_PORT, INPUT); pinMode(LED_R, OUTPUT); pinMode(LED_G, OUTPUT); pinMode(LED_B, OUTPUT); // LCDの初期化 lcd.begin(20, 4); lcd.clear(); set_led(); // LEDの値をLCDに表示 // シリアルポートの初期化 Serial.begin(9600); // イーサネットLANの初期化 Ethernet.begin(mac, ip, gateway, subnet); // Webサーバを起動する server.begin(); } // メイン繰り返し処理部 void loop() { float volt; // 読み取った電圧 int duty; // LED明るさ計算値 // センサから読み取り volt = (float)analogRead(LIGHT_PORT) * (5.0 / 1024.0); light = volt / LIGHT_COEF * 1000; duty = light / 5000 * 255; // LCDに数値として表示 lcd_clear1line(0); // 1行目 lcd.print("Volt = "); lcd.print(volt); lcd.print("V"); lcd_clear1line(1); // 2行目 lcd.print("Light= "); lcd.print(light); lcd.print("Lux"); // クライアントからの接続を確認して、アクセスがあれば処理する Client client = server.available(); if (client) { http_service(client); } // ループの待ち delay(LOOP_DELAY); } // LCDの特定の行だけを消す(カーソルは先頭に) void lcd_clear1line(int line) { lcd.setCursor(0, line); lcd.print(" "); lcd.setCursor(0, line); } // RGB LEDの制御 void set_led() { // LEDに出力 analogWrite(LED_R, led_r); analogWrite(LED_G, led_g); analogWrite(LED_B, led_b); // LCDに表示 lcd_clear1line(2); // 3行目 lcd.print("R="); lcd.print(led_r); lcd.print(" G="); lcd.print(led_g); lcd.print(" B="); lcd.print(led_b); } // Webサーバ処理のメイン void http_service(Client client) { #define HTTPREQUEST_MAXLEN 50 String rstr = ""; // HTTP要求の文字列 String method, uri; // HTTP要求の1行目 // HTTP要求の最後を空行で検出 boolean current_line_is_blank = true; while (client.connected()) { if (client.available()) { char c = client.read(); // HTTP要求の最初の数十バイトを保存しておく if (rstr.length() < HTTPREQUEST_MAXLEN) { rstr += c; } if (c == '\n' && current_line_is_blank) { // 空行を検出、つまりHTTPヘッダの終わり // 最初の行からMETHODとURLを取り出す int pos, pos2; pos = rstr.indexOf(' '); method = rstr.substring(0, pos); pos2 = rstr.indexOf(' ', pos + 1); uri = rstr.substring(pos + 1, pos2); // 状態をLCDに表示 lcd_clear1line(3); // 4行目 lcd.print(uri); // HTTPの応答ヘッダを送る client.println("HTTP/1.0 200 OK"); client.println("Content-Type: text/html"); client.println(); // 空行 // URIを解析して、LEDの制御などを行う http_parse(uri); // HTTPの本文を送る http_data(client); break; } if (c == '\n') { // \n = LF current_line_is_blank = true; } else if (c != '\r') { // \r = CR current_line_is_blank = false; } } } // 接続を切る client.stop(); } // URIを解析して、指示に従う // 例: /index.html?r=100&g=200&b=50 void http_parse(String uri) { int pos; char param[5]; pos = uri.indexOf('?'); while (pos >= 0) { uri = uri.substring(pos + 1); if (uri.startsWith("r=")) { uri.substring(2).toCharArray(param, sizeof(param)); led_r = atoi(param); } if (uri.startsWith("g=")) { uri.substring(2).toCharArray(param, sizeof(param)); led_g = atoi(param); } if (uri.startsWith("b=")) { uri.substring(2).toCharArray(param, sizeof(param)); led_b = atoi(param); } set_led(); // LEDの値を表示 pos = uri.indexOf('&'); // 次のパラメータへ } } // HTMLデータを送る void http_data(Client client) { // HTMLの最初、title client.println(""); client.println(""); client.println(""); client.print(""); client.print("Arduino Web Server Test1"); client.println(""); client.println(""); client.println(""); // 照度センサの値を表示 client.println("

センサ情報の表示

"); client.print("light = "); client.print(light); client.println("
"); // RGB LEDの値の設定画面 client.println("

RGB LEDの制御

"); client.println("
"); client.print("R:"); client.print("G:"); client.print("B:"); client.println("
"); client.println("
"); // HTMLの最後 client.println(""); client.println(""); }