某些ESP8266控制板有外接天線插座,但如同網友的這則留言提到的,外接天線有時不但沒有效果(需要一併修改電路板上的元件接線),甚至可能適得其反。天線設計是個專門的學問,筆者不是這方面的專家,只有在8年前做過DVB-T數位電視天線,還有加長FM立體聲發射器的天線。
判斷外接天線是否有效,可從ESP8266連接Wi-Fi無線接入點的RSSI(接收信號強度)得知。
本文提供ESP8266的Arduino語言(C程式)版本,以及MicroPython程式版本,分別在Arduino IDE的序列埠監控視窗和MicroPython終端機,每隔2秒顯示當前的RSSI數值。
偵測RSSI值的Arduino程式
底下是MicroPython版本的程式碼,透過ESP8266WiFi程式庫的RSSI()方法,取得RSSI值。關於Wi-Fi聯網和ESP8266WiFi程式庫的相關說明,請參閱《超圖解物聯網IoT實作入門》第12章「使用ESP8266WiFi程式庫連接無線網路」一節(12-24頁)。
#include <ESP8266WiFi.h> // Wi-Fi基地台的名稱和密碼 const char* ssid = "無線網路AP名稱"; const char* password = "無線網路密碼"; unsigned long previousMillis = 0; const long interval = 2000; void setup(void) { Serial.begin(9600); WiFi.mode(WIFI_STA); delay(100); WiFi.begin(ssid, password); Serial.print("Connecting Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.print("\nConnected to: "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); Serial.println(""); delay(1000); } void loop(void) { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // 讀取RSSI數值 int rssi = WiFi.RSSI(); Serial.print("RSSI: "); Serial.println(rssi); } }
編譯並上傳程式碼之後,開啟序列埠監控視窗,將能看到類似下圖的結果:
偵測RSSI值的MicroPython程式
底下是MicroPython版本的程式碼,使用Timer(計時器)每個2秒顯示網路RSSI值,直接貼入終端機即可執行;按下Ctrl和C鍵可中斷執行。關於定時執行程式碼的說明,請參閱《超圖解 Python 物聯網實作入門》8-2頁。
import network from machine import Timer wlan = network.WLAN(network.STA_IF) def connectAP(ssid, pwd): if not wlan.isconnected(): wlan.active(True) wlan.connect(ssid, pwd) while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) connectAP("無線網路AP名稱", "無線網路密碼") # 每2秒顯示信號強度 tim = Timer(-1) tim.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print('RSSI:', wlan.status('rssi'))) try: while True: pass except: tim.deinit() print('bye!')