0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

安いWi-Fi機能付きのESP8266マイコンを試す(DHCP払出し待ち編)

0
Posted at

前の記事

準備編

WiFiクラサバ編

Arudiono IDEで使う

作りたかった機能

ルーター接続後、DHCPからのIP払い出し待ちでNGにならないように、接続後、DHCP払い出し待ちをする

Wi-Fiクライアント全体コード
スケッチ
#include <ESP8266WiFi.h>

const uint8_t TARGET_LED_PIN  = LED_BUILTIN;
const uint8_t LED_ON          = LOW;
const uint8_t LED_OFF         = HIGH;

const unsigned long DELAY_TERM = 5000;
const unsigned long SERIAL_SPEED = 115200;

const char* WIFI_SSID       = "xxxxxxxxxx";
const char* WIFI_PASSWORD   = "xxxxxxxxxx";

const WiFiMode_t WIFI_MODE  = WIFI_STA;

const unsigned long WIFI_CONNECTED_CHECK_MS = 500;
const unsigned long WIFI_CONNECTED_TIMEOUT  = 10000;

const unsigned long WIFI_GET_DATA_TERM  = 1000;
const unsigned long WIFI_GET_DATA_WAIT  = 100;
const char* CONNECT_HOST = "192.168.0.5";
const char* CONNECT_HOST_CONTENTS[] = {"/404.non.html", "/", "/led/on", "/led/off", "/ad/"};
const int CONNECT_PORT = 80;
const int URL_INDEX_MIN = 0;
const int URL_INDEX_MAX = 4;

bool ConnectedStatus;

void setup() {
  Serial.begin(SERIAL_SPEED);
  Serial.println("");

  // ボード上のLEDを指定
  pinMode(TARGET_LED_PIN, OUTPUT);
  digitalWrite(TARGET_LED_PIN, LED_OFF);  // 消灯

  //  WiFi接続
  ConnectedStatus = false;
  ConnectedStatus = connect_WiFi(WIFI_SSID, WIFI_PASSWORD, WIFI_CONNECTED_TIMEOUT);
  if (ConnectedStatus)
  {
    Serial.print("Connected. local IP address: ");
    Serial.println(WiFi.localIP());
  }
  
  int urlindex = 0;
}

//  WiFi(Connect)
bool connect_WiFi(const char* ssid, const char* password, long connectTimeoutMS) {
  bool  connected = false;
  long  connectCheckTime = 0;

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  Serial.println("");
  Serial.println("Try to Connect To Router.");
  while (WiFi.status() != WL_CONNECTED)
  {
    connectCheckTime = connectCheckTime + WIFI_CONNECTED_CHECK_MS;
    delay(WIFI_CONNECTED_CHECK_MS);

    if (connectCheckTime > connectTimeoutMS)
    {
      Serial.println("Connected time out.");
      connected = false;
      break;
    }
    connected = true;
  }

  //  DHCP Trans
  if (WiFi.status() == WL_CONNECTED)
  {
    connectCheckTime = 0;
    Serial.println("Try to DHCP.");

    //  Wait from DHCP trans.
    while (connectCheckTime <= connectTimeoutMS)
    {
      //  Wait.
      delay(WIFI_CONNECTED_CHECK_MS);
      connectCheckTime = connectCheckTime + WIFI_CONNECTED_CHECK_MS;
      Serial.print(".");

      if (WiFi.localIP() != INADDR_NONE)
      {
        connected = true;
        break;
      }

      if (connectCheckTime > connectTimeoutMS)
      {
        connected = false;
        break;
      }
    }
    if (connected)
    {
      Serial.println("Connected, DHCP Ok.");
    }
    else
    {
      Serial.println("Connected, but DHCP time out.");
      connected = false;
    }
  }

  return connected;
}

void loop() {
  WiFiClient client;

  delay(WIFI_GET_DATA_TERM);

  if (ConnectedStatus)
  {
    digitalWrite(TARGET_LED_PIN, LED_ON);  // 点灯

    Serial.print("Local IP address: ");
    Serial.println(WiFi.localIP());
 
    Serial.print("connecting to ");
    Serial.println(CONNECT_HOST);
 
    // Use WiFiClient class to create TCP connections
    if (!client.connect(CONNECT_HOST, CONNECT_PORT)) {
      Serial.println("connection failed");
      return;
    }
  
    String url;
    if ((urlindex >= URL_INDEX_MIN) && (urlindex <= URL_INDEX_MAX)) {
      url = CONNECT_HOST_CONTENTS[urlindex];
      urlindex = urlindex + 1;
    }
    if (urlindex > URL_INDEX_MAX) {
      urlindex = 0;
    }

    Serial.print("Requesting URL: ");
    Serial.print(urlindex);
    Serial.print(" - ");
    Serial.println(url);
 
    // This will send the request to the server
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                "Host: " + CONNECT_HOST + "\r\n" +
                "Connection: close\r\n\r\n");
    delay(WIFI_GET_DATA_WAIT);
  
    // Read all the lines of the reply from server and print them to Serial
    while(client.available()){
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }
 
    Serial.println();
    Serial.println("closing connection");
  } else {
    //  接続無し
    Serial.println();
    Serial.println("nothing");
  }

  digitalWrite(TARGET_LED_PIN, LED_OFF);  // 消灯
}

下の3つは、自分の環境に合わせて変更してください。
const char* WIFI_SSID = "xxxxxxxxxx";
const char* WIFI_PASSWORD = "xxxxxxxxxx";
const char* CONNECT_HOST = "192.168.0.5";

Wi-Fiルータ接続待ち関数部分コードの説明
スケッチ
//  WiFi(Connect)
bool connect_WiFi(const char* ssid, const char* password, long connectTimeoutMS) {
  bool  connected = false;
  long  connectCheckTime = 0;

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  Serial.println("");
  Serial.println("Try to Connect To Router.");
  while (WiFi.status() != WL_CONNECTED)
  {
    connectCheckTime = connectCheckTime + WIFI_CONNECTED_CHECK_MS;
    delay(WIFI_CONNECTED_CHECK_MS);

    if (connectCheckTime > connectTimeoutMS)
    {
      Serial.println("Connected time out.");
      connected = false;
      break;
    }
    connected = true;
  }

  //  DHCP Trans
  if (WiFi.status() == WL_CONNECTED)
  {
    connectCheckTime = 0;
    Serial.println("Try to DHCP.");

    //  Wait from DHCP trans.
    while (connectCheckTime <= connectTimeoutMS)
    {
      //  Wait.
      delay(WIFI_CONNECTED_CHECK_MS);
      connectCheckTime = connectCheckTime + WIFI_CONNECTED_CHECK_MS;
      Serial.print(".");

      if (WiFi.localIP() != INADDR_NONE)
      {
        connected = true;
        break;
      }

      if (connectCheckTime > connectTimeoutMS)
      {
        connected = false;
        break;
      }
    }
    if (connected)
    {
      Serial.println("Connected, DHCP Ok.");
    }
    else
    {
      Serial.println("Connected, but DHCP time out.");
      connected = false;
    }
  }

  return connected;
}

ステップ1.ルータ接続までのループ

while (WiFi.status() != WL_CONNECTED) {
    (省略)
}

でルータ接続を確認

ステップ2.ルータ接続を確認し、DHCP払い出し待ちループへ

//  DHCP Trans
if (WiFi.status() == WL_CONNECTED)
{
    (省略)
}

でルータ接続状態を確認

DHCP接続を WiFi.localIP()で実施。

    //  Wait from DHCP trans.
    while (connectCheckTime <= connectTimeoutMS)
    {
      (省略)
      if (WiFi.localIP() != INADDR_NONE)
      {
        connected = true;
        break;
      }
      (省略)
    }

INADDR_NONEだと、IPアドレス無効。
有効になるまでループする。

謝辞

以下の記事を参考に作りました。

最後に

スケッチコードはCC BY-SA 4.0(著作者の情報とCCライセンス継承はお願いします。商用利用・改変・再配布は問題なし)です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?