在可再生能源領(lǐng)域,太陽能處于最前沿,因?yàn)槔锰柲馨l(fā)電是可再生能源最簡(jiǎn)單、商業(yè)上可行的方式。說到太陽能電池板,需要監(jiān)控太陽能電池板輸出的輸出功率,以便從電池板獲得最佳功率輸出。這就是為什么需要實(shí)時(shí)監(jiān)控系統(tǒng)的原因。在大型太陽能發(fā)電廠中,它還可用于監(jiān)控每個(gè)面板的功率輸出,這有助于識(shí)別灰塵堆積。它還可以防止運(yùn)行期間出現(xiàn)任何故障情況。在這個(gè)項(xiàng)目中,我們將通過結(jié)合基于MPPT (最大功率點(diǎn)跟蹤器)的電池充電技術(shù)來制作基于物聯(lián)網(wǎng)的太陽能監(jiān)測(cè)系統(tǒng),這將有助于減少充電時(shí)間并提高效率。此外,我們將測(cè)量面板溫度、輸出電壓和電流,以提高電路的安全性。最后,最重要的是,我們將使用 ThingSpeak 云服務(wù)來監(jiān)控來自世界各地的輸出數(shù)據(jù)。
為支持物聯(lián)網(wǎng)的太陽能監(jiān)視器選擇合適的組件
使用太陽能監(jiān)視器,監(jiān)視和檢測(cè)任何太陽能系統(tǒng)中的故障變得非常容易。這就是為什么在設(shè)計(jì)這樣的系統(tǒng)時(shí)組件選擇成為一個(gè)非常重要的部分。下面給出了我們使用的部件列表。
ESP32 開發(fā)板
MPPT電路(可以是任何太陽能電路)
分流電阻器(例如 1 Ohm 1 watt - 適用于高達(dá) 1A 的電流)
鋰電池(首選 7.4v)。
有效的 Wi-Fi 連接
太陽能電池板的溫度傳感器
分壓器電路(見說明)
Esp32 開發(fā)板:
對(duì)于支持物聯(lián)網(wǎng)的應(yīng)用程序,必須選擇正確類型的開發(fā)板,該開發(fā)板能夠處理來自其模擬引腳的數(shù)據(jù)并通過任何類型的連接協(xié)議(如 Wi-Fi 或云)發(fā)送數(shù)據(jù)服務(wù)器。我們特別選擇了 ESP32,因?yàn)樗且豢罹哂写罅抗δ艿牡统杀?a target="_blank">微控制器。此外,它有一個(gè)內(nèi)置的 Wi-Fi 收音機(jī),我們可以通過它非常輕松地連接到互聯(lián)網(wǎng)。
太陽能電路:
太陽能充電電路是從太陽能電池板獲得更高電壓并將其轉(zhuǎn)換為充電電壓的電路,以便它可以有效地為電池充電。對(duì)于這個(gè)項(xiàng)目,我們將使用基于 LT3562 的 MPPT 充電控制器電路板,我們已經(jīng)在之前的一個(gè)項(xiàng)目中制作了該電路板。但是如果你想嵌入這個(gè)物聯(lián)網(wǎng)啟用監(jiān)控,你可以使用任何類型的太陽能電路。我們選擇此板是因?yàn)樵撾娐放鋫淞俗畲蠊β庶c(diǎn)跟蹤 (MPPT),這對(duì)低功率太陽能電池板項(xiàng)目非常有利。這是從太陽能電池板為小型鋰電池充電的有效方法。
分流電阻:
任何電阻器都遵循歐姆定律,這意味著如果一定量的電流流過電阻器,就會(huì)出現(xiàn)一定量的電壓降。分流電阻器也不例外,它專門用于測(cè)量電流。但是,根據(jù)流過太陽能電池板的標(biāo)稱電流,選擇一個(gè)分流電阻器,該電阻器將產(chǎn)生足夠的電壓,該電壓可由微控制器單元測(cè)量。但是,與此同時(shí),電阻的瓦數(shù)也很重要。分流電阻功率的選擇也很重要。
可以使用下面給出的公式計(jì)算電壓降。這被稱為歐姆定律——
V = I x R
V 是在“I”期間將產(chǎn)生的電壓,即流過電阻“R”的電流量。例如,1歐姆的電阻在1A的電流流過時(shí)會(huì)產(chǎn)生1V的壓降。
對(duì)于電阻器的瓦數(shù),可以使用下面給出的公式 -
P=I 2 R
其中 I 是最大電流,R 是電阻值。對(duì)于具有 1 歐姆電阻的 1A 電流,1 瓦的功率耗散就足夠了。然而,這對(duì)小型太陽能電池板項(xiàng)目很有用,但根本不適合與太陽能電網(wǎng)相關(guān)的應(yīng)用。在這種情況下,實(shí)際上需要使用非侵入式電流測(cè)量技術(shù)。在這種情況下,可以精確測(cè)量電流,其中可以測(cè)量非常低的電流量以及非常高的電流量。
鋰電池:
鋰電池的選擇是任何涉及太陽能電池板的項(xiàng)目的重要組成部分。因?yàn)槭冀K保持開啟并不斷檢查和提交數(shù)據(jù)的微控制器單元需要至少一百毫安的電流才能穩(wěn)定運(yùn)行。
當(dāng)由于季風(fēng)而沒有陽光照射時(shí),電池容量應(yīng)該可以為微控制器供電至少 4-5 天。從電池的角度來看,充電電流必須大于負(fù)載電流也很重要。如果有人將 100mA 的負(fù)載與電池連接并提供小于該值的充電電流,這是很不尋常的。為了安全起見,我們的充電電流至少應(yīng)該是負(fù)載電流的 5 倍。
另一方面,電池電壓需要高于微控制器所需的任何常用穩(wěn)壓器輸入電壓。例如,一個(gè) 7.4V 鋰電池可以連接在 3.3V 和 5.0V 線性穩(wěn)壓器上(因?yàn)榫€性穩(wěn)壓器需要比 LDO 和開關(guān)更高的壓差電壓。)
在我們的項(xiàng)目中,我們使用了額定電壓為 7.4V 的 4000mAH 電池。我們使用了一個(gè) 5.0V 穩(wěn)壓器,可為 ESP32 提供足夠的電流和電壓輸出。
分壓器:
分壓器是太陽能電池板電壓測(cè)量的重要組成部分。應(yīng)該選擇一個(gè)分壓器,根據(jù)微控制器 I/O 電壓輸入來分壓。
選擇上述電阻,使分壓器輸出電壓不應(yīng)超過微控制器最大 I/O 電壓(ESP32 為 3.3V)。但是,建議使用電位器,因?yàn)樗梢造`活地選擇任何更高或更低額定電壓的太陽能電池板,并且可以使用萬用表輕松設(shè)置電壓。
在我們的例子中,我們?cè)?MPPT 板電路中有一個(gè)電位計(jì),用作分壓器。我們?cè)O(shè)置分壓器的分壓系數(shù)為 6V。我們接了兩只萬用表,一只在鍋的輸入端,一只在鍋的輸出端,并設(shè)置當(dāng)輸入電壓為18V時(shí)輸出為3V,因?yàn)樘柲茈姵匕宓臉?biāo)稱輸出電壓為18V。
太陽能電池板的溫度傳感器:
太陽能電池板的功率輸出與太陽能電池板的溫度直接相關(guān)。為什么?因?yàn)殡S著太陽能電池板的溫度開始增加,太陽能電池板的輸出電流呈指數(shù)增長(zhǎng),而電壓輸出開始呈線性下降。
根據(jù)功率公式,瓦數(shù)等于電壓乘以電流 (W = V x A),即使電流增加,降低輸出電壓也會(huì)降低太陽能電池板的輸出功率?,F(xiàn)在,我們想到的下一個(gè)問題是,如何測(cè)量太陽溫度?好吧,這很有趣,因?yàn)樘柲茈姵匕逋ǔ1┞对跓岘h(huán)境中,因?yàn)樗┞对陉柟庵鄙湎?,原因很明顯。測(cè)量太陽能電池板溫度的最佳方法是使用平面溫度傳感器。還建議使用直接放置在太陽能電池板中的 K 型熱電偶。
對(duì)于我們的應(yīng)用,我們使用了基于熱敏電阻的溫度傳感器模塊,如下所示。
基于物聯(lián)網(wǎng)的太陽能監(jiān)測(cè)電路圖
啟用 IoT 的太陽能監(jiān)視器的完整電路圖如下所示。原理圖很簡(jiǎn)單。紅色點(diǎn)劃線板是我們?cè)谶@個(gè)項(xiàng)目中使用的 MPPT 板。
設(shè)置 ThingSpeak
使用 ThingSpeak 創(chuàng)建一個(gè)帳戶并轉(zhuǎn)到“我的頻道”選項(xiàng),然后單擊新頻道。
使用字段名稱創(chuàng)建一個(gè)新通道。
現(xiàn)在設(shè)置字段后,轉(zhuǎn)到可以使用 Write API Key的API Keys字段。需要在代碼中提供此密鑰以及通道 ID。
ThingSpeak 地址可在同一頁面上找到。
通過上述步驟,您可以非常輕松地設(shè)置 ThingSpeak。如果您想了解有關(guān)ThingSpeak 及其設(shè)置過程的更多信息,您可以查看我們之前關(guān)于該主題的文章。
使用 ESP32 進(jìn)行太陽能監(jiān)測(cè)的 Arduino 代碼
完整的 ESP32 太陽能監(jiān)控代碼可以在本頁底部找到。代碼首先定義您的 SSID、密碼和一些其他常量參數(shù),如下所示。 ??
?
// 為上行鏈路定義 WiFi SSID 和 PWD。 #define WLAN_SSID "xxxx" #define WLAN_PASS "xxxxxxxxxx"
?
在此字段中,需要設(shè)置 SSID 和密碼。
?
// 25 攝氏度時(shí)的電阻 #define THERMISTORNOMINAL 10000 // 溫度。對(duì)于標(biāo)稱電阻(幾乎總是 25 C) #define TEMPERATURENOMINAL 25 // 熱敏電阻的 beta 系數(shù)(通常為 3000-4000) #define BCOEFFICIENT 3950 //“其他”電阻的值 #define SERIESRESISTOR 10000
?
熱敏電阻標(biāo)稱歐姆是在標(biāo)稱溫度下提供的。根據(jù)熱敏電阻的數(shù)據(jù)表設(shè)置此值。放熱敏電阻的Beta系數(shù)和串聯(lián)電阻值。
?
// 為電流和電壓定義模擬 const int curr_an_pin = 35; 常量 int volt_an_pin = 34; 常量 int ntc_temp_an_pin = 33;
?
PIN 在這里定義。
?
#define thingSpeakAddress "xxxxxxxx" #define channelID xxxxx #define writeFeedAPIKey "xxxxxxx" #define readFeedAPIKey "xxxxxxx" #define readFieldAPIKey "xxxxxxxx" #define readStatusAPIKey "xxxxxxx"
?
放入thingSpeakAddress、channelID、Write Feed API Key。其余的東西不是必需的,但如果需要從 Web 接收數(shù)據(jù),它們?nèi)匀挥杏谩?/p>
?
void setup() { // 將您的設(shè)置代碼放在這里,運(yùn)行一次: // 將串口設(shè)置為 115200 Serial.begin(115200); //初始化串行 延遲(1000); WiFi.mode(WIFI_STA); ThingSpeak.begin(客戶端); // 初始化 ThingSpeak // todo: 創(chuàng)建一個(gè)任務(wù)來讀取引腳以獲取電流和電壓并計(jì)算太陽能電池板的瓦特和溫度 xTaskCreate( wifi_task, /* 任務(wù)函數(shù)。*/ "wifi_task", /* 名稱為的字符串task. */ 1024 * 2, /* 堆棧大?。ㄒ宰止?jié)為單位)。 */ NULL, /* 作為任務(wù)輸入傳遞的參數(shù) */ 5, /* 任務(wù)的優(yōu)先級(jí)。*/ 空);/* 任務(wù)句柄。*/ Serial.print("數(shù)據(jù)讀取。"); }
?
在上面的代碼中,初始化了 ThingSpeak 服務(wù)器并創(chuàng)建了一個(gè)任務(wù),該任務(wù)將獲取與太陽能電池板相關(guān)的數(shù)據(jù)。
在主回路中,太陽能電流和電壓通過模擬引腳進(jìn)行檢測(cè),并進(jìn)行平均。
?
浮動(dòng)太陽能curr_adc_val = 0; 浮動(dòng)太陽能伏特adc_val = 0; for (i = 0; i < NUMSAMPLES; i++) { curr_samples[i] = analogRead(curr_an_pin); volt_samples[i] = 模擬讀取(volt_an_pin); temp_samples[i] = 模擬讀取(ntc_temp_an_pin); 延遲(10); } // 平均所有樣本 float curr_avg = 0; 浮動(dòng) volt_avg = 0; 浮動(dòng) temp_avg = 0; for (i = 0; i < NUMSAMPLES; i++) { curr_avg += curr_samples[i]; volt_avg += volt_samples[i]; temp_avg += temp_samples[i]; } curr_avg /= NUM??SAMPLES; volt_avg /= NUM??SAMPLES; temp_avg /= NUM??SAMPLES; //Serial.print("ADC 值 = "); //Serial.println(ADC_VALUE); // 將 adc 值轉(zhuǎn)換為電壓以獲得實(shí)際電流和電壓。 float solar_curr = (curr_avg * 3.3) / (4095); 浮動(dòng)太陽能伏特=(伏特平均* 3.3)/(4095); //通過使用分壓器,我們降低了實(shí)際電壓。 //因此,我們將 6 乘以平均電壓,得到太陽能電池板的實(shí)際電壓。 太陽能電壓 *= 6;
?
太陽能電壓通過乘以 6 得到,因?yàn)槲覀儎?chuàng)建了將輸入電壓除以 6 倍的分壓器。
使用對(duì)數(shù)形式從熱敏電阻產(chǎn)生溫度。
?
// 將該值轉(zhuǎn)換為電阻 temp_avg = 4095 / temp_avg - 1; temp_avg = SERIESRESISTOR / temp_avg; //Serial.print("熱敏電阻"); //Serial.println(temp_avg); 浮動(dòng)斯坦哈特; steinhart = temp_avg / THERMISTORNOMINAL;// (R/Ro) steinhart = log(steinhart); // ln(R/Ro) steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro) steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To) steinhart = 1.0 / steinhart; // 反轉(zhuǎn) steinhart -= 273.15; // 將絕對(duì)溫度轉(zhuǎn)換為 C
?
每 15 秒讀取一次數(shù)據(jù)。
?
延遲(1000); 計(jì)數(shù)++; Serial.print("."); 如果(計(jì)數(shù) >= 15){ 計(jì)數(shù) = 0; Serial.println("============================================== ============================="); Serial.print("太陽能電壓 = "); Serial.println(solar_volt); Serial.print("太陽能電流 = "); Serial.println(solar_curr); 浮動(dòng)太陽能瓦特=太陽能伏特*太陽能電流; Serial.print("太陽能瓦特 = "); Serial.println(solar_watt); Serial.print("太陽溫度 = "); Serial.println(steinhart); Serial.println("============================================== =============================");
?
使用函數(shù)Thing.Speak.setField() 傳輸各個(gè)字段的數(shù)據(jù);連接 WiFi 時(shí)。
?
if (WiFi.status() == WL_CONNECTED) { ThingSpeak.setField(1, solar_volt); ThingSpeak.setField(2, solar_curr); ThingSpeak.setField(3, solar_watt); ThingSpeak.setField(4, steinhart); // 寫入 ThingSpeak 通道 int x = ThingSpeak.writeFields(channelID, writeFeedAPIKey); if (x == 200) { Serial.println("頻道更新成功。"); } else { Serial.println("更新頻道有問題。HTTP錯(cuò)誤碼" + String(x)); } } 其他 { Serial.println("\r\n######################################### ###################"); Serial.println("更新數(shù)據(jù)到thingSpeak服務(wù)器失敗。"); Serial.println("WiFi 未連接..."); Serial.println("############################################ ###############\r\n"); } Serial.print("數(shù)據(jù)讀取。"); } }
?
在以下代碼片段中創(chuàng)建的 Wi-Fi 任務(wù) -
?
void wifi_task( void * parameter ) { while (1) { if (WiFi.status() != WL_CONNECTED) { Serial.print("正在嘗試連接到 SSID:"); Serial.println(WLAN_SSID); 而(WiFi.status()!= WL_CONNECTED){ WiFi.begin(WLAN_SSID,WLAN_PASS);// 連接到 WPA/WPA2 網(wǎng)絡(luò)。如果使用開放或 WEP 網(wǎng)絡(luò),請(qǐng)更改此行 Serial.print("."); 延遲(5000); } Serial.println("\n已連接。"); 序列號(hào).println(); Serial.println("WiFi 連接"); Serial.println("IP地址:"); Serial.println(WiFi.localIP()); } vTaskDelay(1000/portTICK_PERIOD_MS); } vTaskDelete(NULL); }
?
測(cè)試和監(jiān)控?cái)?shù)據(jù)
將太陽能電池板與電路連接并放置在陽光下進(jìn)行測(cè)試,如下圖所示。
下面的視頻演示了完整的工作。我們的電路能夠從面板讀取輸出電壓、電流和功率,并在 thingspeak 頻道上實(shí)時(shí)更新,如下所示。
如我們所見,上圖中顯示了 15 分鐘的數(shù)據(jù)。由于這是一個(gè)戶外操作項(xiàng)目,因此需要使用適當(dāng)?shù)?PCB 以及一個(gè)封閉的盒子。外殼的制造方式需要使電路在雨中保持防水。
#include
#include "ThingSpeak.h"?
#include
#include
#include
// 為上行鏈路定義 WiFi SSID 和 PWD。
#define WLAN_SSID "xxxx"?
#define WLAN_PASS "xxxxxxxxxx"?
#define NUMSAMPLES 5?
int curr_samples[NUMSAMPLES];?
int volt_samples[NUMSAMPLES];?
int temp_samples[NUMSAMPLES];?
WiFiClient客戶端;
// 25 攝氏度時(shí)的電阻
#define THERMISTORNOMINAL 10000? ? ? ? ??
// 溫度。
#define SERIESRESISTOR 10000? ? ?
// 為電流和電壓定義模擬
const int curr_an_pin = 35;?
常量 int volt_an_pin = 34;?
常量 int ntc_temp_an_pin = 33;?
整數(shù)計(jì)數(shù) = 0;
// thingSpeak Details?
#define thingSpeakAddress "xxxxxxxx"? ??
#define channelID xxxxx? ? ? ? ? ? ? ? ? ? ??
#define writeFeedAPIKey "xxxxxxx"? ? ? ? ? ? ? ? ??
#define readFeedAPIKey "xxxxxxx"? ? ? ? ? ? ? ? ? ?
#define readFieldAPIKey "xxxxxxxx"? ? ? ? ? ? ? ? ?
#define readStatusAPIKey "xxxxxxx"? ? ? ? ? ? ? ? ?
void setup() {?
? // 把你的設(shè)置代碼放在這里, 運(yùn)行一次:
? // 將串口設(shè)置為 115200?
? Serial.begin(115200);
? WiFi.mode(WIFI_STA);?
? ThingSpeak.begin(客戶端); // 初始化 ThingSpeak?
? // todo: 創(chuàng)建一個(gè)任務(wù)來讀取引腳以獲取電流和電壓并計(jì)算太陽能電池板的瓦特和溫度
? xTaskCreate(?
? ? ? ? ? ? ? ? wifi_task, /* 任務(wù)函數(shù)。*/?
? ? ? ? ? ? ? ? "wifi_task", /* 名稱為的字符串task. */?
? ? ? ? ? ? ? ? 1024 * 2, /* 以字節(jié)為單位的堆棧大小。*/?
? ? ? ? ? ? ? ? NULL, /* 作為任務(wù)輸入傳遞的參數(shù) */?
? ? ? ? ? ? ? ? 5, /* 任務(wù)的優(yōu)先級(jí)。*/?
? ? ? ? ? ? ? ? NULL); /* 任務(wù)句柄。*/?
? Serial.print("數(shù)據(jù)讀取。");?
}
無效循環(huán)() {
? // 把你的主要代碼放在這里,重復(fù)運(yùn)行:
? int i=0;?
? 浮動(dòng)太陽能curr_adc_val = 0;
? 浮動(dòng)太陽能伏特adc_val = 0;
? for (i = 0; i < NUMSAMPLES; i++) {?
? ? ? ? ? ? ? ? curr_samples[i] = analogRead(curr_an_pin);?
? ? ? ? ? ? ? ? volt_samples[i] = 模擬讀?。╲olt_an_pin);
? ? ? ? ? ? ? ? temp_samples[i] = 模擬讀?。╪tc_temp_an_pin);
? ? ? ? ? ? ? ? 延遲(10);
? }?
? // 平均所有樣本
? float curr_avg = 0;?
? 浮動(dòng) volt_avg = 0;?
? 浮動(dòng) temp_avg = 0;?
? for (i = 0; i < NUMSAMPLES; i++) {?
? ? ? ? ? ? ? ? curr_avg += curr_samples[i];?
? ? ? ? ? ? ? ? volt_avg += volt_samples[i];?
? ? ? ? ? ? ? ? temp_avg += temp_samples[i];
? }?
? curr_avg /= NUM??SAMPLES;?
? volt_avg /= NUM??SAMPLES;?
? temp_avg /= NUM??SAMPLES;?
? //Serial.print("ADC 值 = ");?
? //Serial.println(ADC_VALUE);?
? // 將 adc 值轉(zhuǎn)換為電壓以獲得實(shí)際電流和電壓。
? float solar_curr = (curr_avg * 3.3) / (4095);?
? 浮動(dòng)太陽能伏特=(伏特平均* 3.3)/(4095);
? //通過使用分壓器,我們降低了實(shí)際電壓。
? //因此,我們將 6 乘以平均電壓,得到太陽能電池板的實(shí)際電壓。
? 太陽能電壓 *= 6;
? // 將該值轉(zhuǎn)換為電阻
? temp_avg = 4095 / temp_avg - 1;?
? temp_avg = SERIESRESISTOR / temp_avg;
? //Serial.print("熱敏電阻");
? //Serial.println(temp_avg);?
? 浮動(dòng)斯坦哈特;
? steinhart = temp_avg / THERMISTORNOMINAL;// (R/Ro)?
? steinhart = log(steinhart); // ln(R/Ro)?
? steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)?
? steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)?
? steinhart = 1.0 / steinhart; // 反轉(zhuǎn)
? steinhart -= 273.15; // 將絕對(duì)溫度轉(zhuǎn)換為 C
? 延遲(1000);
? 計(jì)數(shù)++;
? Serial.print(".");?
? 如果(計(jì)數(shù) >= 15){
? ? ? ? ? ? ? ? 計(jì)數(shù) = 0;?
? ? ? ? ? ? ? ? Serial.println("============================================== =============================");
? ? ? ? ? ? ? ? Serial.print("太陽能電壓 = ");?
? ? ? ? ? ? ? ? Serial.println(solar_volt);?
? ? ? ? ? ? ? ? Serial.print("太陽能電流 = ");?
? ? ? ? ? ? ? ? Serial.println(solar_curr);?
? ? ? ? ? ? ? ? 浮動(dòng)太陽能瓦特=太陽能伏特*太陽能電流;
? ? ? ? ? ? ? ? Serial.print("太陽能瓦特 = ");?
? ? ? ? ? ? ? ? Serial.println(solar_watt);?
? ? ? ? ? ? ? ? Serial.print("太陽溫度 = ");?
? ? ? ? ? ? ? ? Serial.println(steinhart);?
? ? ? ? ? ? ? ? Serial.println("============================================== =============================");?
? ? ? ? ? ? ? ? if (WiFi.status() == WL_CONNECTED) {?
? ? ? ? ? ? ? ? ThingSpeak.setField(1, solar_volt);?
? ? ? ? ? ? ? ? 物語。
? ? ? ? ? ? ? ? ThingSpeak.setField(3, solar_watt);?
? ? ? ? ? ? ? ? ThingSpeak.setField(4, steinhart);?
? ? ? ? ? ? ? ? // 寫入 ThingSpeak 通道
? ? ? ? ? ? ? ? int x = ThingSpeak.writeFields(channelID, writeFeedAPIKey);?
? ? ? ? ? ? ? ? if (x == 200) {?
? ? ? ? ? ? ? ? Serial.println("頻道更新成功。");?
? ? ? ? ? ? ? ? }?
? ? ? ? ? ? ? ? else {?
? ? ? ? ? ? ? ? Serial.println("更新頻道有問題。HTTP錯(cuò)誤碼" + String(x));?
? ? ? ? ? ? ? ? }?
? ? ? ? ? ? ? ? } else {?
? ? ? ? ? ? ? ? Serial.println("\r\n#################################### #######################");?
? ? ? ? ? ? ? ? Serial.println("更新數(shù)據(jù)到thingSpeak服務(wù)器失敗。");
? ? ? ? ? ? ? ? Serial.println("WiFi 未連接...");?
? ? ? ? ? ? ? ? Serial.println("############################################ ###############\r\n");?
? ? ? ? ? ? ? ? }?
? Serial.print("數(shù)據(jù)讀取。");?
? }?
}?
void wifi_task( void * parameter ) {?
? while (1) {?
? ? ? ? ? ? ? ? if (WiFi.status() != WL_CONNECTED) {?
? ? ? ? ? ? ? ? Serial.print("正在嘗試連接到 SSID:");?
? ? ? ? ? ? ? ? Serial.println(WLAN_SSID);?
? ? ? ? ? ? ? ? 而(WiFi.status()!= WL_CONNECTED){?
? ? ? ? ? ? ? ? WiFi.begin(WLAN_SSID,WLAN_PASS);// 連接到 WPA/WPA2 網(wǎng)絡(luò)。如果使用開放或 WEP 網(wǎng)絡(luò),請(qǐng)更改此行
? ? ? ? ? ? ? ? Serial.print(".");
? ? ? ? ? ? ? ? }?
? ? ? ? ? ? ? ? Serial.println("\n已連接。");?
? ? ? ? ? ? ? ? 序列號(hào).println();?
? ? ? ? ? ? ? ? Serial.println("WiFi 連接");?
? ? ? ? ? ? ? ? Serial.println("IP地址:");?
? ? ? ? ? ? ? ? Serial.println(WiFi.localIP());?
? ? ? ? ? ? ? ? }?
? ? ? ? ? ? ? ? vTaskDelay(1000/portTICK_PERIOD_MS);?
? }?
? vTaskDelete(NULL);?
}
評(píng)論
查看更多