#include <ArduinoJson.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 20, 4);
#define NTP_SERVER "pk.pool.ntp.org"
#define UTC_OFFSET 18000
#define UTC_OFFSET_DST 0
// set location and API key
String Location = "Karachi, PK";
String API_Key = "f35a205df5b5b99f9ca991ab6b890e3b";
const int DHT_PIN = 15;
DHTesp dhtSensor;
String today_Date; //dd-mm-yyyy
void setup() {
Serial.begin(115200); // Initialize Serial
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // Configure DHT22 Sensor
LCD.init(); // Initialize Liquid Crystal Display
LCD.backlight(); // Backlight On
LCD.setCursor(0, 0); // Cursor Position Row 0 X Column 0
LCD.print("Connecting to "); // Display Text on LCD
LCD.setCursor(0, 1); // Cursor Position Row 0 X Column 1
LCD.print("WiFi "); // Display Text on LCD
WiFi.begin("Wokwi-GUEST", "", 6); // Connecting WIFI with cridintials
while (WiFi.status() != WL_CONNECTED) {
delay(250);
spinner();
}
Serial.print("");
Serial.print("WiFi connected");
Serial.print("IP address: ");
Serial.print(WiFi.localIP());
LCD.clear(); // Remove All text from Liquid Crystal Display
LCD.setCursor(0, 0);
LCD.print("Online");
LCD.setCursor(0, 1);
LCD.print("Updating time...");
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
}
void loop() {
printLocalTime(); // Fatch Date Time from Internet
weather_Updates(); // Fatch weather Updates from Internet
//GtoHConvertor(today_Date); // Convert Gregorian to Hijri Dates
delay(2000);
//LCD.setCursor(0, 3);
//LCD.print(" ");
}
void spinner() {
static int8_t counter = 0;
const char* glyphs = "\xa1\xa5\xdb";
LCD.setCursor(15, 1);
LCD.print(glyphs[counter++]);
if (counter == strlen(glyphs)) {
counter = 0;
}
}
void printLocalTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
LCD.setCursor(0, 1);
LCD.print("Connection Err");
return;
}
LCD.setCursor(0, 0);
LCD.print("PK-KHI. ");
LCD.setCursor(9, 0);
//DateTime now = &timeinfo;
String dy, mn;
if (timeinfo.tm_mday<10){dy="0"+String(timeinfo.tm_mday);} else {dy=String(timeinfo.tm_mday);}
if (timeinfo.tm_mon<10){mn="0"+String(timeinfo.tm_mon+1);} else {mn=String(timeinfo.tm_mon+1);}
Serial.println(dy+ "-" + mn + "-" + String(timeinfo.tm_year + 1900));
today_Date = (dy+ "-" + mn + "-" + String(timeinfo.tm_year + 1900));
if((timeinfo.tm_hour >= 0) && (timeinfo.tm_hour <12))
{ LCD.print(&timeinfo, "%I:%M:%S AM" );}
else
{ LCD.print(&timeinfo, "%I:%M:%S PM" );}
LCD.setCursor(0, 1);
LCD.print(&timeinfo, "%a %b-%d,%Y");
//LCD.setCursor(0, 2);
//LCD.print(char(0xDF));
//LCD.print("C");
//LCD.setCursor(0, 3);
//LCD.print("Humidity");
}
void DHTSensor(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
LCD.setCursor(0, 2);
//LCD.print("Temp: " + String(data.temperature, 2));
LCD.print("T: " + String(data.temperature, 1));
LCD.print(char(0xDF));
LCD.print("C");
LCD.setCursor(0, 3);
LCD.print("Humidity "+ String(data.humidity, 1) + "%");
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
delay(1000);
}
void GtoHConvertor(String gDate) // DD-MM-YYYY
{
String url = "http://api.aladhan.com/v1/gToH?date=" + gDate;
HTTPClient http;
http.begin(url);
int httpCode = http.GET();
// Check for errors
if (httpCode != 200) {
Serial.println("Error: " + String(httpCode));
return;
}
// Parse the JSON response
String response = http.getString();
StaticJsonDocument<1024> doc;
DeserializationError error = deserializeJson(doc, response);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
return;
}
int code = doc["code"]; // 200
const char* status = doc["status"]; // "OK"
JsonObject data_hijri = doc["data"]["hijri"];
const char* data_hijri_date = data_hijri["date"]; // "14-02-1436"
const char* data_hijri_format = data_hijri["format"]; // "DD-MM-YYYY"
const char* data_hijri_day = data_hijri["day"]; // "14"
const char* data_hijri_weekday_en = data_hijri["weekday"]["en"]; // "Al Ahad"
const char* data_hijri_weekday_ar = data_hijri["weekday"]["ar"]; // "الاحد"
JsonObject data_hijri_month = data_hijri["month"];
int data_hijri_month_number = data_hijri_month["number"]; // 2
const char* data_hijri_month_en = data_hijri_month["en"]; // "Ṣafar"
const char* data_hijri_month_ar = data_hijri_month["ar"]; // "صَفَر"
const char* data_hijri_year = data_hijri["year"]; // "1436"
const char* data_hijri_designation_abbreviated = data_hijri["designation"]["abbreviated"]; // "AH"
const char* data_hijri_designation_expanded = data_hijri["designation"]["expanded"]; // "Anno Hegirae"
JsonObject data_gregorian = doc["data"]["gregorian"];
const char* data_gregorian_date = data_gregorian["date"]; // "07-12-2014"
const char* data_gregorian_format = data_gregorian["format"]; // "DD-MM-YYYY"
const char* data_gregorian_day = data_gregorian["day"]; // "07"
const char* data_gregorian_weekday_en = data_gregorian["weekday"]["en"]; // "Sunday"
int data_gregorian_month_number = data_gregorian["month"]["number"]; // 12
const char* data_gregorian_month_en = data_gregorian["month"]["en"]; // "December"
const char* data_gregorian_year = data_gregorian["year"]; // "2014"
const char* data_gregorian_designation_abbreviated = data_gregorian["designation"]["abbreviated"];
const char* data_gregorian_designation_expanded = data_gregorian["designation"]["expanded"]; // "Anno ...
//Serial.println(String(data_hijri_date) + " " + String(data_hijri_designation_abbreviated));
String sht_En_Month;
switch (data_hijri_month_number) {
case 1:
sht_En_Month = "MHRM";
break;
case 2:
sht_En_Month = "SAFR";
break;
case 3:
sht_En_Month="R-I";
break;
case 4:
sht_En_Month = "R-II";
break;
case 5:
sht_En_Month = "J-I";
break;
case 6:
sht_En_Month="J-II";
break;
case 7:
sht_En_Month = "RAJB";
break;
case 8:
sht_En_Month = "SHBN";
break;
case 9:
sht_En_Month="RMZN";
break;
case 10:
sht_En_Month = "SHWL";
break;
case 11:
sht_En_Month = "ZEQD";
break;
case 12:
sht_En_Month="ZLHJ";
break;
default:
Serial.print("Sensor error");
}
LCD.setCursor(8, 1);
LCD.print(String(data_hijri_day) + " " + String(sht_En_Month)+ " " + String(data_hijri_year) );
//Serial.println(String(data_hijri_day) + " " + String(sht_En_Month)+ " " + String(data_hijri_year) + " " + String(data_hijri_designation_abbreviated));
//Serial.println(String(data_hijri_day) + ", " + String(data_hijri_month_ar) + " " + String(data_hijri_year));
delay(10000);
}
void weather_Updates()
{
if (WiFi.status() == WL_CONNECTED) //Check WiFi connection status
{
HTTPClient http; //Declare an object of class HTTPClient
// specify request destination
http.begin("http://api.openweathermap.org/data/2.5/weather?q=" + Location + "&APPID=" + API_Key +"&units=metric"); // !!
int httpCode = http.GET(); // send the request
if (httpCode > 0) // check the returning code
{
String payload = http.getString(); //Get the request response payload
DynamicJsonDocument doc(2048);
// Parse JSON object
DeserializationError error = deserializeJson(doc,payload);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
return;
}
float coord_lon = doc["coord"]["lon"]; // 67.0822
float coord_lat = doc["coord"]["lat"]; // 24.9056
JsonObject weather_0 = doc["weather"][0];
int weather_0_id = weather_0["id"]; // 800
const char* weather_0_main = weather_0["main"]; // "Clear"
const char* weather_0_description = weather_0["description"]; // "clear sky"
const char* weather_0_icon = weather_0["icon"]; // "01d"
const char* base = doc["base"]; // "stations"
JsonObject main = doc["main"];
float main_temp = main["temp"]; // 296.05
float main_feels_like = main["feels_like"]; // 294.92
float main_temp_min = main["temp_min"]; // 296.05
float main_temp_max = main["temp_max"]; // 296.05
int main_pressure = main["pressure"]; // 1016
int main_humidity = main["humidity"]; // 20
int visibility = doc["visibility"]; // 6000
float wind_speed = doc["wind"]["speed"]; // 2.06
int wind_deg = doc["wind"]["deg"]; // 30
int clouds_all = doc["clouds"]["all"]; // 0
long dt = doc["dt"]; // 1674207135
JsonObject sys = doc["sys"];
int sys_type = sys["type"]; // 1
int sys_id = sys["id"]; // 7576
const char* sys_country = sys["country"]; // "PK"
long sys_sunrise = sys["sunrise"]; // 1674181066
long sys_sunset = sys["sunset"]; // 1674220013
int timezone = doc["timezone"]; // 18000
long id = doc["id"]; // 1174872
const char* name = doc["name"]; // "Karachi"
int cod = doc["cod"]; // 200
LCD.setCursor(0, 2);
//LCD.print("Temp: " + String(main_temp, 1));
LCD.print("T " + String(main_temp, 1));
LCD.print(char(0xDF));
LCD.print("C ");
//LCD.setCursor(0, 3);
//LCD.print("Humidity ");
LCD.print("H ");
LCD.print(main_humidity);
LCD.print("%");
}
http.end(); //Close connection
}
else
{
DHTSensor();
delay(3000);
}
delay(10000); // wait 1 minute
}