2016年

3月

19日

Arduino iPhone Ethernet シールド 2Lチカ

ArduinoにEthernet シールドを取り付けてiPhoneでLED(緑色、赤色)2個の Lチカをしてみました。

Arduinoのサイトによれば、デジタルI/Oピンの11、12、13番ピンはSPI通信に使われているようなので、それらのピンにはセンサなどを接続しないことにします。

今回は、Arduino 0012に含まれている「Web Server」というサンプル(File>Sketchbook>Examples>Library-Ethernet>Web Server)を参考にブラウザで閲覧可能なWebベージをアクセスさせます。
基本的な入力情報として、

・MACアドレス
・サーバのIPアドレス
・ポート番号

が必要となります。尚、ローカルネットワーク内から閲覧できる設定にします。

iOS Swift iLampSwift01

 

//  ethernetLED03

//  GND PIN

//  LEDライト用PIN番号

//  int ledPin02 = 2;

//  int ledPin03 = 3;

 

import UIKit

 

class ViewController: UIViewController {

 

    @IBOutlet weak var myWebView: UIWebView!

    

    override func viewDidLoad() {

        

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        

    }

 

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

 

    @IBAction func switchPressed01(sender: UISwitch) {

        if sender.on {            

            // turn the LED on

            // URLを設定する.

            let url = NSURL( string: "http://192.168.1.5/$1" )

            // リクエストを作成する.

            let req = NSURLRequest(URL: url!)

            // リクエストを実行する.

            myWebView.loadRequest(req)

            

        } else {

            

            // turn the LED off

            // URLを設定する.

            let url = NSURL( string: "http://192.168.1.5/$2" )

            // リクエストを作成する.

            let req = NSURLRequest(URL: url!)

            // リクエストを実行する.

            myWebView.loadRequest(req)

        }

    }

    @IBAction func switchPressed02(sender: UISwitch) {

        if sender.on {

            

            // turn the LED on

            // URLを設定する.

            let url = NSURL( string: "http://192.168.1.5/$3" )

            // リクエストを作成する.

            let req = NSURLRequest(URL: url!)

            // リクエストを実行する.

            myWebView.loadRequest(req)

            

        } else {

            

            // turn the LED off

            // URLを設定する.

            let url = NSURL( string: "http://192.168.1.5/$4" )

            // リクエストを作成する.

            let req = NSURLRequest(URL: url!)

            // リクエストを実行する.

            myWebView.loadRequest(req)

        }

    }

}

 

Arduinoスケッチ ethernetLED03

// iOS iLampSwift03
// イーサネットライブラリを読み込み
#include <SPI.h>
#include <Ethernet.h>

// スイッチでLEDのオンオフ trueかfalse
// 初期値「0」
boolean incoming = 0;

// Arduino Ethernet ShieldのMACアドレスをセット
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };

// サーバーとなるArduinoのIPアドレス
IPAddress ip(192,168,1,5);

// HTTP通信をするのでサーバーのポートは80でセット
EthernetServer server(80);

// GND PIN
// LEDライト用PIN番号
int ledPin02 = 2;
int ledPin03 = 3;

void setup()
{
  pinMode(ledPin02, OUTPUT);
  pinMode(ledPin03, OUTPUT);

  // LEDの明かりは初期状態では切っておく
  digitalWrite(ledPin02, LOW);
  digitalWrite(ledPin03, LOW);

  //イーサネット通信開始
  Ethernet.begin(mac, ip);
  
  //サーバ開始
  server.begin();
  
  // デバッグログ用
  Serial.begin(9600);
}

void loop()
{
  
  // クライアントからのデータ受信
  EthernetClient client = server.available();
  
  // クライアントからの受信がある場合
  if (client) {
    
    // ブラウザからのHTTPリクエストの空白行の有無のフラグ
    boolean currentLineIsBlank = true;
    
    // クライアントとの接続中の処理
    while (client.connected()) {
      
      // 接続状態だったら
      if (client.available()) {
        
        // HTTPリクエスト(受信データ)を一つずつ読み込む
        char c = client.read();

        /*
         * 行の最後に得ている場合(改行文字を受け取った)およびラインは、
         * httpリクエストが終了した空白ですので、
         * あなたは応答を送信することができます
        */

        // URL文字列を読み込みデータが「incoming:初期値「0」」そして「c」が' '空白だとincoming に「0」を代入
        if(incoming && c == ' '){ 
          incoming = 0;
        }

        // URL文字列を読み込みCが'#39;だとincoming に「1」を代入
        if(c == '$'){ 
          incoming = 1; // LED ON
        }
        
        // URL文字列をチェックします$1、$2 「incoming:true」
        if(incoming == 1){

          // シリアルポートデータ
          Serial.println(c);
          
          if(c == '1'){
            Serial.println("ON");
            // LEDの明かりを入れる
            digitalWrite(ledPin02, HIGH);
          }
          if(c == '2'){
            Serial.println("OFF");
            // LEDの明かりを切る
            digitalWrite(ledPin02, LOW);
          }

          if(c == '3'){
            Serial.println("ON");
            // LEDの明かりを入れる
            digitalWrite(ledPin03, HIGH);
          }
          if(c == '4'){
            Serial.println("OFF");
            // LEDの明かりを切る
            digitalWrite(ledPin03, LOW);
          }
        }

        ////////////////////////////////////////
        // ArduinoをWebサーバにして "Hello, world!" と表示させる
        // https://www.qoosky.net/techs/99
        // 改行コードが2連続で出力されるまで、すなわち
        // 空行が返ってくるまで、言い換えると
        // クライアントからのGETリクエストが終了するまで読み飛ばす
        
        if (c == '1') {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("");
            client.println("<html><head><title>Arduino World</title></head>");
            client.println("<body>Hello, world!</body></html>");
            break;
        }
        
        ////////////////////////////////////////

        // 読み込んだ文字がラインフィードの場合
        if (c == '\n') {
          //現在の行を空白行とみなす
          currentLineIsBlank = true;
        } 
        else if (c != '\r') { // 読み込んだ文字がキャリッジリターン以外の場合
          // 現在の行を空白行としない
          currentLineIsBlank = false;
        }
        
      }
    }
    
    // サーバーがコネクションを早く閉じ過ぎる為、
    // プロトコル違反を報告、ここでdelay(1)を入れておく
    delay(1);
    client.stop();
  }
}

 

目 次