[精讚] [會員登入]
268

【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

你可能感興趣的文章

【Stable Diffusion web UI】[AI 作畫](Linux)無 NVIDIA 顯卡之伺服器運行測試 凡事就是要試試看,才知道最後的結果

【Minecraft】[CoreProtect|BungeeCord]如何重新命名世界或維度名稱 當只有一個伺服器的時候,問題往往處理起來非常簡單,但是一旦當伺服器成長至兩台以上,事情便開始有趣了起來

【Maven / Jython】建立可直接執行的JAR檔案 以小編的前一篇文章為基礎,加了一些新東西進去,就變成另一個樣貌了

【Linux】[CentOS 8]如何更新sudo指令 上次會想要更新sudo這個指令的時間應該是2017年了吧?轉眼間就2021了耶

【C++】一些好用的C++小功能 —— 貳 承襲上一篇的C++小功能,筆記下來以免自己以後忘記了。

【Wicket】[Header]如何讀取來自客戶端地檔頭和傳送自訂擋頭至客戶端 當需要設定檔頭或是讀取來自客戶端的檔頭時,這些程式碼就很好用

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

高捷少女:布拉格體驗㊤ 「可……可以去歐洲玩?而且還有人出錢?太棒囉!」婕兒忍不住歡呼起來,把扳手拋呀拋的,旁邊的客人紛紛轉過來看。「好了啦!」耐耐忍不住害羞起來,輕輕敲了一下婕兒的頭

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

婕兒──她的青春④ 「投降吧,耐耐!這回合妳將不會再有獲勝的機會了!哈哈哈哈!」 「妳確定?」耐耐臉上泛起一絲微笑,並將手中的牌展示給婕兒看 婕兒的笑容僵住了。恐懼浮現在她的臉。

【阿瑞斯病毒】(影片示範)棘刺豬打法&打銀狐辛酸史 分享荊棘豬的打法,希望這一點點的經驗分享可以幫你節省大量的時間!

【英翻中歌詞】(二創歌)少女秘封俱樂部 Out there past the stars... that world is ours, once lost to history.  (Don’t you know?~) 在星輝之外...那屬