diff --git a/platformio.ini b/platformio.ini index 451841b..22d6a37 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,8 +11,7 @@ [platformio] globallib_dir = lib -default_envs = M5Stick-C, esp32cam, ESP32-2432S028R, ESP32_2432S028_2USB, NerminerV2, Lilygo-T-Embed, ESP32-devKitv1, NerminerV2-S3-DONGLE, NerminerV2-S3-AMOLED, NerminerV2-T-QT, NerdminerV2-T-Display_V1, ESP32-2432S028R, M5-StampS3, ESP32-S3-devKitv1, ESP32-S3-mini-wemos, ESP32-S3-mini-weact, ESP32-C3-devKitmv1, ESP32-C3-super-mini - +default_envs = han_m5stack, M5Stick-C, esp32cam, ESP32-2432S028R, NerminerV2, ESP32-devKitv1, NerminerV2-S3-DONGLE, NerminerV2-S3-AMOLED, NerminerV2-T-QT, NerdminerV2-T-Display_V1, ESP32-2432S028R, M5-StampS3, ESP32-S3-devKitv1, ESP32-S3-mini-wemos, ESP32-S3-mini-weact [env:M5Stick-C] platform = espressif32 @@ -41,7 +40,6 @@ lib_ignore = SD SD_MMC rm67162 - ;-------------------------------------------------------------------- [env:ESP32-S3-mini-wemos] @@ -72,7 +70,33 @@ lib_deps = https://github.com/FastLED/FastLED lib_ignore = TFT_eSPI +;-------------------------------------------------------------------- +[env:han_m5stack] +platform = espressif32 +board = m5stack-core-esp32 +framework = arduino +monitor_filters = + esp32_exception_decoder + time + log2file +;board_build.arduino.memory_type = qio_opi +monitor_speed = 115200 +upload_speed = 115200 +# 2 x 4.5MB app, 6.875MB SPIFFS +board_build.partitions = huge_app.csv +build_flags = + -D HAN=1 + -D M5STACK_BOARD=1 + ;-D DEBUG_MINING=1 +lib_deps = + bblanchon/ArduinoJson@^6.21.2 + https://github.com/tzapu/WiFiManager.git#v2.0.16-rc.2 + mathertel/OneButton @ ^2.0.3 + arduino-libraries/NTPClient + m5stack@^0.4.6 +lib_ignore = + TFT_eSPI ;-------------------------------------------------------------------- [env:ESP32-S3-mini-weact] diff --git a/src/drivers/devices/device.h b/src/drivers/devices/device.h index 2d2feb9..0dd9906 100644 --- a/src/drivers/devices/device.h +++ b/src/drivers/devices/device.h @@ -27,7 +27,16 @@ #include "esp32CAM.h" #elif defined(ESP32RGB) #include "esp32RGB.h" - +#elif defined(M5_STAMP_S3) +#include "m5StampS3.h" +#elif defined(DEVKITV1RGB) +#include "esp32DevKitRGB.h" +#elif defined(S3MINIWEMOS) +#include "esp32S3MiniWemos.h" +#elif defined(S3MINIWEACT) +#include "esp32S3MiniWeact.h" +#elif defined(M5STACK_BOARD) +#include "m5stack.h" #else #error "No device defined" #endif diff --git a/src/drivers/devices/m5stack.h b/src/drivers/devices/m5stack.h new file mode 100644 index 0000000..f60ec7a --- /dev/null +++ b/src/drivers/devices/m5stack.h @@ -0,0 +1,6 @@ +#ifndef _M5_STACK_H +#define _M5_STACK_H + +#define M5STACK_DISPLAY + +#endif \ No newline at end of file diff --git a/src/drivers/displays/Free_Fonts.h b/src/drivers/displays/Free_Fonts.h new file mode 100644 index 0000000..4870df1 --- /dev/null +++ b/src/drivers/displays/Free_Fonts.h @@ -0,0 +1,377 @@ +// Attach this header file to your sketch to use the GFX Free Fonts. You can write +// sketches without it, but it makes referencing them easier. + +// This calls up ALL the fonts but they only get loaded if you actually +// use them in your sketch. +// +// No changes are needed to this header file unless new fonts are added to the +// library "Fonts/GFXFF" folder. +// +// To save a lot of typing long names, each font can easily be referenced in the +// sketch in three ways, either with: +// +// 1. Font file name with the & in front such as &FreeSansBoldOblique24pt7b +// an example being: +// +// tft.setFreeFont(&FreeSansBoldOblique24pt7b); +// +// 2. FF# where # is a number determined by looking at the list below +// an example being: +// +// tft.setFreeFont(FF32); +// +// 3. An abbreviation of the file name. Look at the list below to see +// the abbreviations used, for example: +// +// tft.setFreeFont(FSSBO24) +// +// Where the letters mean: +// F = Free font +// M = Mono +// SS = Sans Serif (double S to distinguish is form serif fonts) +// S = Serif +// B = Bold +// O = Oblique (letter O not zero) +// I = Italic +// # = point size, either 9, 12, 18 or 24 +// +// Setting the font to NULL will select the GLCD font: +// +// tft.setFreeFont(NULL); // Set font to GLCD + +#define LOAD_GFXFF + +#ifdef LOAD_GFXFF // Only include the fonts if LOAD_GFXFF is defined in User_Setup.h + +// Use these when printing or drawing text in GLCD and high rendering speed fonts +#define GFXFF 1 +#define GLCD 0 +#define FONT2 2 +#define FONT4 4 +#define FONT6 6 +#define FONT7 7 +#define FONT8 8 + +// Use the following when calling setFont() +// +// Reserved for GLCD font // FF0 +// + +#define TT1 &TomThumb + +#define FM9 &FreeMono9pt7b +#define FM12 &FreeMono12pt7b +#define FM18 &FreeMono18pt7b +#define FM24 &FreeMono24pt7b + +#define FMB9 &FreeMonoBold9pt7b +#define FMB12 &FreeMonoBold12pt7b +#define FMB18 &FreeMonoBold18pt7b +#define FMB24 &FreeMonoBold24pt7b + +#define FMO9 &FreeMonoOblique9pt7b +#define FMO12 &FreeMonoOblique12pt7b +#define FMO18 &FreeMonoOblique18pt7b +#define FMO24 &FreeMonoOblique24pt7b + +#define FMBO9 &FreeMonoBoldOblique9pt7b +#define FMBO12 &FreeMonoBoldOblique12pt7b +#define FMBO18 &FreeMonoBoldOblique18pt7b +#define FMBO24 &FreeMonoBoldOblique24pt7b + +#define FSS9 &FreeSans9pt7b +#define FSS12 &FreeSans12pt7b +#define FSS18 &FreeSans18pt7b +#define FSS24 &FreeSans24pt7b + +#define FSSB9 &FreeSansBold9pt7b +#define FSSB12 &FreeSansBold12pt7b +#define FSSB18 &FreeSansBold18pt7b +#define FSSB24 &FreeSansBold24pt7b + +#define FSSO9 &FreeSansOblique9pt7b +#define FSSO12 &FreeSansOblique12pt7b +#define FSSO18 &FreeSansOblique18pt7b +#define FSSO24 &FreeSansOblique24pt7b + +#define FSSBO9 &FreeSansBoldOblique9pt7b +#define FSSBO12 &FreeSansBoldOblique12pt7b +#define FSSBO18 &FreeSansBoldOblique18pt7b +#define FSSBO24 &FreeSansBoldOblique24pt7b + +#define FS9 &FreeSerif9pt7b +#define FS12 &FreeSerif12pt7b +#define FS18 &FreeSerif18pt7b +#define FS24 &FreeSerif24pt7b + +#define FSI9 &FreeSerifItalic9pt7b +#define FSI12 &FreeSerifItalic12pt7b +#define FSI19 &FreeSerifItalic18pt7b +#define FSI24 &FreeSerifItalic24pt7b + +#define FSB9 &FreeSerifBold9pt7b +#define FSB12 &FreeSerifBold12pt7b +#define FSB18 &FreeSerifBold18pt7b +#define FSB24 &FreeSerifBold24pt7b + +#define FSBI9 &FreeSerifBoldItalic9pt7b +#define FSBI12 &FreeSerifBoldItalic12pt7b +#define FSBI18 &FreeSerifBoldItalic18pt7b +#define FSBI24 &FreeSerifBoldItalic24pt7b + +#define FF0 NULL //ff0 reserved for GLCD +#define FF1 &FreeMono9pt7b +#define FF2 &FreeMono12pt7b +#define FF3 &FreeMono18pt7b +#define FF4 &FreeMono24pt7b + +#define FF5 &FreeMonoBold9pt7b +#define FF6 &FreeMonoBold12pt7b +#define FF7 &FreeMonoBold18pt7b +#define FF8 &FreeMonoBold24pt7b + +#define FF9 &FreeMonoOblique9pt7b +#define FF10 &FreeMonoOblique12pt7b +#define FF11 &FreeMonoOblique18pt7b +#define FF12 &FreeMonoOblique24pt7b + +#define FF13 &FreeMonoBoldOblique9pt7b +#define FF14 &FreeMonoBoldOblique12pt7b +#define FF15 &FreeMonoBoldOblique18pt7b +#define FF16 &FreeMonoBoldOblique24pt7b + +#define FF17 &FreeSans9pt7b +#define FF18 &FreeSans12pt7b +#define FF19 &FreeSans18pt7b +#define FF20 &FreeSans24pt7b + +#define FF21 &FreeSansBold9pt7b +#define FF22 &FreeSansBold12pt7b +#define FF23 &FreeSansBold18pt7b +#define FF24 &FreeSansBold24pt7b + +#define FF25 &FreeSansOblique9pt7b +#define FF26 &FreeSansOblique12pt7b +#define FF27 &FreeSansOblique18pt7b +#define FF28 &FreeSansOblique24pt7b + +#define FF29 &FreeSansBoldOblique9pt7b +#define FF30 &FreeSansBoldOblique12pt7b +#define FF31 &FreeSansBoldOblique18pt7b +#define FF32 &FreeSansBoldOblique24pt7b + +#define FF33 &FreeSerif9pt7b +#define FF34 &FreeSerif12pt7b +#define FF35 &FreeSerif18pt7b +#define FF36 &FreeSerif24pt7b + +#define FF37 &FreeSerifItalic9pt7b +#define FF38 &FreeSerifItalic12pt7b +#define FF39 &FreeSerifItalic18pt7b +#define FF40 &FreeSerifItalic24pt7b + +#define FF41 &FreeSerifBold9pt7b +#define FF42 &FreeSerifBold12pt7b +#define FF43 &FreeSerifBold18pt7b +#define FF44 &FreeSerifBold24pt7b + +#define FF45 &FreeSerifBoldItalic9pt7b +#define FF46 &FreeSerifBoldItalic12pt7b +#define FF47 &FreeSerifBoldItalic18pt7b +#define FF48 &FreeSerifBoldItalic24pt7b + +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +// Now we define "s"tring versions for easy printing of the font name so: +// tft.println(sFF5); +// will print +// Mono bold 9 +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#define sFF0 "GLCD" +#define sTT1 "Tom Thumb" +#define sFF1 "Mono 9" +#define sFF2 "Mono 12" +#define sFF3 "Mono 18" +#define sFF4 "Mono 24" + +#define sFF5 "Mono bold 9" +#define sFF6 "Mono bold 12" +#define sFF7 "Mono bold 18" +#define sFF8 "Mono bold 24" + +#define sFF9 "Mono oblique 9" +#define sFF10 "Mono oblique 12" +#define sFF11 "Mono oblique 18" +#define sFF12 "Mono oblique 24" + +#define sFF13 "Mono bold oblique 9" +#define sFF14 "Mono bold oblique 12" +#define sFF15 "Mono bold oblique 18" +#define sFF16 "Mono bold obl. 24" // Full text line is too big for 480 pixel wide screen + +#define sFF17 "Sans 9" +#define sFF18 "Sans 12" +#define sFF19 "Sans 18" +#define sFF20 "Sans 24" + +#define sFF21 "Sans bold 9" +#define sFF22 "Sans bold 12" +#define sFF23 "Sans bold 18" +#define sFF24 "Sans bold 24" + +#define sFF25 "Sans oblique 9" +#define sFF26 "Sans oblique 12" +#define sFF27 "Sans oblique 18" +#define sFF28 "Sans oblique 24" + +#define sFF29 "Sans bold oblique 9" +#define sFF30 "Sans bold oblique 12" +#define sFF31 "Sans bold oblique 18" +#define sFF32 "Sans bold oblique 24" + +#define sFF33 "Serif 9" +#define sFF34 "Serif 12" +#define sFF35 "Serif 18" +#define sFF36 "Serif 24" + +#define sFF37 "Serif italic 9" +#define sFF38 "Serif italic 12" +#define sFF39 "Serif italic 18" +#define sFF40 "Serif italic 24" + +#define sFF41 "Serif bold 9" +#define sFF42 "Serif bold 12" +#define sFF43 "Serif bold 18" +#define sFF44 "Serif bold 24" + +#define sFF45 "Serif bold italic 9" +#define sFF46 "Serif bold italic 12" +#define sFF47 "Serif bold italic 18" +#define sFF48 "Serif bold italic 24" + +#else // LOAD_GFXFF not defined so setup defaults to prevent error messages + +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +// Free fonts are not loaded in User_Setup.h so we must define all as font 1 +// to prevent compile error messages +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#define GFXFF 1 +#define GLCD 1 +#define FONT2 2 +#define FONT4 4 +#define FONT6 6 +#define FONT7 7 +#define FONT8 8 + +#define FF0 1 +#define FF1 1 +#define FF2 1 +#define FF3 1 +#define FF4 1 +#define FF5 1 +#define FF6 1 +#define FF7 1 +#define FF8 1 +#define FF9 1 +#define FF10 1 +#define FF11 1 +#define FF12 1 +#define FF13 1 +#define FF14 1 +#define FF15 1 +#define FF16 1 +#define FF17 1 +#define FF18 1 +#define FF19 1 +#define FF20 1 +#define FF21 1 +#define FF22 1 +#define FF23 1 +#define FF24 1 +#define FF25 1 +#define FF26 1 +#define FF27 1 +#define FF28 1 +#define FF29 1 +#define FF30 1 +#define FF31 1 +#define FF32 1 +#define FF33 1 +#define FF34 1 +#define FF35 1 +#define FF36 1 +#define FF37 1 +#define FF38 1 +#define FF39 1 +#define FF40 1 +#define FF41 1 +#define FF42 1 +#define FF43 1 +#define FF44 1 +#define FF45 1 +#define FF46 1 +#define FF47 1 +#define FF48 1 + +#define FM9 1 +#define FM12 1 +#define FM18 1 +#define FM24 1 + +#define FMB9 1 +#define FMB12 1 +#define FMB18 1 +#define FMB24 1 + +#define FMO9 1 +#define FMO12 1 +#define FMO18 1 +#define FMO24 1 + +#define FMBO9 1 +#define FMBO12 1 +#define FMBO18 1 +#define FMBO24 1 + +#define FSS9 1 +#define FSS12 1 +#define FSS18 1 +#define FSS24 1 + +#define FSSB9 1 +#define FSSB12 1 +#define FSSB18 1 +#define FSSB24 1 + +#define FSSO9 1 +#define FSSO12 1 +#define FSSO18 1 +#define FSSO24 1 + +#define FSSBO9 1 +#define FSSBO12 1 +#define FSSBO18 1 +#define FSSBO24 1 + +#define FS9 1 +#define FS12 1 +#define FS18 1 +#define FS24 1 + +#define FSI9 1 +#define FSI12 1 +#define FSI19 1 +#define FSI24 1 + +#define FSB9 1 +#define FSB12 1 +#define FSB18 1 +#define FSB24 1 + +#define FSBI9 1 +#define FSBI12 1 +#define FSBI18 1 +#define FSBI24 1 + +#endif // LOAD_GFXFF \ No newline at end of file diff --git a/src/drivers/displays/display.cpp b/src/drivers/displays/display.cpp index 3838aa3..a7bcf02 100644 --- a/src/drivers/displays/display.cpp +++ b/src/drivers/displays/display.cpp @@ -4,6 +4,10 @@ DisplayDriver *currentDisplayDriver = &noDisplayDriver; #endif +#ifdef M5STACK_DISPLAY +DisplayDriver *currentDisplayDriver = &m5stackDisplayDriver; +#endif + #ifdef LED_DISPLAY DisplayDriver *currentDisplayDriver = &ledDisplayDriver; #endif diff --git a/src/drivers/displays/displayDriver.h b/src/drivers/displays/displayDriver.h index d8858ad..dcbbbaa 100644 --- a/src/drivers/displays/displayDriver.h +++ b/src/drivers/displays/displayDriver.h @@ -28,6 +28,7 @@ typedef struct extern DisplayDriver *currentDisplayDriver; +extern DisplayDriver m5stackDisplayDriver; extern DisplayDriver noDisplayDriver; extern DisplayDriver ledDisplayDriver; extern DisplayDriver tDisplayDriver; diff --git a/src/drivers/displays/m5stackDisplayDriver.cpp b/src/drivers/displays/m5stackDisplayDriver.cpp new file mode 100644 index 0000000..8abfe93 --- /dev/null +++ b/src/drivers/displays/m5stackDisplayDriver.cpp @@ -0,0 +1,118 @@ +#include "displayDriver.h" + +#ifdef M5STACK_DISPLAY + +#include +#include +#include + +#include "Free_Fonts.h" +#include "monitor.h" +#include "drivers/storage/storage.h" +#include "wManager.h" + +extern monitor_data mMonitor; +extern TSettings Settings; + +void m5stackDisplay_Init(void) +{ + Serial.println("M5stack display driver initialized"); + M5.begin(); //Init M5Stack + M5.Power.begin(); //Init power + M5.Lcd.setTextColor(WHITE); + M5.Lcd.setFreeFont(FMB9); + M5.Lcd.setCursor(0,0); + M5.Lcd.fillScreen(BLACK); + M5.Lcd.println(""); + M5.Lcd.println(" Han ANother SOLOminer"); + M5.Lcd.drawLine(0,25,320,25,GREENYELLOW); + M5.Lcd.fillRect(0,30,320,20,WHITE); + M5.Lcd.println(""); + M5.Lcd.println(""); + M5.Lcd.println("HAN SOLO is a solo miner"); + M5.Lcd.println(" on a ESP32."); M5.Lcd.setTextColor(RED); + M5.Lcd.println("WARNING: you may have to wait"); + M5.Lcd.println(" longer than the current age"); + M5.Lcd.println(" of the universe to find a "); + M5.Lcd.println(" valid block."); M5.Lcd.setTextColor(WHITE); + M5.Lcd.drawLine(0,200,320,200,GREENYELLOW); + M5.Lcd.println("Connect via wifi to HanSoloAP"); + M5.Lcd.println(" with password MineYourCoins"); +} + +void m5stackDisplay_AlternateScreenState(void) +{ +} + +void m5stackDisplay_AlternateRotation(void) +{ +} + +void m5stackDisplay_NoScreen(unsigned long mElapsed) +{ + mining_data data = getMiningData(mElapsed); + + // Print hashrate to serial + Serial.printf(">>> Completed %s share(s), %s Khashes, avg. hashrate %s KH/s\n", + data.completedShares.c_str(), data.totalKHashes.c_str(), data.currentHashRate.c_str()); + //Serial.printf(">>> Temperature: %s\n", data.temp.c_str()); + + M5.Lcd.setTextColor(WHITE); + M5.Lcd.setFreeFont(FMB9); + M5.Lcd.setCursor(0,0); + M5.Lcd.fillScreen(BLACK); + M5.Lcd.println(""); + M5.Lcd.println(" Han ANother SOLOminer"); + M5.Lcd.drawLine(0,25,320,25,GREENYELLOW); + M5.Lcd.fillRect(0,30,320,20,WHITE); + M5.Lcd.progressBar(0,30,320,20, data.currentHashRate.toInt()); + M5.Lcd.println(""); + M5.Lcd.println(""); + M5.Lcd.print("Avg. hashrate : "); M5.Lcd.setTextColor(GREEN); M5.Lcd.print(data.currentHashRate); M5.Lcd.setTextColor(WHITE); M5.Lcd.println(" KH/s"); + M5.Lcd.print("Running time : "); M5.Lcd.setTextColor(GREEN); M5.Lcd.println(data.timeMining); M5.Lcd.setTextColor(WHITE); + M5.Lcd.print("Total hashes : "); M5.Lcd.setTextColor(GREEN); M5.Lcd.print(data.totalKHashes); M5.Lcd.setTextColor(WHITE); M5.Lcd.println(" KH"); + M5.Lcd.print("Block templ. : "); M5.Lcd.setTextColor(YELLOW); M5.Lcd.println(data.templates); M5.Lcd.setTextColor(WHITE); + M5.Lcd.print("Best dificulty: "); M5.Lcd.setTextColor(YELLOW); M5.Lcd.println(data.bestDiff); M5.Lcd.setTextColor(WHITE); + M5.Lcd.print("Shares 32bits : "); M5.Lcd.setTextColor(YELLOW); M5.Lcd.println(data.completedShares); M5.Lcd.setTextColor(WHITE); + M5.Lcd.print("Valid blocks : "); M5.Lcd.setTextColor(RED); M5.Lcd.println(data.valids); M5.Lcd.setTextColor(WHITE); + M5.Lcd.println(""); + M5.Lcd.drawLine(0,200,320,200,GREENYELLOW); + M5.Lcd.print("Pool: "); M5.Lcd.setTextColor(GREENYELLOW); M5.Lcd.print(Settings.PoolAddress); M5.Lcd.print(":"); M5.Lcd.println(Settings.PoolPort); M5.Lcd.setTextColor(WHITE); + M5.Lcd.print("IP : "); M5.Lcd.setTextColor(GREENYELLOW); M5.Lcd.println(WiFi.localIP()); M5.Lcd.setTextColor(WHITE); + M5.Lcd.println(""); +} +void m5stackDisplay_LoadingScreen(void) +{ + Serial.println("Initializing..."); +} + +void m5stackDisplay_SetupScreen(void) +{ + Serial.println("Setup..."); +} + +void m5stackDisplay_DoLedStuff(unsigned long frame) +{ +} + +void m5stackDisplay_AnimateCurrentScreen(unsigned long frame) +{ +} + +CyclicScreenFunction m5stackDisplayCyclicScreens[] = {m5stackDisplay_NoScreen}; + +DisplayDriver m5stackDisplayDriver = { + m5stackDisplay_Init, + m5stackDisplay_AlternateScreenState, + m5stackDisplay_AlternateRotation, + m5stackDisplay_LoadingScreen, + m5stackDisplay_SetupScreen, + m5stackDisplayCyclicScreens, + m5stackDisplay_AnimateCurrentScreen, + m5stackDisplay_DoLedStuff, + SCREENS_ARRAY_SIZE(m5stackDisplayCyclicScreens), + 0, + 0, + 0, +}; +#endif diff --git a/src/drivers/storage/storage.h b/src/drivers/storage/storage.h index 8336847..fe5d8e4 100644 --- a/src/drivers/storage/storage.h +++ b/src/drivers/storage/storage.h @@ -6,7 +6,11 @@ // config files // default settings +#ifndef HAN #define DEFAULT_SSID "NerdMinerAP" +#else +#define DEFAULT_SSID "HanSoloAP" +#endif #define DEFAULT_WIFIPW "MineYourCoins" #define DEFAULT_POOLURL "public-pool.io" #define DEFAULT_POOLPASS "x" diff --git a/src/stratum.cpp b/src/stratum.cpp index 00d72a4..2deb2e1 100644 --- a/src/stratum.cpp +++ b/src/stratum.cpp @@ -54,7 +54,11 @@ bool tx_mining_subscribe(WiFiClient& client, mining_subscribe& mSubscribe) // Subscribe id = 1; //Initialize id messages + #ifndef HAN sprintf(payload, "{\"id\": %u, \"method\": \"mining.subscribe\", \"params\": [\"NerdMinerV2\"]}\n", id); + #else + sprintf(payload, "{\"id\": %u, \"method\": \"mining.subscribe\", \"params\": [\"HAN_SOLOminer\"]}\n", id); + #endif Serial.printf("[WORKER] ==> Mining subscribe\n"); Serial.print(" Sending : "); Serial.println(payload);