ESP32 乙太網路 WT32-ETH01試用報告

經常有朋友跟我抱怨ESP32的WiFi效果不好,經常斷線之類,雖然WiFi已經是IoT的主流了,但是如果有一些服務希望能更加穩定,那還是得回到有線網路。

我的ESP32實做書籍:我出書了 ESP32 物聯網專題
博客來網址:https://www.books.com.tw/products/0010901195


經常有朋友跟我抱怨ESP32的WiFi效果不好,經常斷線之類,雖然WiFi已經是IoT的主流了,但是如果有一些服務希望能更加穩定,那還是得回到有線網路。

應廠商的需求開始尋找帶RJ45網路口的,價格也希望不要太貴

找到這款:WT32-ETH01,內建乙太網路接口(露天拍賣:https://www.ruten.com.tw/item/show?22118190035901

WT32-ETH01內建乙太網路接口

核心是ESP32,除了乙太網路之外,WiFi、BLE還是有內建,Arduino的開發環境請參考:第一篇 ESP32 Arduino開發環境架設(取代Arduino UNO及ESP8266首選)

不過程式上傳到是有點麻煩,由於沒有usb接口,所以需要usbttl線上傳,且這款沒有一鍵上傳,也沒有RTS按鈕,所以上傳程式比ESP32CAM還複雜,ESP32CAM至少還有RTS按鈕

先將CP2102接上,可參考下圖

IO0+GND(藍色)是模式切換用

EN+GND(棕色)是當作RTS用

WT32-ETH01接CP2102線路圖

程式上傳時,請依照以下步驟

  1. IO0+GND(上圖藍色)對接
  2. 將EN+GND(上圖棕色)對接,然後斷開(重開機)
  3. 檢查序列視窗:Waiting for download
  4. 按Arduino上傳按鈕
  5. 等候程式上傳完畢後
  6. 將IO0+GND(上圖藍色)斷開
  7. 將EN+GND(上圖棕色)對接,然後斷開(重開機)

程式部份的差異則是在於宣告乙太網路,並啟動連線,一旦連線成功,就與原本的WiFi無差別,例如HttpClient、WiFiClient等等的,宣告部份主要是腳位設定

#define ETH_ADDR        1
#define ETH_POWER_PIN  16
#define ETH_MDC_PIN    23
#define ETH_MDIO_PIN   18
#define ETH_TYPE       ETH_PHY_LAN8720
#define ETH_CLK_MODE   ETH_CLOCK_GPIO0_IN

老實講,這個我搜尋+測試一整個晚上才找到正確的數值,其實也是很辛苦的

下面這個程式則是下載環保署的空氣品質網站,讀者可以發現讀取的方式與WiFi環境是完全相同。

#include <ETH.h> //引用ETH
#include <HTTPClient.h>

#define ETH_ADDR        1
#define ETH_POWER_PIN  16
#define ETH_MDC_PIN    23
#define ETH_MDIO_PIN   18
#define ETH_TYPE       ETH_PHY_LAN8720
#define ETH_CLK_MODE   ETH_CLOCK_GPIO0_IN

char url[] = "http://opendata2.epa.gov.tw/AQI.json"; //PM2.5的網址
void setup()
{
  Serial.begin(115200);
  Serial.println();
  ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLK_MODE); //啟用網路
  while (!((uint32_t)ETH.localIP())) //等候DHCP取得IP
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("Connected");
  Serial.print("IP Address:");
  Serial.println(ETH.localIP());
}

void loop()
{
  HTTPClient http;
  http.begin(url);
  int httpCode = http.GET();
  Serial.print("httpCode=");
  Serial.println(httpCode);
  if (httpCode == HTTP_CODE_OK) {
    String payload = http.getString();
    Serial.print("payload=");
    Serial.println(payload);
  }
  http.end();
  delay(10000);
}

本文主要參考:Esp32, NuttX, and Ethernet on a WT32-ETH01

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *