[精讚] [會員登入]
981

【NodeMCU / ESP8266】[Arduino]測量溫溼度並上傳至ThinkSpeak

使用簡單的溫度計來測量溫濕度並上傳至第三方網站,這樣他人只要有瀏覽器就能看到我們的數據了

分享此文連結 //n.sfs.tw/16055

分享連結 【NodeMCU / ESP8266】[Arduino]測量溫溼度並上傳至ThinkSpeak@小編過路君子
(文章歡迎轉載,務必尊重版權註明連結來源)
2023-01-11 20:19:26 最後編修
2023-01-11 03:43:20 By 過路君子
 

大家好,這裡是回到去年發現的大陸上的小編過路君子

但是身邊跟著的夥伴換人了呢,不再是上次的 LinkIt 7697

 

 

小編久違的又回去碰物聯網了呢,上次碰是去年四月的時候,那時候使用的是台灣開發的 Linklt 7697。

時過境遷,這次要使用的是中國開發的 NodeMCU ESP8266 這塊板子,話雖如此,但是在使用方式上大同小異,因為都是在 Arduino 上面開發。

不得不說 Arduino 真的強大,可以整合這麼多開發版,不用每換一塊就重新安裝一個環境或重新安裝軟體。

 

那我們今天的主題便是結合上次我們提到的 ThingSpeak 這個網站來做應用,還沒看過的人可以這邊請:【ThinkSpeak】一個IoT數據分析(IoT analytics)及呈現的網站

那同時我們會搭配溫度計使用,這次要使用的溫度計是 DHT11;順帶一提,之前小編在使用 Linklt 7697 的時候所使用的溫度計是 DHT22。

那接下來跟上次的文章一樣,廢話不多說,直接來上規格表:

軟體或硬體名稱 版本
NodeMCU 1.0 ESP-12E Module
USB Driver USB-SERIAL CP2102
Arduino IDE 1.8.18
Thingspeak 2.0.1
DHT sensor library 1.4.4

註:USB-SERIAL CP2102 的 載點

 

Step1. 安裝 DHT sensor library

(所有圖片點擊都可以放大、變高清)

 

Step2. 安裝 Thingspeak

這邊 Thingspeak 指的不是那個網站,而是套件名稱,應該算好找,因為全部就只有一個套件叫做 Thingspeak。

 

Step3. 將溫度計接上板子

這塊 NodeMCU 也是可以外加 Grove 擴充版的,所以小編也插了一塊上去,各位如果沒有擴充版......那就直接把杜邦線插在接腳上吧。

接線方式因為只有三根所以接起來還算簡單,正極接到 3v3 上(紫色線)、負極接地(綠色線)和中間的 OUT 接到 D5 上(藍色線),當然藍線要接到其他接腳也是可以的,就是等等下方的程式碼要改而已。

因為小編是 DHT11 的溫度計才要搞得那麼複雜,如果各位手上拿的是 DHT22 的溫度計,就直接插上去就可以了,因為它本身就是一個 Grove 接頭。

 

Step4. 程式碼撰寫

Secrets.h

// Use this file to store all of the private credentials 
// and connection details

#define SECRET_SSID "wifi-name"    // replace MySSID with your WiFi network name
#define SECRET_PASS "wifi-password"  // replace MyPassword with your WiFi password

#define SECRET_CH_ID 0000000      // replace 0000000 with your channel number
#define SECRET_WRITE_APIKEY "xxxxxx"   // replace XYZ with your channel write API Key

程式碼解析:

行號 解釋
4 設置將要連線的 wifi 名稱。
5 設置將要連線 wifi 的密碼。
7 設置要新增資料頻道的 ID,查詢方法在這
8 設置要新增資料頻道的 Key,查詢方法在這

 

Main.cpp

#include<ESP8266WiFi.h>
#include"DHT.h"
#include"Secrets.h"
#include"ThingSpeak.h"

#define DHTPIN D5

#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22

DHT dht(DHTPIN, DHTTYPE);

char ssid[] = SECRET_SSID;
char pass[] = SECRET_PASS;
WiFiClient client;

String myStatus = "";
unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;

void setup() 
{
	Serial.begin(115200);
	while (!Serial) ;

	Serial.print('\n');

	dht.begin();

	WiFi.mode(WIFI_STA); 

	// Initialize ThingSpeak
	ThingSpeak.begin(client);  
}

void loop() 
{
	// Connect or reconnect to WiFi
	if(WiFi.status() != WL_CONNECTED)
	{
		Serial.print("Attempting to connect to SSID: ");
		Serial.println(SECRET_SSID);

		int wifiTryCount = 0;
		bool wifiConnected = false;
		while(!wifiConnected)
		{
			if(wifiTryCount >= 10)
			{
				ESP.restart();
				wifiTryCount = 0;
			}
			else wifiTryCount += 1;

			// Connect to WPA/WPA2 network.
			WiFi.begin(ssid, pass);
			Serial.print(".");

			for(int x=0; 15>x; x++)
			{
				delay(1000);
				if(WiFi.status() == WL_CONNECTED) 
				{
					wifiConnected = true;
					break;
				}
			}
		} 
		Serial.println("\nConnected.");
	}

	float h = dht.readHumidity();
	float t = dht.readTemperature();

	ThingSpeak.setField(1, t);
	ThingSpeak.setField(2, h);

	// set the status
	ThingSpeak.setStatus(myStatus);

	// write to the ThingSpeak channel
	int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
	if(x == 200) Serial.println("Channel update successful.");
	else Serial.println("Problem updating channel. HTTP error code " + String(x));

	// Wait 60 seconds to update the channel again
	delay(60000);
}

程式碼解析:

行號 解釋
1 wifi 相關功能的函式庫。
2 溫度計相關功能的函式庫,包含 DHT11 和 DHT22。
3 跟 Main.cpp 位於同個資料夾下的 .h 檔案。
4 ThingSpeak 網站相關操作的函式庫。
6 定義溫度計所在的接腳,如果各位插的腳位不是 D5,那這邊要改成各位所接的腳位。
8~9 定義使用的溫度計型號,請各位依照自己手上溫度計的型號來更改,DHT11 的溫度計就長的跟 Step3 裡的圖一樣,DHT22 的溫度計長得像這樣
11 定義 DHT 溫度計並提供接下來的程式有接口可以用。
13~15 提供接下來的 wifi 服務基礎定義。
17~19 提供接下來的 ThingSpeak 服務基礎定義。
28 啟動 DHT 溫度計。
30 設定 wifi 連線時所使用的模式。
33 初始化 ThinkSpeak 模組。
39 判斷板子現在是否是正常連接 wifi,否的話啟動連線程序。
50 當重新連線的次數大於等於十次的時候直接重設這塊板子。
56 嘗試向設定的 wifi 發出連線請求。
72 讀取溫度計目前量測到的濕度。
73 讀取溫度計目前量測到的溫度。
75~76 設定要將哪筆資料放到哪個表格內。
79 測試是否能夠連線到 ThingSpeak 這個網站。
82 向 ThingSpeak 網站發出資料寫入請求。
83~84 向序列埠寫入最終執行結果,我們可以在監控視窗查看到相關結果。
87 ThingSpeak 不允許我們太過頻繁的寫入資料,其限制為每20秒得寫入一筆,所以這邊的數字不能小於 20000。

 

Step5. 在 ThingSpeak 上察看結果

ThingSpeak 會自動將收集的點繪製成表格,我們直接打開那個網頁就可以看到最終結果了。

如果沒有看到點的話請先確認監控視窗有出現以下的畫面:

如果有出現以上畫面,那可以將滑鼠移至網頁上的圖上,如果出現 NaN 的資料,那就是溫度計的線沒有接好,將線重新壓緊然後再次等待看看是否能正常讀取到資料。

 

 

 

後記

小編想寫這篇也拖了好久,趕快把幾個月前學到的基礎用法拿出來筆記一下,趕快一鼓作氣解決它。

或是......拿 Arduino Uno 出來做示範?好像也不是不行,應該除了 50 行之外都不需要做修改。

END

你可能感興趣的文章

【Discord bot 2.0.1】(discord.ui.View)如何將舊機器人升級至目前最新版本 很多時候升級軟體是為了讓別人覺得你的程式很先進,但這次卻是因為要使用某個新功能

【教程】(進階版)如何用Sigil製作一本高質量的epub 下載好了Sigil之後除了直接把文字貼進去以外,還有:變更字型、著色、導入CSS……等等功能,不知道你有沒有發現呢?

【Wicket】[CSP] Content-Security-Policy & Content-Security-Policy-Report-Only Wicket 預設開啟的,所以如果要加載外部資源甚至是同源資源都會被擋下。

【Wicket】[URI]使用Java取得目前網址 這是個還滿常用的功能,可惜 Wicket 沒有內建函式可以快速取得我們要的部分,只能依靠我們自己後期的字串剖析

【Linux】網路測速 network speed test 在沒有 GUI 的狀態之下,該如何進行簡單的網路測速呢?

【Wickct】如何製作一個簡單的動態響應頁面和傳遞參數至其他頁面 身為一個後端架構程式,這個功能當然是非常重要之一

隨機好文

【分享、整合串】什麼?!高捷少女竟然有二創小說!! 由時零宇宙大大在巴哈上面連載的二創高捷少女小說,就讓我們來看看,究竟在時零大大的巧手下,高捷少女們會擦出什麼樣的火花吧!

高捷少女:購票大作戰① 「各位乘客,本班機即將降落,感謝各位乘客的搭乘……」隨著空中小姐的廣播音,那架飛機逐漸降落在地面,裡面的乘客們也紛紛開始整理自己的行李。 那個有著歐美人五官的少女抓緊包包,看著外面的小港機場,臉上緩緩

高捷少女:美麗島的守護者① 婕兒跟耐耐嚇得臉色發白。「耐耐,小穹有這方面的愛好喔?」婕兒小聲地說。耐耐默默的拿出筆記本,臉上浮現一層微笑:「這麼大的新聞,要趕快記下來!」

高捷少女:美麗島的守護者③ 小雅閉上眼睛,思索在高捷發生的點點滴滴。她心意已決,在高捷的日子的確也有快樂的部分,不過她相信換個方向是更好的決定。有關高捷的所有美好回憶,小雅決定保留在心裡就好,繼續在高捷工作只會讓自己更痛苦而已,

【札記】在發文上遇到的問題 如果遇到問題,是選擇丟在一旁還是將其解決,又或者是看情況?