使用Arduino開發板和ESP8266從互聯網讀取數據

使用Arduino開發板和ESP8266從互聯網讀取數據

來自專欄 Arduino開發板雜談

ESP8266-01是一款很強大的模塊,可以滿足我們任何IOT項目的需求。自發布以來,它已經形成了一個很強大的群體,並演變成一個易於使用、價格低廉且功能強大的Wi-Fi模塊。另一個更受歡迎的開源平台是Arduino開發板,圍繞該平台,已經建立起大量的項目。將這兩個平台相結合將為許多創新項目打開大門,因此在本教程中,我們將學習如何將ESP8266-01模塊與Arduino進行連接。這樣就可以在Arduino開發板和互聯網之間發送或接收數據。

為了實現目標,我們將使用ESP8266-01通過一個API介面從互聯網中讀取時間、日期、溫度和濕度。然後將這些值發送到Arduino板,並將它們顯示在LCD顯示屏1602上。聽起來是不是很酷!那麼讓我們開始吧。

所需的材料

● Arduino開發板

● ESP8266-01模塊

● 帶有3.3V選項的FTDI編程電路板

● 液晶顯示屏1602

● 電位器

● 按鈕

● 連接導線

● 麵包板

如何工作的?

在我們深入研究之前,了解這件事情的實際情況非常重要。我們需要從ESP8266-01模塊的基礎開始。使用Arduino IDE對ESP8266編程,並將編寫代碼以使用API通過http請求讀取JSON文件。然後將解析這個JSON文件,從完整的JSON文件中只提取所需的信息。

一旦信息解析完成,我們將使用串列通信將其列印出來。這些串口線連接到Arduino,以便Arduino可以讀取ESP8266發送的信息。一旦信息被讀取和處理,我們將在LCD液晶屏上進行顯示。

如果你還沒有完全理解,沒關係,我們將在本文的其餘部分進行介紹。

編程ESP8266-01

本教程假定您有一些ESP8266模塊的使用經驗。如果沒有的話,建議閱讀以下三個教程以更好地理解。

開始使用ESP8266-01

使用AT命令編程ESP8266-01

使用Arduino IDE編程ESP8266-01並進行燒寫程序

在這裡,我們將使用Arduino IDE編程ESP8266-01模塊。硬體方面,我們使用3.3V的FTDI板編程ESP8266,因為它可以使硬體變得非常簡單。下圖顯示了將ESP8266與FTDI板連接的電路圖。

確保滿足以下條件

1. ESP8266-01模塊只支持3.3V,不要使用5V。所以只能在3.3V模式下設置FTDI。

2. 編程模式下,GPIO_0必須接地

3. 複位引腳應通過按鈕連接到接地引腳。上傳代碼之前應該按下該按鈕。每次按下該按鈕時,ESP8266-01模塊上的藍色LED指示燈將變為高電平,表示模塊已複位。

連接完成後,打開Arduino IDE並檢查是否可以成功上傳示常式序。如果您不確定如何使用Arduino IDE將程序上傳至ESP8266,請閱讀Arduino編程ESP8266進行學習。

現在讓我們進入實際的程序,我們將從互聯網獲取數據並將其發送給Arduino。完整的程序在本文末尾處給出,我將其分開對其進行解釋。該程序編譯時還需要Arduino JSON庫,所以如果您尚未將該庫添加到Arduino IDE中,則可以通過從Github的Arduino JSON庫下載並進行添加。

ESP8266必須連接互聯網才能獲得有關日期、時間、溫度和濕度的數據。所以你在下面的代碼中必須提供SSID和密碼,允許它來連接到你的Wi-Fi。

  1. const char* ssid = "JIO-Fi"; //Enter your Wi-Fi SSID

  2. const char* password = "Pas123"; //Enter you Wi-Fi Password

複製代碼

setup()函數中,我們檢查ESP是否能夠連接到Wi-Fi,如果沒有,只需在串列監視器上列印「Connecting ..」,它將一直等待。

  1. while (WiFi.status() != WL_CONNECTED) { //Wait till Wi-Fi is connected

  2. delay(1000);

  3. Serial.print("Connecting.."); //Print Connecting.. till connection is established
  4. }

複製代碼

下一步是非常重要的一步。如果Wi-Fi連接成功,我們必須調用http get請求從互聯網讀取JSON文件。在本教程中,我使用wunderground.com提供的API。因此,如果您打算使用相同的API,則可以進入鏈接並註冊免費API密鑰或使用您選擇的任何API。一旦你完成了你的API,你將最終得到一個如下所示的鏈接

api.wunderground.com/ap

注意:我已更改此鏈接的API密鑰,因此這不會起作用。請注意保持您的API密鑰安全,不要共享。

我的API用於獲取Chennai的天氣數據。您可以使用任何API。但是當你在任何瀏覽器中載入API時,它應該返回一個JSON文件。例如我的API返回以下JSON文件

您可能會返回具有不同數據的文件。我們可以通過讀取它來檢查ESP8266是否也收到了這個JSON文件,然後在串列監視器上使用列印JSON,代碼如下:

  1. int httpCode = http.GET(); //pass a get request

  2. if (httpCode > 0) { //Check the returning code

  3. // payload = http.getString(); // Store the value on varibale Payload for debugging

  4. // Serial.println(payload); //Print the payload for debugging otherwise comment both lines

複製代碼

我已經注釋掉這些代碼,因為它們僅用於測試。一旦確保ESP8266能夠獲取JSON數據,就需要對數據進行解析。正如你所看到的,這些數據量很大,除了我們需要的數據如日期、時間、溫度和濕度外,大部分數據都是無用的。

所以我們使用JSON Arduino庫來分離需要的值並將其存儲在一個變數中。這種方法是可行的,因為JSON文件中的值被分配為名稱值對。所以這個名字是一個字元串,它將保存我們所需的值。

要實現這一點,我們需要轉到一個網站,它將分析JSON文件並給我們提供Arduino代碼。是的,就像那樣簡單。前往arduinojson.org/assista並粘貼我們在瀏覽器中載入的JSON文件,然後按Enter鍵。完成後我看起來像下面這樣

向下滾動一下,查看自動創建的解析程序

你所要做的就是選擇想要的變數,將它們複製並粘貼到你的Arduino IDE上,就像我做的一樣。

  1. /*Phrasing Data using the JSON librarey */ //Use arduinojson.org/assista to get the phrasing values for your JSON string

  2. const size_t bufferSize = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(8) + JSON_OBJECT_SIZE(12) + JSON_OBJECT_SIZE(56) + 2160;

  3. DynamicJsonBuffer jsonBuffer(bufferSize);

  4. JsonObject& root = jsonBuffer.parseObject(http.getString());

  5. /*End of Phrasing Data*/

  6. //Address the value sin to desired variables
  7. JsonObject& current_observation = root["current_observation"]; //under current_observation

  8. JsonObject& current_observation_observation_location = current_observation["observation_location"]; //under observation_location

  9. const char* current_observation_station_id = current_observation["station_id"]; // "ICHENNAI1" //get the location detials

  10. const char* current_observation_local_time_rfc822 = current_observation["local_time_rfc822"]; //Local time //get the local time

  11. const char* current_observation_temperature_string = current_observation["temperature_string"]; // "90.7 F (32.6 C)" //get the temperature value

  12. const char* current_observation_relative_humidity = current_observation["relative_humidity"]; // "73%" //get the humidity value

複製代碼

我剛剛複製了變數current_observation_station_id、current_observation_local_time_rfc822、current_observation_temperature_string和current_observation_relative_humidity。因為我們打算在液晶顯示屏上只顯示這四個數據。

最終,我們從互聯網獲得了我們需要的數據,並將其保存為一個可以輕鬆使用的變數。要將這些數據發送到Arduino,我們只需通過串列監視器將它們串列寫入。可以使用以下代碼:

  1. //Print the variables through serial monitor

  2. Serial.print (current_observation_station_id); //send the location details to Arduino

  3. delay(100); //stability delay

  4. Serial.print (current_observation_local_time_rfc822); //send the local time details to Arduino

  5. delay(100); //stability delay

  6. Serial.print (current_observation_temperature_string); //send the temperature details to Arduino

  7. delay(100); //stability delay

  8. Serial.print (current_observation_relative_humidity); //send the humidity details to Arduino

  9. delay(100); //stability delay

複製代碼

請注意,我使用的是Serial.print()而不是Serial.println(),因為Serial.println()命令會將不需要的/ n和/ r追加到數據中,另外。我們還增加了10秒的延遲,以便ESP8266將這些值僅在10秒的時間間隔周期內發送給Arduino開發板。

原文鏈接:

使用Arduino開發板和ESP8266從互聯網讀取數據 - Arduino專區 - 一板網電子技術論壇?

www.yiboard.com

更多有關Arduino開發板的教程請關注公眾號「一板網電子技術論壇」。

推薦閱讀:

學習單片機的幾個誤區
A、B按鈕控制數字的增減、循環
eM4 OS設計中的可重入性
看看這個立黨的嘴臉

TAG:單片機 | 開源硬體 |