WeMosを使ってみる

DS18B20(1-Wire 温度センサー)+MQTT


こちらのページで紹介しているMQTTと、こちらのページで紹介しているDS18B20(温度センサー)を組み 合わせて
DS18B20の温度データをMQTTでBrokerに送信してみます。
BrokerはローカルのBrokerを使いましたが、お試しの場合は「broker.hivemq.com」を使ってください。

注意が必要なのはconnect関数で指定するコネクトIDです。
コネクトIDは必ずユニークなIDにする必要があります。
今回はローカルIPアドレスをコネクトIDとして使いましたが、問題なく動いています。

/*
 * DS18B20 Temperature sensor publish
 * http://akademia.nettigo.pl/ds18b20/
 *
 * 18B20       NodeMCU
 * VCC    ---- 3.3V
 * OUT    -+-- D5 
 *         |
 *         |
 *        4.7K
 *         |
 * VCC    -+
 * GND    ---- GND
 */

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const char* ssid = "アクセスポイントのSSID";
const char* password = "アクセスポイントのパスワード";
const char* mqtt_server = "192.168.10.40";
//const char* mqtt_server = "broker.hivemq.com";

#define ONE_WIRE_BUS 14      // データ(黄)で使用するポート番号
#define SENSER_BIT    9      // 精度の設定bit
#define INTERVAL     10      // データ取得間隔(秒)

WiFiClient espClient;
PubSubClient client(espClient);
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

long lastMsg = 0;
char msg[50];
char myip[20];  // connect idとして使う

void setup_wifi() {
  IPAddress _address;

  delay(10);

  // We start by connecting to a WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Wait for WiFi...");
  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());
  _address = WiFi.localIP();
  String str = String(_address[0]);
  str += ".";
  str += String(_address[1]);
  str += ".";
  str += String(_address[2]);
  str += ".";
  str += String(_address[3]);
  str.toCharArray(myip, 20);
  Serial.print("myip=");
  Serial.println(myip);
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
//    if (client.connect("ESP8266Client")) {
    if (client.connect(myip)) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
      // ... and resubscribe
      client.subscribe("inTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}


void setup(void) {
  Serial.begin(9600);
  sensors.setResolution(SENSER_BIT);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}
 
void loop(void) {
  static int counter=0;
  float value;
 
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();
  if (now - lastMsg > 1000) {
    lastMsg = now;
    counter++;
    if (counter > INTERVAL) {
      sensors.requestTemperatures();
      value = sensors.getTempCByIndex(0);
      Serial.println(value);
      int a = value;
      int b = value * 10;
      b = b % 10;
      sprintf (msg, "%2d.%1d",a,b);
      Serial.print("Publish message: ");
      Serial.println(msg);
      client.publish("nopnop2002/nodemcu1/temp", msg);
      counter=0;
    }
  }
}

本体をタッパーに入れて家の外に置いてみました。


我が家はベランダに電源があります。
電源さえ確保できれば、どこの場所の温度も簡単にわかります。



続く...