208 lines
6.6 KiB
Arduino
208 lines
6.6 KiB
Arduino
|
#include <M5Stack.h>
|
||
|
#include <WifiJson.h>
|
||
|
#include <HTTPClient.h>
|
||
|
#include <ArduinoJson.h>
|
||
|
|
||
|
// New instance of WifiJson, silent is false, it will log to the M5Stacks screen
|
||
|
WifiJson wifi(false);
|
||
|
HTTPClient http;
|
||
|
StaticJsonDocument<1000> data;
|
||
|
char *jsonRes;
|
||
|
|
||
|
// 'ram', 15x10px
|
||
|
const unsigned char ram [] PROGMEM = {
|
||
|
0xff, 0x7f, 0x01, 0x40, 0x6d, 0x5b, 0x6d, 0x5b, 0x6d, 0x5b, 0x6d, 0x5b,
|
||
|
0x01, 0x40, 0xc1, 0x41, 0x55, 0x55, 0x7f, 0x7f
|
||
|
};
|
||
|
// 'hdd', 14x12px
|
||
|
const unsigned char hdd[] = {
|
||
|
0xfc, 0x0f, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x01, 0x20,
|
||
|
0x01, 0x20, 0xff, 0x3f, 0x01, 0x20, 0x55, 0x29, 0x55, 0x21, 0xff, 0x3f
|
||
|
};
|
||
|
// 'swap', 13x13px
|
||
|
const unsigned char swap [] PROGMEM = {
|
||
|
0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x1f,
|
||
|
0xff, 0x10, 0xff, 0x10, 0x20, 0x10, 0x22, 0x10, 0x26, 0x10, 0x22, 0x10,
|
||
|
0xe0, 0x1f
|
||
|
};
|
||
|
// 'temp', 7x14px
|
||
|
const unsigned char temp [] PROGMEM = {
|
||
|
0x1c, 0x36, 0x22, 0x22, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x49, 0x5d, 0x49,
|
||
|
0x22, 0x1c
|
||
|
};
|
||
|
|
||
|
const char* ca = \
|
||
|
"-----BEGIN CERTIFICATE-----\n" \
|
||
|
"MIIFlTCCBH2gAwIBAgISA5tHKDD+RZnTEVnc4cB00DmoMA0GCSqGSIb3DQEBCwUA\n" \
|
||
|
"MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD\n" \
|
||
|
"ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0yMDAyMDIwMjMxNTNaFw0y\n" \
|
||
|
"MDA1MDIwMjMxNTNaMBQxEjAQBgNVBAMTCWFybndlYi5ubDCCASIwDQYJKoZIhvcN\n" \
|
||
|
"AQEBBQADggEPADCCAQoCggEBALYtO2ju+3IsvbMweL3sFFAcqHTA1w5X5TyzMNMT\n" \
|
||
|
"1N6jorAj6h59HpY/m9WHFlqqx1vTamQhr9ssSJRrfZUKB4wWLAolfWzVb0xZehu6\n" \
|
||
|
"KIXgxF0EMx+Nd2ug7WCSKUvh0xQWyDe5Qo4Fy0od5FQnLDqpoVixXbhH1IewQpSP\n" \
|
||
|
"S4yyYU4dBOFEbGB0WGenZD1QoqFWEzKMaJWbgn3QoOtPnAls1f5Y76Msz9tp+AlR\n" \
|
||
|
"s5qJWEOSYYFGCsjL3KIl5ML0CW6AqcRami1MQLaxUWm02sCKFrhfJSoDBr56UQLe\n" \
|
||
|
"lbRSZhwZnfo7ZjBjYqdXtEmlFe4LkgJ7xZfKCgK9fz6oeOECAwEAAaOCAqkwggKl\n" \
|
||
|
"MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw\n" \
|
||
|
"DAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU5wPLlghu87XR3B7pmqDbYl+0zLswHwYD\n" \
|
||
|
"VR0jBBgwFoAUqEpqYwR93brm0Tm3pkVl7/Oo7KEwbwYIKwYBBQUHAQEEYzBhMC4G\n" \
|
||
|
"CCsGAQUFBzABhiJodHRwOi8vb2NzcC5pbnQteDMubGV0c2VuY3J5cHQub3JnMC8G\n" \
|
||
|
"CCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDMubGV0c2VuY3J5cHQub3JnLzBi\n" \
|
||
|
"BgNVHREEWzBZgg1hcGkuYXJud2ViLm5sgglhcm53ZWIubmyCDWRldi5hcm53ZWIu\n" \
|
||
|
"bmyCD2dpdGVhLmFybndlYi5ubIIObmV4dC5hcm53ZWIubmyCDXd3dy5hcm53ZWIu\n" \
|
||
|
"bmwwTAYDVR0gBEUwQzAIBgZngQwBAgEwNwYLKwYBBAGC3xMBAQEwKDAmBggrBgEF\n" \
|
||
|
"BQcCARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwggEBBgorBgEEAdZ5AgQC\n" \
|
||
|
"BIHyBIHvAO0AdADwlaRZ8gDRgkAQLS+TiI6tS/4dR+OZ4dA0prCoqo6ycwAAAXAD\n" \
|
||
|
"9GbiAAAEAwBFMEMCHxM9P+xmvv54KfAnXPUi/ktr4y+71JT6J3SNK1btmoICIDj4\n" \
|
||
|
"ixR9xXRdcpEEbXGiD2SNSYKo/smj1OOLVdxdl2OoAHUAsh4FzIuizYogTodm+Su5\n" \
|
||
|
"iiUgZ2va+nDnsklTLe+LkF4AAAFwA/Rm1gAABAMARjBEAiApjqhGjDMeyUMi8QGa\n" \
|
||
|
"OcM/D23MOxk5DrhAl4V3qHZHuwIgeBIpEQA8gnWTrbBXh5zk7OYQN9F7g1nHDeWq\n" \
|
||
|
"Hx8VvPAwDQYJKoZIhvcNAQELBQADggEBACuCb/oAQM85nhAqhBZ2PvVduwQClbVF\n" \
|
||
|
"3vhAXecoCzWNZfl7joCEjnQZyLdWtrmnK+EVZsAzyiK9/2e+dB8JC0xbO6KBb5/Y\n" \
|
||
|
"uqwdtaq/nsjNa4UaUEIE2CDOUOYXptmMpq8zSpMSWGyKGABkTLDewrHK8mBaub5t\n" \
|
||
|
"sBQyrdL6tlrzL5nsCmwrEgL83YZQUJWEuv5Egjf/D1xIjcv9CVp/1aG/dgBSCG9r\n" \
|
||
|
"o0JzQTtjS2OybPs4QOXWWMo0yDVi20OVy85qIFNHLXAJPnZ9iUAa3gaqcUmtzdtS\n" \
|
||
|
"pbTG+YNnvJ/ZtdWQSkqvkzY7siZ/Ze3RjhYRR+GPt+BLco7DkuZlPbE=\n" \
|
||
|
"-----END CERTIFICATE-----\n";
|
||
|
|
||
|
void setup() {
|
||
|
M5.begin();
|
||
|
|
||
|
/*
|
||
|
Attempt connecting to a network using credentials in /wifi.json.
|
||
|
Will return false if connection fails
|
||
|
*/
|
||
|
if (!wifi.begin("/wifi.json"))
|
||
|
{
|
||
|
Serial.println("This program requires a WiFi connection!");
|
||
|
M5.Lcd.println("This program requires a WiFi connection!");
|
||
|
|
||
|
// Do not let the program run
|
||
|
while (true)
|
||
|
{ }
|
||
|
}
|
||
|
Serial.println(wifi.ip);
|
||
|
M5.Lcd.println(wifi.ip);
|
||
|
|
||
|
delay(500);
|
||
|
update();
|
||
|
}
|
||
|
|
||
|
void update() {
|
||
|
M5.Lcd.fillScreen(0x1082);
|
||
|
M5.Lcd.setCursor(0,0);
|
||
|
|
||
|
int httpCode = 0;
|
||
|
M5.Lcd.setTextSize(2);
|
||
|
|
||
|
http.begin("https://api.arnweb.nl/system", ca);
|
||
|
httpCode = http.GET();
|
||
|
|
||
|
if (httpCode > 0) {
|
||
|
M5.Lcd.fillScreen(0x1082);
|
||
|
deserializeJson(data, http.getStream());
|
||
|
|
||
|
// Top nav
|
||
|
M5.Lcd.setTextColor(0xDEFB);
|
||
|
M5.Lcd.fillRect(0, 0, 320, 22, 0x2104);
|
||
|
M5.Lcd.setCursor(4,4);
|
||
|
M5.Lcd.println(data["hostname"].as<String>());
|
||
|
|
||
|
for (size_t i = 0; i < data["temp"]["cores"].size(); i++)
|
||
|
{
|
||
|
if (i == 1)
|
||
|
{
|
||
|
M5.Lcd.setCursor(166,32);
|
||
|
M5.Lcd.fillRoundRect(162, 28, 154, 56, 1, 0x2104);
|
||
|
M5.Lcd.drawXBitmap(305, 32, temp, 7, 14, TFT_WHITE);
|
||
|
} else {
|
||
|
M5.Lcd.setCursor(8,32);
|
||
|
M5.Lcd.fillRoundRect(4, 28, 154, 56, 1, 0x2104);
|
||
|
M5.Lcd.drawXBitmap(147, 32, temp, 7, 14, TFT_WHITE);
|
||
|
}
|
||
|
|
||
|
M5.Lcd.setTextColor(0xDEFB);
|
||
|
M5.Lcd.print("Core ");
|
||
|
M5.Lcd.print(i);
|
||
|
M5.Lcd.print(": ");
|
||
|
|
||
|
if (i == 1)
|
||
|
{
|
||
|
M5.Lcd.setCursor(192,52);
|
||
|
} else {
|
||
|
M5.Lcd.setCursor(34,52);
|
||
|
}
|
||
|
M5.Lcd.setTextSize(4);
|
||
|
|
||
|
if (data["temp"]["cores"][i].as<int>() >= 75)
|
||
|
{
|
||
|
// Very hot
|
||
|
M5.Lcd.setTextColor(0xF0A6);
|
||
|
} else if (data["temp"]["cores"][i].as<int>() >= 55) {
|
||
|
// Meh
|
||
|
M5.Lcd.setTextColor(0xFDC9);
|
||
|
} else {
|
||
|
// Cool
|
||
|
M5.Lcd.setTextColor(0x1572);
|
||
|
}
|
||
|
|
||
|
M5.Lcd.print(data["temp"]["cores"][i].as<String>());
|
||
|
M5.Lcd.print(char(247));
|
||
|
M5.Lcd.println("C");
|
||
|
M5.Lcd.setTextSize(2);
|
||
|
}
|
||
|
|
||
|
M5.Lcd.setTextColor(0xDEFB);
|
||
|
|
||
|
// Memory Usage
|
||
|
M5.Lcd.fillRoundRect(4, 88, 312, 22, 1, 0x2104);
|
||
|
M5.Lcd.setCursor(8, 92);
|
||
|
M5.Lcd.drawXBitmap(297, 92, ram, 15, 10, TFT_WHITE);
|
||
|
|
||
|
M5.Lcd.print("Memory usage: ");
|
||
|
M5.Lcd.print((data["mem"]["active"].as<float>() / data["mem"]["total"].as<float>()) * 100);
|
||
|
M5.Lcd.println("%");
|
||
|
|
||
|
// Swap Usage
|
||
|
M5.Lcd.fillRoundRect(4, 114, 312, 22, 1, 0x2104);
|
||
|
M5.Lcd.setCursor(8, 118);
|
||
|
M5.Lcd.drawXBitmap(299, 118, swap, 13, 13, TFT_WHITE);
|
||
|
|
||
|
M5.Lcd.print("Swap usage: ");
|
||
|
M5.Lcd.print((data["mem"]["swapused"].as<float>() / data["mem"]["swaptotal"].as<float>()) * 100);
|
||
|
M5.Lcd.println("%");
|
||
|
|
||
|
// Disk Usage
|
||
|
M5.Lcd.fillRoundRect(4, 140, 312, 54, 1, 0x2104);
|
||
|
M5.Lcd.setCursor(8, 144);
|
||
|
M5.Lcd.drawXBitmap(298, 144, hdd, 14, 12, TFT_WHITE);
|
||
|
|
||
|
M5.Lcd.println("Disk usage: ");
|
||
|
for (size_t i = 0; i < data["fs"].size(); i++)
|
||
|
{
|
||
|
M5.Lcd.print(" " + data["fs"][i]["fs"].as<String>() + ": " + data["fs"][i]["use"].as<String>());
|
||
|
M5.Lcd.println("%");
|
||
|
}
|
||
|
|
||
|
// Bottom nav
|
||
|
M5.Lcd.fillRect(0, 218, 320, 22, 0x2104);
|
||
|
M5.Lcd.setCursor(126, 222);
|
||
|
M5.Lcd.println("Update");
|
||
|
} else {
|
||
|
M5.Lcd.print("HTTP Request Error: ");
|
||
|
M5.lcd.println(httpCode);
|
||
|
}
|
||
|
|
||
|
http.end();
|
||
|
}
|
||
|
|
||
|
void loop() {
|
||
|
if (M5.BtnB.wasPressed())
|
||
|
{
|
||
|
Serial.println("B");
|
||
|
update();
|
||
|
}
|
||
|
|
||
|
M5.update();
|
||
|
}
|