PlatformIOでESP8266を開発する

Dynamic variables

PlatformIOでもGitHubに公開されているArduino Libraryを利用することができるので、
こちらのMQTTクライア ントライブラリを組み込んで、MQTT Publisherを動かしてみました。

APのSSID、PASSWORD、MQTTサーバ名、MQTTトピックは、以下の様にiniファイルにマクロ定義していますので、
ビルドする環境毎に、これらを変えることができます。
ソースに一切変更を加えなくても、色々試すことができます。
[common]
lib_deps =
 https://github.com/knolleary/pubsubclient
description = MQTTのサンプル

[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino
lib_deps = ${common.lib_deps}
build_flags =
 '-D MY_SSID="aterm-e625c0-g"'
 '-D MY_PASSWORD="passweord"'
 '-D MQTT_TOPIC="nopnop2002/nodemcuv2"'
 '-D MQTT_SERVER="broker.mqtt-dashboard.com"'


[env:d1_mini]
platform = espressif8266
board = d1_mini
framework = arduino
lib_deps = ${common.lib_deps}
build_flags =
 '-D MY_SSID="aterm-e625c0-g"'
 '-D MY_PASSWORD="password"'
 '-D MQTT_TOPIC="nopnop2002/d1_mini"'
 '-D MQTT_SERVER="broker.hivemq.com"'

ソースではplatform.iniで定義されているマクロ定義を使います。
#include <ESP8266WiFi.h>
#include <PubSubClient.h>


//#define MY_SSID       defind in platform.ini
//#define MY_PASSWORD   define in platform.ini
//#define MQTT_SERVER   define in platform.ini
//#define MQTT_TOPIC    define in platform.ini

#define INTERVAL        10
#define MQTT_PORT       1883
#define MQTT_WILL_MSG   "I am leaving..." // You can change

#ifndef LED_BUILTIN
#define LED_BUILTIN 13
#endif

WiFiClient espClient;
PubSubClient client(espClient);

unsigned long lastTime = 0;

void setup_wifi() {

  delay(10);

  // We start by connecting to a WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Wait for WiFi...");
  WiFi.begin(MY_SSID, MY_PASSWORD);

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

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

void errorDisplay(char* buff) {
  Serial.print("Error:");
  Serial.println(buff);
  int led = 0;
  while(1) {
    digitalWrite(LED_BUILTIN,led);
    led = ~led;
    delay(200);
  }
}

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  setup_wifi();
  client.setServer(MQTT_SERVER, MQTT_PORT);

  char clientid[20];
  sprintf(clientid,"ESP8266-%06x",ESP.getChipId());
  Serial.print("clientid=");
  Serial.println(clientid);
  Serial.print("Attempting MQTT connection...");
  // Attempt to connect
//  if (!client.connect(clientid)) {
  if (!client.connect(clientid,MQTT_TOPIC,0,0,MQTT_WILL_MSG)) {
    errorDisplay("connect Fail");
  }
  Serial.println("connected");
  lastTime = millis();
}

void loop() {
  static int counter=0;
  static int value = 0;
  char msg[50];

  if (Serial.available() > 0) {
    char inChar = Serial.read();
    Serial.println("KeyIn");
    client.disconnect();
    Serial.println("Publish end");
    while(1) { }
  }

  if (!client.connected()) {
    errorDisplay("not connect");
  }
  client.loop();

  long now = millis();
  if (now - lastTime > 1000) {
    lastTime = now;
    counter++;
    if (counter > INTERVAL) {
      ++value;
      snprintf (msg, 75, "hello world #%d", value);
      Serial.print("Publish message: ");
      Serial.println(msg);
      if (!client.publish(MQTT_TOPIC, msg)) {
        errorDisplay("publish fail");
      }
      counter=0;
    }
  }
}



こ ちらにDynamic variables(動的変数)のページが有ります。
Exampleのiniファイルを見てみると、デフォルトでは「build_flags = -D VERSION=1.2.3 -D DEBUG=1」を定義していますが、
nodemcuv2の時は、これに加え-Wallのコンパイルオプションを追加しています。
このように、ソースの変更を行うことなく、ビルドの環境ごとにマクロ定義を追加することができます。

続く...