ESP8266によりDHT11(温湿度センサ)で取得した温度と湿度をMQTTプロトコルによりサーバに送信します。サーバ側にはInflaxDBとGrafanaがインストールされています。送信されたデータを受信し、InflaxDBへの書き込みは、Pythonプログラムにより実現しています。
準備
パソコン、ESP8266、DHT11、ブレッドボード
プログラムについて
こちらのページを参考にさせていただきました。
#include "DHT.h"
#include <ESP8266WiFi.h> // Enables the ESP8266 to connect to the local network (via WiFi)
#include <PubSubClient.h> // Connect and publish to the MQTT broker
#define DHTPIN D2 // what digital pin the DHT11 is conected to
#define DHTTYPE DHT11 // there are multiple kinds of DHT sensors
DHT dht(DHTPIN, DHTTYPE);
// WiFi
const char* ssid = "SSID"; // Your personal network SSID
const char* wifi_password = "PASSWORD"; // Your personal network password
// MQTT
const char* mqtt_server = "MQTT.BROKER.IP.ADDRESS"; // IP of the MQTT broker
const char* humidity_topic = "klab/st99/humidity";
const char* temperature_topic = "klab/st99/temperature";
const char* mqtt_username = "root"; // MQTT username
const char* mqtt_password = "root"; // MQTT password
const char* clientID = "123456789"; // MQTT client ID client_livingroom
// Initialise the WiFi and MQTT Client objects
WiFiClient wifiClient;
// 1883 is the listener port for the Broker
PubSubClient client(mqtt_server, 1883, wifiClient);
// Custom function to connet to the MQTT broker via WiFi
void connect_MQTT(){
Serial.print("Connecting to ");
Serial.println(ssid);
// Connect to the WiFi
WiFi.begin(ssid, wifi_password);
// Wait until the connection has been confirmed before continuing
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Debugging - Output the IP Address of the ESP8266
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Connect to MQTT Broker
// client.connect returns a boolean value to let us know if the connection was successful.
// If the connection is failing, make sure you are using the correct MQTT Username and Password (Setup Earlier in the Instructable)
if (client.connect(clientID, mqtt_username, mqtt_password)) {
Serial.println("Connected to MQTT Broker!");
}
else {
Serial.println("Connection to MQTT Broker failed...");
}
}
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
connect_MQTT();
Serial.setTimeout(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("Humidity: ");
Serial.print(h);
Serial.println(" %");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
// MQTT can only transmit strings
String hs="Hum: "+String((float)h)+" % ";
String ts="Temp: "+String((float)t)+" C ";
// PUBLISH to the MQTT Broker (topic = Temperature, defined at the beginning)
if (client.publish(temperature_topic, String(t).c_str())) {
Serial.println("Temperature sent!");
}
// Again, client.publish will return a boolean value depending on whether it succeded or not.
// If the message failed to send, we will try again, as the connection may have broken.
else {
Serial.println("Temperature failed to send. Reconnecting to MQTT Broker and trying again");
client.connect(clientID, mqtt_username, mqtt_password);
delay(10); // This delay ensures that client.publish doesn't clash with the client.connect call
client.publish(temperature_topic, String(t).c_str());
}
// PUBLISH to the MQTT Broker (topic = Humidity, defined at the beginning)
if (client.publish(humidity_topic, String(h).c_str())) {
Serial.println("Humidity sent!");
}
// Again, client.publish will return a boolean value depending on whether it succeded or not.
// If the message failed to send, we will try again, as the connection may have broken.
else {
Serial.println("Humidity failed to send. Reconnecting to MQTT Broker and trying again");
client.connect(clientID, mqtt_username, mqtt_password);
delay(10); // This delay ensures that client.publish doesn't clash with the client.connect call
client.publish(humidity_topic, String(h).c_str());
}
client.disconnect(); // disconnect from MQTT broker
delay(1000*60); // print new values every 1 Minute
}