2018年7月24日火曜日

ESP32/arduino:LED調光_明るさをテキストで設定

目的:
ESP32基板のLED(IO2) を PWM で調光し、明るさをテキスト(数値)設定する。

方法:
form の <input>でテキストボックスを使用して数値を入力/送信する。
ESP32で 文字列を取得して 数値(0~255) に変換し、 SigmaDelta の duty に与える。

例:
 
  値(0~255)  を テキストボックスに 入力。
  ON ボタンを押す度に 少しづつ明るく なり、OFF ボタンで消灯。
  LED調光(PWM) からの主な変更箇所をハイライト。
/*
 *    WiFi LED ON/OFF TEST
 *     PWM Control
 *     Duty Input
 */
 
#include <WiFi.h>

const char* ssid = "hogehoge";
const char* password = "hogehogepaswd";

IPAddress ip(192, 168, 1, 32);           // for fixed IP Address
IPAddress gateway(192,168, 1, 1);        //
IPAddress subnet(255, 255, 255, 0);      //
IPAddress DNS(192, 168, 1, 90);          //

WiFiServer server(80);

byte led_brightness = 0 ;

void setup()
{
    Serial.begin(115200);
    pinMode(2, OUTPUT);      // set the LED pin mode
    
    WiFi.config(ip, gateway, subnet, DNS);   // Set fixed IP address
    delay(10);

    // We start by connecting to a WiFi network -----------------------------
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
    
    server.begin();

    // for LED PWM Control ---------------------------------------------------
    sigmaDeltaSetup(0, 312500);    // setup channel 0 with frequency 312500 Hz
    sigmaDeltaAttachPin(2,0);      // attach pin 2 to channel 0
    sigmaDeltaWrite(0, 0);         // initialize channel 0 to off     
}

void loop(){
  WiFiClient client = server.available();     // listen for incoming clients
  int pos ;
  String cmd = "" ;
  
  if (client) {                                               // if you get a client,
    Serial.println("***** Client access start *****");       // print a message out the serial port
    while (client.connected()) {                              // loop while the client's connected
      if (client.available()) {                               // if there's bytes to read from the client,
        String line = client.readStringUntil('\n');           // Get Line data until '\n'
        Serial.print("client:") ;
        Serial.println(line);
        if ((pos= line.indexOf("GET /?led_v")) != -1) {
          pos += 12 ;
          while((line.charAt(pos) >='0') & (line.charAt(pos) <='9')) { 
            cmd += line.charAt(pos++) ;
          }
          pos = cmd.toInt() ;
          if (pos>256) pos = 255 ;
          led_brightness = (byte)pos ;
          Serial.print("led_brightness : ");
          Serial.println(led_brightness) ;
        }
        if (line.indexOf("GET /?on") != -1) {                 // Client request was "GET /?on" 
          if (led_brightness < 80) led_brightness = 80 ;
          else if (led_brightness > 245) led_brightness = 255 ;
          else led_brightness += 10 ;
          Serial.print("led_brightness : ");
          Serial.println(led_brightness);
        }
        if (line.indexOf("GET /?off") != -1) {                // Client request was "GET /?off"
          led_brightness = 0 ;
          Serial.print("led_brightness : ");
          Serial.println(led_brightness);
        }
        sigmaDeltaWrite(0, led_brightness) ;                  // set PWM value to channel#0

        if (line.length() == 1 && line[0] == '\r'){           // end of HTTP request
          send_response(client) ;                             // send response to client
          break;                                              // break while loop
        }
      }
    }
    delay(1);                                        // give the web browser time to receive the data
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
    Serial.println("--------------------------------------------------");
  }
}

// ------------------------------------------------------------------

void send_response(WiFiClient client) {
    // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
    // and a content-type so the client knows what's coming, then a blank line:
    client.println("HTTP/1.1 200 OK");
    client.println("Content-type:text/html");
    client.println();
    // the content of the HTTP response follows the header:
    client.println("<!DOCTYPE html><html lang='ja'><head><meta charset='UTF-8'>" ) ;
    client.println("<style>input.button {margin:8px;width:100px;}" ) ;
    client.println("       input.button2 {margin-left:8px; width:40px;}" ) ;
    client.println("       input.text   {margin-left:8px; width:25px;}" ) ;
    client.println("       div   {font-size:16pt;text-align:center;width:250px;border:solid 4px #93ff93;} " ) ;
    client.println("       </style>" ) ;
    client.println("<title>Color LED Controller</title></head>" ) ;
    client.println("" ) ;
    client.println("<body><div><p>LED ON/OFF</p>" ) ;
    client.println("  <form method='get'style='text-align:left'> " ) ;
    client.println("    <span style='padding-left:15pt; font-size:8pt ;text-align:left'> LED brightness (0-255)</span> " ) ;
    client.print("    <input class='text'  type='text' name='led_v' value=" ) ;
    client.print(led_brightness ) ;
    client.println(" width='50px'><input class='button2' type='submit' name='set' value='SET'></form> " ) ;
    client.println("  <form method='get'>" ) ;
    client.println("    <input class='button' type='submit' name='on' value='ON'><input class='button' type='submit' name='off' value='OFF'></form>" ) ;
    client.println("  </div></body>" ) ;
    client.println("</html>" ) ;
    client.println();
    Serial.println( " --- send responce --- ");
}

HTML で 入力のテキストボックスを led_v の名前で作成。form の method は 'get'。
loop の中で client からの "GET /?led_v" を見つけたら、後に続く数字<0-9> を取得。
値が 255 を超えたら、255とする。
ON ボタンが押された場合 ("GET /?on") は明るさ を +10 して、押されるたびに明るくなるようにする。




3 件のコメント:

  1. 実行しましたが、残念ながら応答が遅いためエラーが表示されてしまいました。
    ちなみにGoogle chromeです。IEも同様にエラーとなりました。

    返信削除
    返信
    1. 当方では、通常 Firefoxを使用しています。再度 chrome, IE でも試しましたが、特にエラー等なく実行できました。
      どのようなエラーが表示されたのでしょうか?
      (ちなみに、9~15行目のWiFi,IP設定は各環境に応じて修正が必要です)

      削除
  2. ESP32を勉強中です。大変重宝しています。

    返信削除