ESP-12F 雲端記錄型 K-Type 溫度計(MQTT ThingSpeak)

學習如何學習!

設備與材料

個人電腦 × 1
ESP12F × 1
麵包板 × 1
SW按鈕 × 1
MAX31855模組 × 1
K-Type 熱電偶 × 1
連接線 若干

實體接線圖

開發環境

使用 Arduino IDE 安裝 ESP8266開發板,如果不知道如何安裝ESP8266開發板,可以參考 “準備你的 ESP12E/F 開發工具” ,安裝開發板之後,記得開發板選擇 “NodeMCU 1.0(ESP-12E Module)” ,之後安裝MAX31855 程式庫,如下圖步骤。



設定 ThingSpeak

先登入你的 ThingSpeak 帳號,如果沒有帳號可以參考 ThingSpeak 雲端資料庫 帳號申請 。登入按 “New Channel”,新增你的新頻道(用來接收統計 ESP-12F 發佈的資料)。


輸入 Name、 Field1、 Field2欄位名稱(可支援中文),並勾選。滑鼠往下滾動後,按“Save Channel



新增的 “溫度監控” 資料收集頻道(Channel),Channel ID 很重要,使用 MQTT 發佈資料到雲端資料庫會使用到


設定 “溫度監控” 頻道(Channel) MQTT Device,這樣才可以用 MQTT 發佈資料到 ThingSpeak


新增 MQTT Devices


設定 Name ,並把剛剛新增的頻道(Channel)加進來


加入頻道(Channel) 後,按 “Add Device” 新增 MQTT Device


新增後,會給你 MQTT 連線的一些資料,按 “Download Credertials” 下載回來


選擇 下載 “Arduino (mqtt_secrets.h)


我是開啟檔案後,直接複製到 Arduino IDE 的程式裡。


以上完成,ThingSpeak 的設定,接著完成硬體,硬體完成後,程式燒好,就可以測試功能正不正確。需要修改圖形顯示的 “Results” 從60筆資料變成900,每秒1筆,可以統計15分鐘。按圖形右上 “筆形 ICON“,可以進入設定畫面。


使用電烙鐵直接加熱 K-Type 熱電偶測試溫度,SW接腳必需接地才會送資料到雲端喔!


範例程式

/*
 *  ESP-12F 雲端記錄型 K-Type 溫度計(MQTT ThingSpeak)
 *  開發工具 Arduino IDE 必需自行加入ESP12F 開發板
 *  需要安裝 MQTT 程式庫(PubSubClient)
 *  需要安裝 MAX31855 程式庫
 *  開發板 ESP12F(ESP8266)   
 *  此程式為範例程式,SW開關接地時,每秒發佈環境溫度與熱電偶溫度到 ThingSpeak
 *  使用通訊協定 MQTT ,MQTT broker 使用 mqtt3.thingspeak.com
 *  mqtt3.thingspeak.com 需要先註冊與設定
 *  https://www.block.tw/blog
 */

//Wifi
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WiFiMulti.h>

//MQTT LIB 需要自行安裝程式庫 https://github.com/knolleary/pubsubclient
#include <PubSubClient.h>

ESP8266WiFiMulti wifiMulti;
WiFiClient espClient;

PubSubClient client(espClient);

//MAX31855 需要的程式庫
#include <MAX31855.h> 

//MAX31855 接腳
#define MAXDO   D3  // D3 GPIO 0
#define MAXCS   D2  // D2 GPIO 4
#define MAXCLK  D5  // D5 GPIO 14

#define SW      D6   //開關接腳

// 宣告 MAX31855 物件
MAX31855_Class MAX31855; 

//WIFI SSID 跟密碼
#define   APSSID  "********"         //你的 SSID
#define   APPW    "********"         //你的 wifi 網路密碼

// MQTT ThingSpeak MQTT 伺服器 需要換成你的喔!
#define SECRET_MQTT_USERNAME "DwkYEBMeAT0FAAQtBjsjMgE"
#define SECRET_MQTT_CLIENT_ID "DwkYEBMeAT0FAAQtBjsjMgE"
#define SECRET_MQTT_PASSWORD "*******ivWa3nudmOt/KXBA"

const char* brokerUser  = SECRET_MQTT_USERNAME;  //使用者名稱
const char* brokerPass  = SECRET_MQTT_PASSWORD;  //使用者密碼
const char* broker      = "mqtt3.thingspeak.com";

//channels/Channel ID/publish   記得換成你的 Channel ID
const char* pubTopic       = "channels/1717654/publish";    

//發佈 MQTT 所需要的字串
char        msg[40]     ;
String      msgStr      = "";

//計算時間用的變數
long        currentTime, lastTime;

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(SW, INPUT_PULLUP);
  //內建板上 LED 滅 D4 GPIO 2
  digitalWrite(LED_BUILTIN, HIGH);

  Serial.begin(115200);
  setupWiFi();
  client.setServer(broker, 1883);
  client.setCallback(callback);
  
  //MAX31855 啟用
  while (!MAX31855.begin(MAXCS,MAXDO,MAXCLK)){
    Serial.println(F("Unable to start MAX31855. Waiting 3 seconds."));
    delay(3000);
  } // of loop until device is located

}

void loop(){
  if (!client.connected()){
    //連接 MQTT 伺服器
    MQTTconnect();
  }
  //client.loop();
  currentTime = millis();
  
  //1秒發一次訊息
  if(currentTime - lastTime > 1000){    
    //讀取環境溫度與熱電偶溫度
    float aT=(float)MAX31855.readAmbient()/1000;
    float pT=(float)MAX31855.readProbe()/1000;
    
    //如果SW接腳低電位就發送
    if(!digitalRead(SW)){
      Serial.print("Sending messages:\t"); 
      //把溫度變成傳送 ThingSpeak MQTT 字串指令
      msgStr="field1="+(String)aT+"&field2="+(String)pT;
      //字串轉字元
      msgStr.toCharArray(msg,msgStr.length()+1);
      Serial.println(msg);
      client.publish(pubTopic,msg);    
    }  
    
    lastTime = millis();
  }
   
}

//訂閱的主題有人發佈訊息時的處理函式
void callback(char* topic, byte* payload, unsigned int len){
  //無
}

//連接無線 wifi 的處理函式
void setupWiFi(){
  delay(100);

  //連接無線 wifi
  wifiMulti.addAP(APSSID, APPW);

  Serial.println("Wifi Connecting ...");

  //內建板上 LED 亮
  digitalWrite(LED_BUILTIN, LOW);

  while (wifiMulti.run() != WL_CONNECTED){
    delay(250);
    Serial.print('.');
  }

  //內建板上 LED 滅
  digitalWrite(LED_BUILTIN, HIGH);

  Serial.println('\n');
  Serial.print("Connected to:\t");
  Serial.println(WiFi.SSID());

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


void MQTTconnect(){
  while (!client.connected()){
    //連接 MQTT 伺服器,mqtt3.thingspeak.com 要註冊 不可亂填
    if (client.connect(SECRET_MQTT_CLIENT_ID, brokerUser, brokerPass)) {
      Serial.print("\nConnected to ");
      Serial.println(broker);      
    } else {
      Serial.println("Connecting");
      delay(2500);
    }
  }
}
入門
知識
語法
流程
函式
實習

發佈留言