WeMosを使ってみる

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


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

注意が必要なのはconnect関数で指定するコネクトIDです。
コネクトIDは必ずユニークなIDにする必要があります。
今回はESP8266のチップIDをコネクトIDとして使いました。

/*
 * DS18B20 Temperature sensor publish
 * http://akademia.nettigo.pl/ds18b20/
 *
 * 18B20        WeMos
 * OUT    --+-- GPIO_14 
 *          |
 *         4.7K
 *          |
 * VCC    --+-- 3.3V
 * 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      // データ取得間隔(秒)
#define LED           5      // LED

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

long lastMillis = 0;
char msg[50];

void setup_wifi() {
  // 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());
}

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 connect_mqtt() {
  char clientid[20];

  sprintf(clientid,"ESP8266-%6x",ESP.getChipId());
  Serial.print("clientid=");
  Serial.println(clientid);
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
//    if (client.connect("ESP8266Client")) {
    if (client.connect(clientid)) {
      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) {
  delay(1000); Serial.begin(9600);
  sensors.setResolution(SENSER_BIT);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  pinMode(LED,OUTPUT);
  digitalWrite(LED,HIGH);
}
 
void loop(void) {
  static int counter=0;
  static int flag=0;
  float value;
 
  if (!client.connected()) connect_mqtt();
  client.loop();

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

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


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



続く...