某些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!')
