2019年2月27日水曜日

ESP32/arduino : ファイル分割

目的:
 ファイル分割の仕方を確認する。

背景:
 スケッチが長くなって来た為、一つのファイルでは見づらくなって来た為、複数ファイルに分けたい。

分割の仕方:
  方法1
  • Arduino IDE の右上 (タブの右の方)にある▼ を押下し、"新規タブ" を選択。
  • 新規ファイルの名前の入力欄が現れる為、ファイル名を入力して OK を押下すると、新しくタブができる。
  • ファイル名には拡張子として .h, .cpp, .c をつけることができる。
  • 拡張子を付けない場合は、 .ino となる。
  • .ino の場合、#include は特に必要無い。.ino 同士は合わせて一緒にコンパイルし、.cpp 等は個別にコンパイルしている感じ。
方法2
  • スケッチ(.ino ファイル) と同じフォルダに追加するファイルを格納する。
  • ファイル(.ino, .h, .cpp, .c) が追加されると Arduino IDE に自動的にタブが追加される。
分割例:
 ベースは「ソフトウェアリセット」のスケッチで 、メインスケッチの強調表示の部分が別ファイル(.ino)に移した部分。

/*
 *    WiFi LED ON/OFF TEST
 *      PWM Control 
 */
  
#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);
 
// -- for ledc
byte br_table[11] = {0,25,50,75,100,125,150,175,200,225,255} ;
// -- for sigmaDelta
//byte br_table[6] = {0,150,180,205,230,255} ;
int  n = 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);
 
    connect_wifi() ;

    // for LED PWM Control ---------------------------------------------------
    // -- for ledc
    ledcSetup(0, 5000, 13);        // setup channel 0 with frequency 5000 Hz, 13 bit precission for LEDC timer
    ledcAttachPin(2,0);            // attach pin 2 to channel 0
    ledcWrite(0, 0);               // initialize channel 0 to off     
    // -- for sigmaDelta
    //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     
    
    n=0 ;
}
 
void loop(){
 WiFiClient client = server.available();     // listen for incoming clients
 
  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'
        proc_formdata(line) ;
 
        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("--------------------------------------------------");
  }
}
 
                                                          

// ----------------------------------------------------------------------------
// - connect to WiFi                                                       ----
// ----------------------------------------------------------------------------
void connect_wifi() {
    int lpcnt=0 ;
    // We start by connecting to a WiFi network -----------------------------
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);
 
    delay(10);
    WiFi.begin(ssid, password);
 
    while (WiFi.status() != WL_CONNECTED) { 
        delay(500);
        lpcnt +=1 ;
        if (lpcnt>4) { 
   WiFi.begin(ssid, password); 
   lpcnt  = 0 ;
 }
        Serial.print(".");
    }
 
    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
     
    server.begin();
}

// ----------------------------------------------------------------------------
// -  フォームデータの処理                                                 ----
// ----------------------------------------------------------------------------
void proc_formdata(String &line) {
   Serial.println(line);
   if (line.indexOf("GET /?on") != -1) {                 // Client request was "GET /?on" 
     n += 1 ;                                            // incliment table no.
     if (n>10) n=0 ;
     Serial.print("brightness value : ");
     Serial.println(br_table[n],DEC);
     // -- for ledc
     ledcWrite(0, 8191*br_table[n]/255) ;                // set PWM value to channel#0
     // -- for sigmaDelta
     //sigmaDeltaWrite(0, br_table[n]) ;
   }
   if (line.indexOf("GET /?off") != -1) {                // Client request was "GET /?off"
     n = 0 ;                                             // clear bright no.
     Serial.print("brightness value : ");
     Serial.println(br_table[n],DEC);
     // -- for ledc
     ledcWrite(0, 8191*br_table[n]/255) ;                // set PWM value to channel#0
     // -- for sigmaDelta
     //sigmaDeltaWrite(0, br_table[n]) ;
   }
}

// ----------------------------------------------------------------------------
// - send HTML                                                             ----
// ----------------------------------------------------------------------------
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.print("<!DOCTYPE html><html lang='ja'><head><meta charset='UTF-8'>" ) ;
    client.print("<style>input {margin:8px;width:100px;}div {font-size:16pt;text-align:center;width:250px;border:solid 4px #93ff93;}</style>" ) ;
    client.print("<title>Color LED Controller</title></head>" ) ;
    client.print("<body><div><p>LED ON/OFF</p><form method='get'>" ) ;
    client.print("<input type='submit' name='on' value='ON' /><input type='submit' name='off' value='OFF' /></form>" ) ;
    client.print("</div></body></html>" ) ;
    client.println();
    Serial.println( " --- send responce --- ");
}

  

0 件のコメント:

コメントを投稿