ESP8266のWiFi受信強度


ESP8266モジューはいずれもESP8266EXチップ+Flashメモリーで構成されています。
WiFiルーターから6Mぐらい離れた隣の部屋にESP8266を設置して、各モデルのWiFi受信強度(RSSI)を調べてみました。
10秒毎に30回のRSSIを求め、その平均値をMQTTで飛ばします。
#include <ESP8266WiFi.h>
#include <PubSubClient.h> // https://github.com/knolleary/pubsubclient

#define MQTT_PORT       1883
#define MQTT_TOPIC      "/topic/rssi" // You can change
#define MQTT_WILL_MSG   "I am leaving..." // You can change
#define MQTT_SERVER     "192.168.10.40"
#define PAYLOAD_SIZE    50
#define TOTAL           30

const char* SSID = "ルータのSSID";
const char* PASSWORD = "ルータのパスワード";

WiFiClient espClient;
PubSubClient client(espClient);

unsigned long lastMillis;
long rssi_table[TOTAL];

void setup(){
  delay(1000); Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, PASSWORD);

  Serial.print("Wait for WiFi...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("subnetMask: ");
  Serial.println(WiFi.subnetMask());
  Serial.print("gatewayIP: ");
  Serial.println(WiFi.gatewayIP());
  Serial.print("ESP ChipId:");
  Serial.print(ESP.getChipId());
  Serial.println();

  client.setServer(MQTT_SERVER, MQTT_PORT);
  char clientid[20];
  sprintf(clientid,"ESP8266-%06x",ESP.getChipId());
  Serial.print("clientid=");
  Serial.println(clientid);
  Serial.print("Attempting MQTT connection...");
  // Attempt to connect
  if (strlen(MQTT_WILL_MSG)) {
    if (!client.connect(clientid,MQTT_TOPIC,0,0,MQTT_WILL_MSG)) {
      delay(10*1000);
      Serial.println("failed");
      ESP.restart();
    }
  } else {
    if (!client.connect(clientid)) {
      delay(10*1000);
      Serial.println("failed");
      ESP.restart();
    }
  }
  Serial.println("connected");

  long rssi1 = WiFi.RSSI();
  Serial.print("RSSI:");
  Serial.println(rssi1);

  lastMillis = millis();
}

void loop() {
  static int index = 0;
  char payload[PAYLOAD_SIZE];

  if (!client.connected()) {
    delay(10*1000);
    ESP.restart();
  }
  client.loop();
 
  long now = millis();
  if (now - lastMillis > 10000) {
    lastMillis = now;
    if (index < TOTAL) {
      long rssi1 = WiFi.RSSI();
      Serial.print("RSSI[");
      Serial.print(index);
      Serial.print("]=");
      Serial.println(rssi1);

      snprintf (payload, PAYLOAD_SIZE, "RSSI[%d]=%ld", index, rssi1);
      Serial.print("Publish message: ");
      Serial.println(payload);
      if (!client.publish(MQTT_TOPIC, payload)) {
        delay(10*1000);
        ESP.restart();
      }
     
      rssi_table[index] = rssi1;
      index++;
    } else {
      long total = 0;
      for(int i=0;i<TOTAL;i++) {
        total = total + rssi_table[i];
      }
      float average = (float)total / (float)TOTAL;
      Serial.print("average=");
      Serial.println(average);

      snprintf (payload, PAYLOAD_SIZE, "RSSI average=%f", average);
      Serial.print("Publish message: ");
      Serial.println(payload);
      if (!client.publish(MQTT_TOPIC, payload)) {
        delay(10*1000);
        ESP.restart();
      }
    }
  }
}

アンテナ形状がFL-IPXのESPには2.4GHz用のアンテナを付けています。
モデル アンテナ形状 RSSI(dBm)
ESP-12E PCB -58.133
ESP-12F PCB -60.799
ESP-12S PCB -59.099
ESP-13 PCB -57.233
ESP-WROOM-02 PCB -59.633
ESP-07S FL-IPX -56.200
ESP-WROOM-02U FL-IPX -50.266

PCBの物は、ほぼ同じ感度です。
ESP-07SとESP-WROOM-02Uは同じアンテナを付けましたが、数値がかなり違います。