偵測ESP8266的Wi-Fi RSSI(接收信號強度)的Arduino和MicroPython程式

某些ESP8266控制板有外接天線插座,但如同網友的這則留言提到的,外接天線有時不但沒有效果(需要一併修改電路板上的元件接線),甚至可能適得其反。天線設計是個專門的學問,筆者不是這方面的專家,只有在8年前做過DVB-T數位電視天線,還有加長FM立體聲發射器的天線

判斷外接天線是否有效,可從ESP8266連接Wi-Fi無線接入點的RSSI(接收信號強度)得知。

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

延伸閱讀

Posts created 470

發佈留言

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

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top