Change to CoinGecko API for price data and keep the webserver priority default

This commit is contained in:
Djuri Baars 2023-10-27 20:32:33 +02:00
parent aae94b56c9
commit 0bf60d160f
2 changed files with 63 additions and 27 deletions

View File

@ -62,7 +62,7 @@ build_flags =
-D WITH_BUTTONS -D WITH_BUTTONS
-D ARDUINO_USB_CDC_ON_BOOT -D ARDUINO_USB_CDC_ON_BOOT
-D HOSTNAME="\"btclock3\"" -D HOSTNAME="\"btclock3\""
-D CONFIG_ASYNC_TCP_PRIORITY=500 -mfix-esp32-psram-cache-issue
[env:esp32wemos-s3-mini_3C] [env:esp32wemos-s3-mini_3C]
platform = espressif32 platform = espressif32

View File

@ -1,6 +1,7 @@
#include "get_price.hpp" #include "get_price.hpp"
const PROGMEM char *apiUrl = "https://api.coindesk.com/v1/bpi/currentprice/USD.json"; const PROGMEM char *apiUrl = "https://api.coindesk.com/v1/bpi/currentprice/USD.json";
const PROGMEM char *cgApiUrl = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd%2Ceur";
std::vector<EventCallbackWithNumber> priceEventCallbacks; // Define a vector to hold multiple event callbacks std::vector<EventCallbackWithNumber> priceEventCallbacks; // Define a vector to hold multiple event callbacks
TaskHandle_t getPriceTaskHandle; TaskHandle_t getPriceTaskHandle;
@ -18,6 +19,38 @@ void taskGetPrice(void *pvParameters)
HTTPClient http; HTTPClient http;
http.setUserAgent(USER_AGENT); http.setUserAgent(USER_AGENT);
if (true)
{
// Send HTTP request to CoinGecko API
http.begin(cgApiUrl);
int httpCode = http.GET();
// Parse JSON response and extract average price
float usdPrice, eurPrice;
if (httpCode == 200)
{
String payload = http.getString();
StaticJsonDocument<768> doc;
deserializeJson(doc, payload);
JsonObject bpi = doc["bitcoin"];
usdPrice = bpi["usd"];
eurPrice = bpi["eur"];
for (auto &callback : priceEventCallbacks)
{ // Loop through all the event callbacks and call them
callback(usdPrice);
}
preferences.putFloat("btcPrice", usdPrice);
preferences.putFloat("btcPriceEur", eurPrice);
}
else
{
Serial.print(F("Error retrieving BTC/USD price (CoinGecko). HTTP status code: "));
Serial.println(httpCode);
}
} else {
// Send HTTP request to CoinDesk API // Send HTTP request to CoinDesk API
http.begin(apiUrl); http.begin(apiUrl);
@ -33,7 +66,8 @@ void taskGetPrice(void *pvParameters)
JsonObject bpi = doc["bpi"]; JsonObject bpi = doc["bpi"];
usdPrice = bpi["USD"]["rate_float"]; usdPrice = bpi["USD"]["rate_float"];
eurPrice = bpi["EUR"]["rate_float"]; eurPrice = bpi["EUR"]["rate_float"];
for(auto &callback : priceEventCallbacks) { // Loop through all the event callbacks and call them for (auto &callback : priceEventCallbacks)
{ // Loop through all the event callbacks and call them
callback(usdPrice); callback(usdPrice);
} }
@ -42,9 +76,10 @@ void taskGetPrice(void *pvParameters)
} }
else else
{ {
Serial.print(F("Error retrieving BTC/USD price. HTTP status code: ")); Serial.print(F("Error retrieving BTC/USD price (CoinDesk). HTTP status code: "));
Serial.println(httpCode); Serial.println(httpCode);
} }
}
http.end(); http.end();
@ -54,7 +89,8 @@ void taskGetPrice(void *pvParameters)
void setupGetPriceTask() void setupGetPriceTask()
{ {
if (getPriceTaskHandle == nullptr) { if (getPriceTaskHandle == nullptr)
{
xTaskCreate(taskGetPrice, "getPrice", 8192, NULL, 1, &getPriceTaskHandle); xTaskCreate(taskGetPrice, "getPrice", 8192, NULL, 1, &getPriceTaskHandle);
vTaskSuspend(getPriceTaskHandle); vTaskSuspend(getPriceTaskHandle);
} }