Description

This project demonstrates how to build a basic serial CLI (Command Line Interface) menu on the ESP32-C3 using the Arduino IDE. Instead of endlessly looping code, this approach waits for user input over serial to trigger specific actions—in this case, scanning for nearby Wi-Fi networks.


Full Source Code:

#include "WiFi.h"

// Flag to indicate whether we should scan Wi-Fi
bool wifiScan = false;

void showMenu() {
  Serial.println(F(" _________________________"));
  Serial.println(F("|     ESP32-C3 Super     |"));
  Serial.println(F("|      Mini Board        |"));
  Serial.println(F("|------------------------|"));
  Serial.println(F("| [ ] EN           IO10  |"));  
  Serial.println(F("| [ ] 3V3          IO6   |"));
  Serial.println(F("| [ ] IO0          IO7   |"));
  Serial.println(F("| [ ] GND          IO5   |"));
  Serial.println(F("| [ ] IO1          IO4   |"));
  Serial.println(F("| [ ] IO2          IO3   |"));
  Serial.println(F("| [ ] IO8          GND   |"));
  Serial.println(F("| [ ] IO9          5V    |"));
  Serial.println(F("|------------------------|"));
  Serial.println(F("|__USB-C________RST BTN__|"));
  Serial.println(F("")); 
  Serial.println(F("  [s]  Wi-Fi scan      "));
  Serial.println(F("  [m]  Show menu again "));
}

void handleMenuInput(char input) {
  switch (input) {
    case 's':
      wifiScan = true;
      break;
    case 'm':
      showMenu();
      break;
    default:
      Serial.println(F("? Unknown command. Type 'm' to show menu options."));
      break;
  }
}

void scanWifi() {
  Serial.println("\nStarting Wi-Fi Scan...");

  int n = WiFi.scanNetworks();
  Serial.println("Scan complete.");

  if (n == 0) {
    Serial.println("No networks found.");
  } else {
    Serial.printf("%d networks found:\n", n);
    Serial.println("Nr | SSID                             | RSSI | CH | Encryption");

    for (int i = 0; i < n; ++i) {
      Serial.printf("%2d | %-32.32s | %4d | %2d | ",
                    i + 1,
                    WiFi.SSID(i).c_str(),
                    WiFi.RSSI(i),
                    WiFi.channel(i));

      switch (WiFi.encryptionType(i)) {
        case WIFI_AUTH_OPEN:           Serial.print("Open"); break;
        case WIFI_AUTH_WEP:            Serial.print("WEP"); break;
        case WIFI_AUTH_WPA_PSK:        Serial.print("WPA"); break;
        case WIFI_AUTH_WPA2_PSK:       Serial.print("WPA2"); break;
        case WIFI_AUTH_WPA_WPA2_PSK:   Serial.print("WPA+WPA2"); break;
        case WIFI_AUTH_WPA2_ENTERPRISE:Serial.print("WPA2-EAP"); break;
        case WIFI_AUTH_WPA3_PSK:       Serial.print("WPA3"); break;
        case WIFI_AUTH_WPA2_WPA3_PSK:  Serial.print("WPA2+WPA3"); break;
        case WIFI_AUTH_WAPI_PSK:       Serial.print("WAPI"); break;
        default:                       Serial.print("Unknown"); break;
      }

      Serial.println();
      delay(10);
    }
  }

  WiFi.scanDelete(); // free memory from scan result

  wifiScan = false; // reset flag
}

void setup() {
  Serial.begin(115200);

  // Set Wi-Fi to station mode and disconnect from any previous connection
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Serial.println("WiFi Scanner Ready.");
  showMenu();
}

void loop() {
  if (Serial.available()) {
    char input = Serial.read();

    // Ignore newlines/carriage returns
    if (input != '\n' && input != '\r') {
      handleMenuInput(input);
    }

    // Clear the rest of the buffer
    while (Serial.available()) {
      Serial.read();
    }
  }

  if (wifiScan) {
    scanWifi();
  }
}


Example Output:

Starting Wi-Fi Scan...
Scan complete.
12 networks found:
Nr | SSID                             | RSSI | CH | Encryption
 1 | TL;DR                            |  -37 | 11 | WPA2+WPA3
 2 | North Korea's Wi-Fi              |  -45 | 11 | WPA2

The code provides:

A serial menu printed at startup

User commands:

[s] → Start Wi-Fi scan

[m] → Show menu again


A nicely formatted Wi-Fi scan result with:

SSID

RSSI (signal strength)

Channel

Encryption type

This is a great template for adding more CLI commands for future ESP32-C3 projects.


 _________________________
|     ESP32-C3 Super     |
|      Mini Board        |
|------------------------|
| [ ] EN           IO10  |
| [ ] 3V3          IO6   |
| [ ] IO0          IO7   |
| [ ] GND          IO5   |
| [ ] IO1          IO4   |
| [ ] IO2          IO3   |
| [ ] IO8          GND   |
| [ ] IO9          5V    |
|------------------------|
|__USB-C________RST BTN__|

  [s]  Wi-Fi scan
  [m]  Show menu again

Press s → Performs a Wi-Fi scan.

Press m → Displays the menu again.