#include <WiFi.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
// Pin Definitions
#define DOWNBTN 5
#define UPBTN 22
#define TFT_DC 2
#define TFT_CS 15
// TFT Display Object
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// Constants
#define MAXLINE 12
// Global Variables
unsigned long timestart = 0;
unsigned long timeout = 0;
int trial = 0;
int n = 0;
String ssid = "";
String pass = "";
void setup() {
pinMode(DOWNBTN, INPUT_PULLUP);
pinMode(UPBTN, INPUT_PULLUP);
Serial.begin(115200);
// Scan for Wi-Fi networks
scanWiFi();
// Initialize Wi-Fi connection
initWiFi();
// Display IP Address
tft.setTextSize(3);
tft.print("\nOK! IP=");
tft.println(WiFi.localIP());
}
void loop() {
if (trial > 3) {
scanWiFi();
initWiFi();
} else {
if ((millis() - timestart > 2000) && (WiFi.status() != WL_CONNECTED)) {
Serial.println("Reconnecting to WiFi...");
tft.setTextSize(3);
tft.println("Reconnecting to WiFi...");
WiFi.disconnect();
initWiFi();
trial++;
WiFi.reconnect();
timestart = millis();
}
}
}
void scanWiFi() {
tft.begin();
tft.setRotation(1);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.print("Scanning WiFi...");
n = WiFi.scanNetworks();
// n=20;
Serial.println("Scan completed");
tft.fillScreen(ILI9341_BLACK);
if (n == 0) {
Serial.println("No networks found");
tft.println("No networks found");
} else {
if (n > MAXLINE) {
scrollScreen(tft,n);
} else {
showNetworks(tft,n);
}
}
Serial.println("Enter the number of the network you want to connect");
while (Serial.available() == 0) {}
int no_ssid = Serial.parseInt();
connectWiFi(tft,no_ssid);
}
void initWiFi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
Serial.print("Connecting to WiFi...");
tft.print("Connecting to WiFi...");
timeout = millis();
while ((WiFi.status() != WL_CONNECTED) && (millis() - timeout < 8000)) {
Serial.print(".");
tft.print(".");
delay(1000);
}
tft.fillScreen(ILI9341_BLACK);
if (WiFi.status() != WL_CONNECTED) {
if (WiFi.status() == WL_NO_SSID_AVAIL) {
Serial.println("WiFi network is not available");
tft.setTextColor(ILI9341_RED);
tft.println("WiFi network is not available");
} else {
Serial.println("Password is incorrect");
tft.setTextColor(ILI9341_RED);
tft.println("Password is incorrect");
}
} else {
Serial.println("Connected successfully");
Serial.print("IP Address : ");
Serial.println(WiFi.localIP());
tft.setTextColor(ILI9341_WHITE);
tft.println("Connected successfully");
tft.print("IP Address : ");
tft.println(WiFi.localIP());
trial = 0;
}
}
void connectWiFi(Adafruit_ILI9341 &tft,int no_ssid) {
ssid = WiFi.SSID(no_ssid - 1);
if (WiFi.encryptionType(no_ssid - 1) != WIFI_AUTH_OPEN) {
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_GREEN);
tft.print(no_ssid);
tft.print(": ");
tft.print(WiFi.SSID(no_ssid - 1));
tft.print(" (");
tft.print(WiFi.RSSI(no_ssid - 1));
tft.print(")");
tft.setTextColor(ILI9341_BLUE);
tft.println("Please enter the password of the network you chose");
Serial.println("Please enter the password of the network you chose");
while (true) {
while (!Serial.available()) {}
pass = Serial.readString();
pass.trim();
if (pass.length() >= 8) {
tft.println();
for (int i = 0; i < pass.length(); i++) tft.print("*");
tft.println();
break;
} else {
Serial.println("Password should be at least 8 characters. Please try again:");
tft.println("Password should be at least 8 characters. Please try again:");
}
}
} else {
pass = "";
}
}
void showNetworks(Adafruit_ILI9341 &tft,int n) {
Serial.print(n);
Serial.println(" networks found");
Serial.println("No | SSID | RSSI| CH | Encryption");
showHeader(tft, n);
tft.setTextColor(ILI9341_WHITE);
for (int i = 0; i < n; i++) {
showNetwork(tft,i);
}
showTrailer(tft);
}
void showNetwork(Adafruit_ILI9341 &tft,int i) {
tft.setTextSize(1);
tft.setTextColor(ILI9341_WHITE);
Serial.printf("%2d", i + 1);
Serial.print(" | ");
Serial.printf("%-32.32s", WiFi.SSID(i).c_str());
Serial.print(" | ");
Serial.printf("%4d", WiFi.RSSI(i));
Serial.print(" | ");
Serial.printf("%2d", WiFi.channel(i));
Serial.print(" | ");
tft.printf("%2d", i + 1);
tft.print(" | ");
tft.printf("%-23.23s", WiFi.SSID(i).c_str());
tft.print(" | ");
tft.printf("%4d", WiFi.RSSI(i));
tft.print(" | ");
tft.printf("%2d", WiFi.channel(i));
tft.print(" | ");
switch (WiFi.encryptionType(i)) {
case WIFI_AUTH_OPEN: tft.print("open"); break;
case WIFI_AUTH_WEP: tft.print("WEP"); break;
case WIFI_AUTH_WPA_PSK: tft.print("WPA"); break;
case WIFI_AUTH_WPA2_PSK: tft.print("WPA2"); break;
case WIFI_AUTH_WPA_WPA2_PSK: tft.print("WPA+WPA2"); break;
case WIFI_AUTH_WPA2_ENTERPRISE: tft.print("WPA2-EAP"); break;
case WIFI_AUTH_WPA3_PSK: tft.print("WPA3"); break;
case WIFI_AUTH_WPA2_WPA3_PSK: tft.print("WPA2+WPA3"); break;
case WIFI_AUTH_WAPI_PSK: tft.print("WAPI"); break;
default: tft.print("unknown");
}
delay(10);
Serial.println("");
tft.println("");
}
void showHeader(Adafruit_ILI9341 &tft,int n) {
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(1);
tft.print(n);
tft.println(" networks found");
tft.setTextColor(ILI9341_BLUE);
tft.println("No | SSID | RSSI | CH | Encryption");
tft.setTextColor(ILI9341_WHITE);
tft.println(" | | | | ");
}
void showTrailer(Adafruit_ILI9341 &tft) {
tft.setTextColor(ILI9341_GREEN);
tft.println("");
tft.println("Enter the number of the network you want to connect");
}
void scrollScreen(Adafruit_ILI9341 &tft,int n) {
int j = 0;
int line = 0;
clearScreen(tft);
showHeader(tft,n);
for (int i = 0; i < n; i++) {
line++;
showNetwork(tft,i);
if (line >= MAXLINE) break;
tft.println(" | | | | ");
}
showTrailer(tft);
int endScroll = 0;
while (!endScroll) {
if (digitalRead(DOWNBTN) == LOW) {
j++;
clearScreen(tft);
showHeader(tft,n);
tft.setTextColor(ILI9341_WHITE);
line = 0;
for (int i = j; i < n; i++) {
line++;
showNetwork(tft,i);
if (line >= MAXLINE) break;
tft.println(" | | | | ");
}
showTrailer(tft);
if (j >= n - MAXLINE) endScroll = 1;
}
if (digitalRead(UPBTN) == LOW) {
if (j == 0) continue;
j--;
clearScreen(tft);
showHeader(tft,n);
tft.setTextColor(ILI9341_WHITE);
line = 0;
for (int i = j; i < n; i++) {
line++;
showNetwork(tft,i);
if (line >= MAXLINE) break;
tft.println(" | | | | ");
}
showTrailer(tft);
}
}
}
void clearScreen(Adafruit_ILI9341 &tft) {
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(0, 0);
}