每一個device(channel)有一組帳密 建立MQTT device時 thingspeak 會給,以此帳密登入MQTT server
若使用同一個device(ACC-1882331)的帳密 同時用於兩個ESP板 一個(P) publish 一個(S)subscribe會發生問題
當P publish 完成後就會將MQTT 斷線 同時S也就斷線(因使用同一帳密ACC)而無法執行callback
所以S須使用另一個device(MQTTsub-1860308)的帳密,並設定 許可此device(MQTTsub)對 device(ACC) 之publish 權限
免費版本 只能有4個device (channel)
//publisher 發布溫度 濕度 到chnnel 1882331
//lib:DHT_sensor_library_for_ESPx.zip (down load)
//lib:PubSubClient.zip(down load)
//程式碼(.zip)
//請將mqtt_secrets.h換成你自己的mqtt_secrets.h
//請將1882331改為你的channel ID
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "mqtt_secrets.h"//換成你的
#include "DHTesp.h"
#define DHT11PIN D7 // DHT11資料接腳d1 mini
//#define DHT11PIN 2 // DHT11資料接腳 esp01s
DHTesp dht;
float t=0;
float h=0;
const char* ssid = "換成你的分享器SSID";
const char* password = "換成你的分享器密碼";
const char* mqttServer = "mqtt3.thingspeak.com";
const char* topic = "channels/1882331/publish";
String msgStr = "";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
}
void reconnect() {
while (!client.connected()) {
if (client.connect(SECRET_MQTT_CLIENT_ID, SECRET_MQTT_USERNAME, SECRET_MQTT_PASSWORD)) {
Serial.println("MQTT connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000); // 等5秒之後再重試
}
}
}
void setup() {
Serial.begin(115200);
dht.setup(DHT11PIN, DHTesp::DHT11);
delay(2000);
setup_wifi();
client.setServer(mqttServer, 1883);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
//delay(dht.getMinimumSamplingPeriod());
t=dht.getTemperature();
h=dht.getHumidity();
// 組合MQTT訊息;field1填入溫度、field2填入濕度
msgStr=msgStr+"field1="+t+"&field2="+h;
client.publish(topic, msgStr.c_str());
msgStr = "";
delay(20000);
}
//subscriber MQTTsub-1860308 訂閱ACC-1882331之溫度
//若溫度大於tempThreshhold LED亮
//程式碼(.zip)
//Serialport debug 用 沒問題後 將Serial部分註解掉
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "mqtt_secrets.h"//換上你自己另一個channel的.h
#define led 2
uint16_t mqttPort=1883;
const char* s_topic="channels/1882331/subscribe/fields/field1";
const char* ssid = "換成你的分享器SSID";
const char* password = "換成你的分享器密碼";
const char* mqtt_server = "mqtt3.thingspeak.com";
int tempNow;
int tempThreshhold=33;
WiFiClient espclient;
//WiFiClient pubsubclient;
PubSubClient client(espclient);
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, uint8_t* payload, unsigned int length) {
delay(1000);
Serial.println("");
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String payloadTemp;
for (int i = 0; i < length; i++) {
payloadTemp += (char)payload[i];
Serial.print((char)payload[i]);
}
tempNow=payloadTemp.toInt();
Serial.println(tempNow);
if (tempNow>=tempThreshhold ) { digitalWrite(led, LOW); }
else
{ digitalWrite(led, HIGH); }
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect(SECRET_MQTT_CLIENT_ID,SECRET_MQTT_USERNAME, SECRET_MQTT_PASSWORD)) {
Serial.println("connected");
client.subscribe(s_topic,0);
} 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() {
pinMode(led, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqttPort);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
//delay(200);
}