inkplate-6-arduino-library/examples/Projects/Crypto_tracker_example/Network.cpp

218 lines
5.4 KiB
C++
Raw Normal View History

2020-09-24 10:43:08 +02:00
/*
Network.cpp
Inkplate 6 Arduino library
David Zovko, Borna Biro, Denis Vajak, Zvonimir Haramustek @ e-radionica.com
September 24, 2020
https://github.com/e-radionicacom/Inkplate-6-Arduino-library
For support, please reach over forums: forum.e-radionica.com/en
For more info about the product, please check: www.inkplate.io
This code is released under the GNU Lesser General Public License v3.0: https://www.gnu.org/licenses/lgpl-3.0.en.html
Please review the LICENSE file included with this example.
If you have any questions about licensing, please contact techsupport@e-radionica.com
Distributed as-is; no warranty is given.
*/
2020-09-07 11:40:01 +02:00
#include "Network.h"
#include <HTTPClient.h>
2020-09-24 10:43:08 +02:00
#include <WiFi.h>
2020-09-07 11:40:01 +02:00
#include <WiFiClientSecure.h>
#include "Inkplate.h"
2020-09-24 10:43:08 +02:00
// Must be installed for this example to work
2020-09-07 11:40:01 +02:00
#include <ArduinoJson.h>
2020-09-24 10:43:08 +02:00
// external parameters from our main file
2020-09-07 11:40:01 +02:00
extern char *ssid;
extern char *pass;
extern char *currency;
2020-09-24 10:43:08 +02:00
// Get our Inkplate object from main file to draw debug info on
2020-09-07 11:40:01 +02:00
extern Inkplate display;
2020-09-24 10:43:08 +02:00
// Static Json from ArduinoJson library
2020-09-07 11:40:01 +02:00
StaticJsonDocument<30000> doc;
void Network::begin()
{
2020-09-24 10:43:08 +02:00
// Initiating wifi, like in BasicHttpClient example
2020-09-07 11:40:01 +02:00
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
int cnt = 0;
Serial.print(F("Waiting for WiFi to connect..."));
while ((WiFi.status() != WL_CONNECTED))
{
Serial.print(F("."));
delay(1000);
++cnt;
if (cnt == 20)
{
Serial.println("Can't connect to WIFI, restarting");
delay(100);
ESP.restart();
}
}
Serial.println(F(" connected"));
2020-09-24 10:43:08 +02:00
// Find internet time
2020-09-07 11:40:01 +02:00
setTime();
}
2020-09-24 10:43:08 +02:00
// Gets time from ntp server
2020-09-07 11:40:01 +02:00
void Network::getTime(char *timeStr)
{
2020-09-24 10:43:08 +02:00
// Get seconds since 1.1.1970.
2020-09-07 11:40:01 +02:00
time_t nowSecs = time(nullptr);
2020-09-24 10:43:08 +02:00
// Used to store time
2020-09-07 11:40:01 +02:00
struct tm timeinfo;
gmtime_r(&nowSecs, &timeinfo);
2020-09-24 10:43:08 +02:00
// Copies time string into timeStr
2020-09-07 11:40:01 +02:00
strncpy(timeStr, asctime(&timeinfo) + 4, 12);
2020-09-24 10:43:08 +02:00
// Setting time string timezone
2020-09-07 11:40:01 +02:00
int hr = 10 * timeStr[7] + timeStr[8] + timeZone;
2020-09-24 10:43:08 +02:00
// Better defined modulo, in case timezone makes hours to go below 0
2020-09-07 11:40:01 +02:00
hr = (hr % 24 + 24) % 24;
2020-09-24 10:43:08 +02:00
// Adding time to '0' char makes it into whatever time char, for both digits
2020-09-07 11:40:01 +02:00
timeStr[7] = hr / 10 + '0';
timeStr[8] = hr % 10 + '0';
}
bool Network::getData(double *data)
{
bool f = 0;
// If not connected to wifi reconnect wifi
if (WiFi.status() != WL_CONNECTED)
{
WiFi.reconnect();
delay(5000);
int cnt = 0;
Serial.println(F("Waiting for WiFi to reconnect..."));
while ((WiFi.status() != WL_CONNECTED))
{
// Prints a dot every second that wifi isn't connected
Serial.print(F("."));
delay(1000);
++cnt;
if (cnt == 7)
{
Serial.println("Can't connect to WIFI, restart initiated.");
delay(100);
ESP.restart();
}
}
}
2020-09-24 10:43:08 +02:00
// Wake up if sleeping and save inital state
2020-09-07 11:40:01 +02:00
bool sleep = WiFi.getSleep();
WiFi.setSleep(false);
2020-09-24 10:43:08 +02:00
// Http object used to make get request
2020-09-07 11:40:01 +02:00
HTTPClient http;
http.getStream().setTimeout(10);
http.getStream().flush();
2020-09-24 10:43:08 +02:00
// Initiate http
2020-09-07 11:40:01 +02:00
char temp[128];
sprintf(temp, "https://api.coingecko.com/api/v3/coins/%s/market_chart?vs_currency=usd&days=92", currency);
http.begin(temp);
2020-09-24 10:43:08 +02:00
// Actually do request
2020-09-07 11:40:01 +02:00
int httpCode = http.GET();
if (httpCode == 200)
{
while (http.getStream().available() && http.getStream().peek() != '{')
(void)http.getStream().read();
2020-09-24 10:43:08 +02:00
// Try parsing JSON object
2020-09-07 11:40:01 +02:00
DeserializationError error = deserializeJson(doc, http.getStream());
if (error)
{
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.c_str());
f = 1;
}
else if (doc["prices"].size() > 31)
{
2020-09-24 10:43:08 +02:00
// Set all data got from internet using formatTemp and formatWind defined above
// This part relies heavily on ArduinoJson library
2020-09-07 11:40:01 +02:00
Serial.println("Success");
2020-09-24 10:43:08 +02:00
// Save our data to data pointer from main file
2020-09-07 11:40:01 +02:00
for (int i = 0; i < 31; ++i)
{
data[i] = doc["prices"][92 - 31 + i][1].as<double>();
2020-09-24 10:43:08 +02:00
// Serial.println(data[i]);
2020-09-07 11:40:01 +02:00
}
f = 0;
}
}
else if (httpCode == 404)
{
2020-09-24 10:43:08 +02:00
// Coin id not found
2020-09-07 11:40:01 +02:00
display.clearDisplay();
display.setCursor(50, 230);
display.setTextSize(2);
display.println(F("Your entered coin does not exist!"));
display.display();
while (1)
;
}
else
{
f = 1;
}
2020-09-24 10:43:08 +02:00
// Clear document and end http
2020-09-07 11:40:01 +02:00
doc.clear();
http.end();
2020-09-24 10:43:08 +02:00
// Return to initial state
2020-09-07 11:40:01 +02:00
WiFi.setSleep(sleep);
return !f;
}
2020-09-24 10:43:08 +02:00
// Function for initial time setting ovet the ntp server
2020-09-07 11:40:01 +02:00
void Network::setTime()
{
2020-09-24 10:43:08 +02:00
// Used for setting correct time
2020-09-07 11:40:01 +02:00
configTime(0, 0, "pool.ntp.org", "time.nist.gov");
Serial.print(F("Waiting for NTP time sync: "));
time_t nowSecs = time(nullptr);
while (nowSecs < 8 * 3600 * 2)
{
delay(500);
Serial.print(F("."));
yield();
nowSecs = time(nullptr);
}
Serial.println();
2020-09-24 10:43:08 +02:00
// Used to store time info
2020-09-07 11:40:01 +02:00
struct tm timeinfo;
gmtime_r(&nowSecs, &timeinfo);
Serial.print(F("Current time: "));
Serial.print(asctime(&timeinfo));
}