#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <LiquidCrystal_I2C.h>
#include <TimeLib.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* url = "https://api-arrivals.sofiatraffic.bg/api/v1/arrivals/0124/?line=67&type=bus";
const int interval = 30*1000;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup(){
lcd.init();
lcd.backlight();
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("Connecting");
lcd.home();
lcd.print("Connecting...");
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
lcd.clear();
lcd.print("Connected");
}
void loop(){
if (WiFi.status()== WL_CONNECTED){
String response = httpGETRequest(url);
Serial.println(response);
const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(8) + 9*JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(5) + 780;
DynamicJsonDocument doc(capacity);
//const char* json = response.c_str();
const char* json = "{'license': '','timestamp_calculated': '2020-11-24 23:25:01','lines': [{'arrivals': [{'time': '23:41:36','has_wifi': null,'has_air_conditioning': true,'is_wheelchair_accessible': true}],'vehicle_type': 'bus','direction': null,'name': '67'}],'code': '0124','name': ''}";
deserializeJson(doc, json);
const char* dateTimeCalc = doc["timestamp_calculated"];
Serial.println(dateTimeCalc);
unsigned long timeCalc = makeTime(setTimeElements(dateTimeCalc));
JsonArray arrivals = doc["lines"][0]["arrivals"];
const char* timeArrStr_1 = arrivals[0]["time"];
Serial.println(timeArrStr_1);
char* dateTimeArrStr_1 = setDateTimeArr(dateTimeCalc, timeArrStr_1);
unsigned long timeArr_1 = makeTime(setTimeElements(dateTimeArrStr_1));
int timeTo_1 = (timeArr_1 - timeCalc) / 60;
Serial.println(timeTo_1);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print(timeTo_1);
/*
const char* time2 = arrivals[1]["time"];
char sub2[6];
strncpy(sub2, time2, 5);
sub2[5] = '\0';
Serial.println(sub2);
lcd.setCursor(9, 0);
lcd.print(sub2);
const char* time3 = arrivals[2]["time"];
char sub3[6];
strncpy(sub3, time3, 5);
sub3[5] = '\0';
Serial.println(sub3);
lcd.setCursor(1, 1);
lcd.print(sub3);
const char* time4 = arrivals[3]["time"];
char sub4[6];
strncpy(sub4, time4, 5);
sub4[5] = '\0';
Serial.println(sub4);
lcd.setCursor(9, 1);
lcd.print(sub4);
*/
} else {
Serial.println("WiFi Disconnected");
lcd.clear();
lcd.print("Disconnected");
}
delay(interval);
}
String httpGETRequest(const char* url){
HTTPClient http;
http.begin(url);
String payload = "{}";
int responseCode = http.GET();
if (responseCode > 0){
payload = http.getString();
} else {
Serial.print("Error code: ");
Serial.println(responseCode);
lcd.clear();
lcd.print("Error: ");
lcd.print(responseCode);
}
http.end();
return payload;
}
tmElements_t setTimeElements(const char* str){
tmElements_t tm;
int Year, Month, Day, Hour, Minute, Second;
sscanf(str, "%d-%d-%d %d:%d:%d", &Year, &Month, &Day, &Hour, &Minute, &Second);
tm.Year = CalendarYrToTm(Year);
tm.Month = Month;
tm.Day = Day;
tm.Hour = Hour;
tm.Minute = Minute;
tm.Second = Second;
return tm;
}
char* setDateTimeArr(const char* dateTimeCalc, const char* timeArrStr){
char str[20];
strncpy(str, dateTimeCalc, 11);
str[11] = '\0';
strncat(str, timeArrStr, 8);
Serial.println(str);
return str;
}