hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

Wi-FiをスキャンしてSSID,ch,RSSIをLCDに表示する

2022-05-11 14:45:06 | マイコンソフトウェア

ESPr Developer(ESP-WROOM-02)を使って作り、ケースに収納しました。追記2022/06/23
プラスチックケース黒135x75x49秋月電子通販コードP-02774

余り物マイコンボードとLCDでWi-Fi測定器(?)作成しました。
ビーコンを受信して表示しますが、ぼかしてますが2つのSSID表示してます。
2つのSSIDに対応するRSSI(信号強度)とチャンネルを表示しています。
code中の記号<、>は半角に修正必要です。

/*WiFiScan.inoをLCD表示するように改変しました
1602,2004LCD用 I2C I/Fモジュールを使って8-BIT PARALLEL INTERFACEの2004LCDをI2C接続します 2004は20文字4行のLCDです ESP-WROOM-02 IO5-SCL,IO4-SDA ESP32 GPIO22-SCL,GPIO21-SDA*/
//#include "WiFi.h"//esp32のとき
#include "ESP8266WiFi.h"//esp8266(ESP-WROOM-02)のとき
#include <LiquidCrystal_PCF8574.h>//LCD表示用
#include <Wire.h>//LCD表示用
String ssid[32];
int8_t ch[32] , rssi[32];//配列
LiquidCrystal_PCF8574 lcd(0x27);
void setup() {
Serial.begin(115200);
Wire.begin();//LCD
// Set WiFi to station mode and disconnect from an AP if it was previously connected
// WiFiをステーションモードに設定し、以前接続していたAPを切断する。
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
//Serial.println("Setup done");//LCD出力へ変更します
lcd.begin(20, 4); // initialize the lcd
lcd.setBacklight(1);
lcd.home();
lcd.clear();
lcd.print("Setup done");
delay(5000);
}
void loop() {
//Serial.println("scan start");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Scanning now");
// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
//Serial.println("scan done");
if (n == 0) {
//Serial.println("no networks found");
lcd.print("no networks found");
} else {
//Serial.print(n);
//Serial.println(" networks found");
for (int i = 0; i < n; ++i) {
// Print SSID and RSSI for each network found
//Serial.print(i + 1);
//Serial.print(": "); //Serial.print(WiFi.SSID(i));
//Serial.print(" ("); //Serial.print(WiFi.RSSI(i));
//Serial.print(")");
//Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");//esp8266のとき
//Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");//esp32のとき
ssid[i] = WiFi.SSID(i);//文字列です
rssi[i] = WiFi.RSSI(i);
ch[i] = WiFi.channel(i);
delay(20);
}
/*20文字x4行LCDに先ずSSID表示し対応するRSSIとchを同じ行に表示します。
表示を切り替えながらSSID,RSSI,chを8つまで表示します。
SSIDが無いときはNo Dataと表示し、RSSIとchは0を表示します。*/
lcd.clear();
lcd.setCursor(0, 0); lcd.print(ssid[0]); // コンパクトに記述する方法は無いか?
lcd.setCursor(0, 1); lcd.print(ssid[1]);
lcd.setCursor(0, 2); lcd.print(ssid[2]);
lcd.setCursor(0, 3); lcd.print(ssid[3]);
delay(3000);
lcd.clear();
lcd.setCursor(0, 0); lcd.print(rssi[0]);
lcd.setCursor(5, 0); lcd.print(ch[0]);
lcd.setCursor(8, 0); lcd.print("ch");
lcd.setCursor(0, 1); lcd.print(rssi[1]);
lcd.setCursor(5, 1); lcd.print(ch[1]);
lcd.setCursor(8, 1); lcd.print("ch");
lcd.setCursor(0, 2); lcd.print(rssi[2]);
lcd.setCursor(5, 2); lcd.print(ch[2]);
lcd.setCursor(8, 2); lcd.print("ch");
lcd.setCursor(0, 3); lcd.print(rssi[3]);
lcd.setCursor(5, 3); lcd.print(ch[3]);
lcd.setCursor(8, 3); lcd.print("ch");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0); lcd.print(ssid[4]);
lcd.setCursor(0, 1); lcd.print(ssid[5]);
lcd.setCursor(0, 2); lcd.print(ssid[6]);
lcd.setCursor(0, 3); lcd.print(ssid[7]);
delay(3000);
lcd.clear();
lcd.setCursor(0, 0); lcd.print(rssi[4]);
lcd.setCursor(5, 0); lcd.print(ch[4]);
lcd.setCursor(8, 0); lcd.print("ch");
lcd.setCursor(0, 1); lcd.print(rssi[5]);
lcd.setCursor(5, 1); lcd.print(ch[5]);
lcd.setCursor(8, 1); lcd.print("ch");
lcd.setCursor(0, 2); lcd.print(rssi[6]);
lcd.setCursor(5, 2); lcd.print(ch[6]);
lcd.setCursor(8, 2); lcd.print("ch");
lcd.setCursor(0, 3); lcd.print(rssi[7]);
lcd.setCursor(5, 3); lcd.print(ch[7]);
lcd.setCursor(8, 3); lcd.print("ch");
}
for (int i = 0; i <= 32; ++i) {
ssid[i] = "No data";
ch[i] = 0;
rssi[i] = 0;
}
//Serial.println("");
// Wait a bit before scanning again
delay(3000);
}

サンプルスケッチや作例を公開されている方々に感謝します。