#include <LiquidCrystal_I2C.h>
//#include <Wire.h>
#include <NTPClient.h>
#include <WiFi.h>
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 5 * 3600
#define UTC_OFFSET_DST 0
const int RSSI_MAX =-30;// define maximum strength of signal in dBm
const int RSSI_MIN =-90;// define minimum strength of signal in dBm
String Signals;
LiquidCrystal_I2C lcd1(0x27, 16, 2);
const byte LED = 13;
byte noSignals[] = {B10001, B01010, B00100, B01010, B10001, B00000, B01000, B11000};
byte weekSignals[] = {B00000, B00000, B00000, B00000, B00000, B01000, B11000, B11000};
byte normalSignals[] = {B00000, B00000, B00000, B00010, B00110, B01110, B11110, B11110};
byte strongSignals[] = {B00000, B00000, B00001, B00011, B00111, B01111, B11111, B11111};
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
lcd1.setCursor(15, 1);
lcd1.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
lcd1.setCursor(0, 1);
lcd1.println("Connection Err");
return;
}
lcd1.setCursor(8, 0);
lcd1.println(&timeinfo, "%H:%M:%S");
lcd1.setCursor(0, 1);
lcd1.println(&timeinfo, "%d/%m/%Y %Z");
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
//Serial.println("Hello, ESP32-S3!");
//Wire.begin(8,9);
lcd1.init();
lcd1.backlight();
lcd1.setCursor(1, 0);
lcd1.print("Hello, world !");
lcd1.setCursor(2, 1);
lcd1.print("ESP32-S3 I2C");
pinMode(LED, OUTPUT);
lcd1.setCursor(0, 0);
lcd1.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
String sDot = ".";
while (WiFi.status() != WL_CONNECTED) {
delay(100);
lcd1.setCursor(0, 1);
lcd1.print(sDot);
sDot += ".";
if (sDot == ".................") {
lcd1.clear();
sDot = ".";
}
}
lcd1.setCursor(0, 1);
lcd1.print("Connected!");
Serial.begin(115200);
lcd1.init();
lcd1.backlight();
lcd1.setCursor(0, 0);
lcd1.print("Connecting to ");
lcd1.setCursor(0, 1);
lcd1.print("WiFi ");
WiFi.begin("Wokwi-GUEST", "", 6);
WiFi.RSSI();
while (WiFi.status() != WL_CONNECTED) {
delay(250);
spinner();
}
lcd1.clear();
lcd1.setCursor(0, 0);
lcd1.println("Online");
lcd1.setCursor(0, 1);
lcd1.println("Updating time...");
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}
void loop() {
if (WiFi.status() == WL_CONNECTED) { // If WiFi is connected
int rssi = WiFi.RSSI(); // Get the signal strength in dBm
dBmtoPercentage(rssi);
delay(1000); // Wait for a second
printLocalTime();
}
}
void dBmtoPercentage(int dBm)
{
if(dBm <= RSSI_MIN)
{
lcd1.setCursor(0, 0);
lcd1.println("NoWiFi");
lcd1.createChar(0, noSignals);
lcd1.setCursor(6,0);
lcd1.write(0);
}
else if(dBm >= RSSI_MAX)
{
lcd1.setCursor(0, 0);
lcd1.println("Online");
lcd1.createChar(0, weekSignals);
lcd1.setCursor(6,0);
lcd1.write(0);
}
else if ((2 * (dBm + 100)) > 25 && (2 * (dBm + 100)) < 50)
{
lcd1.setCursor(0, 0);
lcd1.println("Online");
lcd1.createChar(0, normalSignals);
lcd1.setCursor(6,0);
lcd1.write(0);
//quality = 2 * (dBm + 100);
}
else if ((2 * (dBm + 100)) > 50 && (2 * (dBm + 100)) < 75)
{
lcd1.setCursor(0, 0);
lcd1.println("Online");
lcd1.createChar(0, strongSignals);
lcd1.setCursor(6,0);
lcd1.write(0);
//quality = 2 * (dBm + 100);
}
// return quality;
}//dBmtoPercentage