t-hmi first working: add touch, sdcard, remove vkbit

This commit is contained in:
cosmicpsyop 2024-05-28 14:29:00 -07:00
parent 3a50f87c31
commit c73a1fe19a
7 changed files with 218 additions and 19 deletions

View File

@ -61,6 +61,7 @@ Every time an stratum job notification is received miner update its current work
- ESP32-C3 Devkit ([Board Info](https://docs.platformio.org/en/latest/boards/espressif32/esp32-c3-devkitm-1.html))
- ESP32-C3 Super Mini ([Board Info](https://docs.platformio.org/en/latest/boards/espressif32/seeed_xiao_esp32c3.html))
- Waveshare ESP32-S3-GEEK ([Board Info](https://www.waveshare.com/wiki/ESP32-S3-GEEK))
- LILYGO T-HMI ([Aliexpress link\*](https://s.click.aliexpress.com/e/_oFII4s2)) / Dev support: @cosmicpsyop
\*Affiliate links

View File

@ -751,10 +751,11 @@ build_flags =
board_build.arduino.memory_type = qio_opi
lib_deps =
https://github.com/liangyingy/arduino_xpt2046_library
https://github.com/takkaO/OpenFontRender
bblanchon/ArduinoJson@^6.21.2
https://github.com/tzapu/WiFiManager.git#v2.0.16-rc.2
mathertel/OneButton @ ^2.0.3
mathertel/OneButton @ ^2.5.0
arduino-libraries/NTPClient
bodmer/TFT_eSPI @ ^2.5.31
https://github.com/achillhasler/TFT_eTouch

View File

@ -96,7 +96,11 @@ void setup()
/******** SHOW LED INIT STATUS (devices without screen) *****/
mMonitor.NerdStatus = NM_waitingConfig;
doLedStuff(0);
#ifdef NERDMINER_T_HMI
extern void t_hmiCheckForSDCardAndMoveToNVM(void);
t_hmiCheckForSDCardAndMoveToNVM();
#endif
/******** INIT WIFI ************/
init_WifiManager();
@ -142,6 +146,9 @@ void app_error_fault_handler(void *arg) {
// restart ESP32
esp_restart();
}
#ifdef NERDMINER_T_HMI
extern uint16_t t_hmiCheckForTouch();
#endif
void loop() {
// keep watching the push buttons:
@ -153,6 +160,9 @@ void loop() {
button2.tick();
#endif
#ifdef NERDMINER_T_HMI
t_hmiCheckForTouch();
#endif
wifiManagerProcess(); // avoid delays() in loop when non-blocking and other long running code
vTaskDelay(50 / portTICK_PERIOD_MS);

View File

@ -4,6 +4,7 @@
#define T_HMI_DISPLAY
#define PWR_EN_PIN (10)
#define PIN_ENABLE5V PWR_EN_PIN
#define PWR_ON_PIN (14)
#define BAT_ADC_PIN (5)
#define BUTTON1_PIN (0)
@ -29,11 +30,9 @@
// sd card
// 1-bit SD MMC
#ifdef DEFINE_SDMMC_1BIT
#define SDMMC_CLK (12)
#define SDMMC_CMD (11)
#define SDMMC_D0 (13)
#endif
#ifndef TFT_BL
// XXX - defined in User_Setups/Setup207_LilyGo_T_HMI.h:37

View File

@ -1,7 +1,8 @@
#include "displayDriver.h"
#ifdef T_HMI_DISPLAY
#include <FS.h>
#include <xpt2046.h> // https://github.com/liangyingy/arduino_xpt2046_library
#include <TFT_eSPI.h>
#include <TFT_eTouch.h>
#include "media/images_320_170.h"
@ -22,15 +23,159 @@ OpenFontRender render;
TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h
TFT_eSprite background = TFT_eSprite(&tft); // Invoke library sprite
SPIClass hSPI(HSPI);
#define TOUCH_ENABLE
//SPIClass hSPI(HSPI);
// TFT_eTouch<TFT_eSPI> touch(tft, ETOUCH_CS, 0xFF, hSPI);
#ifdef TOUCH_ENABLE
XPT2046 touch = XPT2046(SPI, ETOUCH_CS, TOUCH_IRQ);
#endif
bool showbtcprice = false;
extern monitor_data mMonitor;
extern pool_data pData;
extern DisplayDriver *currentDisplayDriver;
/*=============================================*/
#include <FS.h>
#include <ArduinoJson.h>
#include <WiFi.h>
#include "drivers/storage/nvMemory.h"
#include "drivers/storage/SDCard.h"
extern nvMemory nvMem;
extern TSettings Settings;
void t_hmiCheckForSDCardAndMoveToNVM(void)
{
// workaround removing use of class SDCard
// SCard SDCrd = SDCard() blows up in SDCard::initSDcard()
// Need to lower frequency to 20000
SD_MMC.setPins(SDMMC_CLK, SDMMC_CMD, SDMMC_D0);
delay(500);
bool rlst = SD_MMC.begin("/sd", true, false, 20000);
if (!rlst)
{
Serial.println("SD init failed");
Serial.println("➸ No detected SdCard");
}
else
{
Serial.println("SD init success");
Serial.printf("➸ Detected SdCard insert: %.2f GB\r\n", SD_MMC.cardSize() / 1024.0 / 1024.0 / 1024.0);
// SDCrd.SD2nvMemory(&nvMem, &Settings);
if (SD_MMC.exists(JSON_CONFIG_FILE))
{
// The file exists, reading and loading
File configFile = SD_MMC.open(JSON_CONFIG_FILE, "r");
if (configFile)
{
StaticJsonDocument<512> json;
DeserializationError error = deserializeJson(json, configFile);
configFile.close();
Serial.println("SDCard: Loading config file");
if (!error)
{
serializeJsonPretty(json, Serial);
Serial.print('\n');
TSettings *pSettings = &Settings;
pSettings->WifiSSID = json[JSON_KEY_SSID] | pSettings->WifiSSID;
pSettings->WifiPW = json[JSON_KEY_PASW] | pSettings->WifiPW;
pSettings->PoolAddress = json[JSON_KEY_POOLURL] | pSettings->PoolAddress;
strcpy(pSettings->PoolPassword, json[JSON_KEY_POOLPASS] | pSettings->PoolPassword);
strcpy(pSettings->BtcWallet, json[JSON_KEY_WALLETID] | pSettings->BtcWallet);
if (json.containsKey(JSON_KEY_POOLPORT))
pSettings->PoolPort = json[JSON_KEY_POOLPORT].as<int>();
if (json.containsKey(JSON_KEY_TIMEZONE))
pSettings->Timezone = json[JSON_KEY_TIMEZONE].as<int>();
if (json.containsKey(JSON_KEY_STATS2NV))
pSettings->saveStats = json[JSON_KEY_STATS2NV].as<bool>();
nvMem.saveConfig(pSettings);
WiFi.begin(pSettings->WifiSSID, pSettings->WifiPW);
Serial.println("SDCard: Settings transfered to internal memory. Restarting now.");
ESP.restart();
}
else
{
// Error loading JSON data
Serial.println("SDCard: Error parsing config file!");
}
}
else
{
Serial.println("SDCard: Error opening config file!");
}
}
else
{
Serial.println("SDCard: No config file available!");
}
// delay(15000);
SD_MMC.end();
Serial.println("SD close");
}
}
/*=============================================*/
unsigned int lower_switch = 1;
#ifdef TOUCH_ENABLE
extern void switchToNextScreen(void);
unsigned long now = 0;
unsigned long currentTime;
bool debounce() {
if (now) now = millis();
unsigned long currentTime = millis();
if (currentTime - now >= 2000) {
now = 0;
return true;
}
return false;
};
uint16_t t_hmiCheckForTouch()
{
uint16_t touch_x, touch_y, code = 0;
if (touch.pressed()) {
touch_x = touch.RawX();
touch_y = touch.RawY();
// do something with the touch coordinates
/*
Serial.print("Touch coordinates: ");
Serial.print(touch_x);
Serial.print(", ");
Serial.println(touch_y);
*/
// Perform actions based on touch coordinates
/*
if (y < y_min + (y_max - y_min) / 2) {
*/
if (touch_x < 200 + (1700 - 200) / 4) {
// bottom
code = 1;
if (debounce())
lower_switch = 3 - lower_switch;;
} else {
// top
code = 2;
if (debounce())
switchToNextScreen();
}
}
if (code) {
if (code == 1)
Serial.print("Touch bottom\n");
else
Serial.print("Touch top\n");
}
return(code);
}
#endif
uint32_t readAdcVoltage(int pin) {
esp_adc_cal_characteristics_t adc_chars;
@ -70,12 +215,32 @@ void t_hmiDisplay_Init(void)
Serial.println("Initialise error");
return;
}
/* XXX - Pass for first version
Serial.println(F("Initialize the touch screen"));
hSPI.begin(TOUCH_CLK, TOUCH_MISO, TOUCH_MOSI, ETOUCH_CS);
TFT_eTouchBase::Calibation calibation = { 233, 3785, 3731, 120, 2 };
touch.setCalibration(calibation);
*/
#ifdef TOUCH_ENABLE
// different approach
//hSPI.begin(TOUCH_CLK, TOUCH_MISO, TOUCH_MOSI, ETOUCH_CS);
//TFT_eTouchBase::Calibation calibation = { 233, 3785, 3731, 120, 2 };
//touch.setCalibration(calibation);
// Check if the screen is touched and get the coordinates
/*
if (touch.touched()) {
TS_Point p = touch.getPoint();
Serial.print("Pressure = ");
Serial.print(p.z);
Serial.print(", x = ");
Serial.print(p.x);
Serial.print(", y = ");
Serial.print(p.y);
delay(30);
Serial.println();
}
*/
SPI.begin(TOUCH_CLK, TOUCH_MISO, TOUCH_MOSI);
touch.begin(240, 320);
#endif
Serial.println(F("Turn on the LCD backlight"));
pinMode(LED_PIN, OUTPUT);
pinMode(BK_LIGHT_PIN, OUTPUT);
@ -83,6 +248,7 @@ void t_hmiDisplay_Init(void)
pData.bestDifficulty = "0";
pData.workersHash = "0";
pData.workersCount = 0;
lower_switch = 1;
}
@ -188,7 +354,11 @@ void t_hmiDisplay_MinerScreen(unsigned long mElapsed)
render.setFontSize(10);
render.rdrawString(data.currentTime.c_str(), 286, 1, TFT_BLACK);
printPoolData();
if (lower_switch == 1)
printPoolData();
else
printMemPoolFees(mElapsed);
// Push prepared background to screen
background.pushSprite(0, 0);
}
@ -226,7 +396,10 @@ void t_hmiDisplay_ClockScreen(unsigned long mElapsed)
background.setTextColor(0xDEDB, TFT_BLACK);
background.drawString(data.currentTime.c_str(), 130, 50, GFXFF);
printMemPoolFees(mElapsed);
if (lower_switch == 1)
printMemPoolFees(mElapsed);
else
printPoolData();
// Push prepared background to screen
background.pushSprite(0, 0);
}
@ -286,7 +459,11 @@ void t_hmiDisplay_GlobalHashScreen(unsigned long mElapsed)
background.setTextColor(TFT_BLACK);
background.drawString(data.remainingBlocks.c_str(), 72, 159, FONT2);
printMemPoolFees(mElapsed);
if (lower_switch == 1)
printMemPoolFees(mElapsed);
else
printPoolData();
// Push prepared background to screen
background.pushSprite(0, 0);
}
@ -326,7 +503,10 @@ void t_hmiDisplay_BTCprice(unsigned long mElapsed)
background.setTextSize(1);
background.setTextColor(0xDEDB, TFT_BLACK);
background.drawString(data.btcPrice.c_str(), 300, 58, GFXFF);
printPoolData();
if (lower_switch == 1)
printPoolData();
else
printMemPoolFees(mElapsed);
// Push prepared background to screen
background.pushSprite(0, 0);
}

View File

@ -34,7 +34,9 @@ SDCard::SDCard(int ID):cardInitialized_(false),cardBusy_(false)
}
iSD_ = &SD;
#endif // interface type
#ifndef NERDMINER_T_HMI
initSDcard();
#endif
}
SDCard::~SDCard()
@ -167,7 +169,14 @@ bool SDCard::initSDcard()
#elif defined (BUILD_SDMMC_1)
#warning SDMMC : 1 - bit mode is not always working. If you experience issues, try other modes.
iSD_->setPins(SDMMC_CLK, SDMMC_CMD, SDMMC_D0);
#ifdef NERDMINER_T_HMI
// Need to lower frequency to 20000
// Should work but blows up in SDCard::initSDcard()
// see temporary workaround t_hmiCheckForSDCardAndMoveToNVM()
cardInitialized_ = iSD_->begin("/sd", true, false, 20000);
#else
cardInitialized_ = iSD_->begin("/sd", true);
#endif
Serial.println("SDCard: 1-Bit Mode.");
}
#elif defined (BUILD_SDSPI)

View File

@ -335,13 +335,12 @@ String getPoolAPIUrl(void) {
else {
switch (Settings.PoolPort) {
case 3333:
if (Settings.PoolAddress == "pool.vkbit.com")
poolAPIUrl = "https://vkbit.com/miner/";
else if (Settings.PoolAddress == "pool.sethforprivacy.com")
if (Settings.PoolAddress == "pool.sethforprivacy.com")
poolAPIUrl = "https://pool.sethforprivacy.com/api/client/";
// Add more cases for other addresses with port 3333 if needed
break;
case 2018:
// Local instance of public-pool.io on Umbrel or Start9
poolAPIUrl = "http://" + Settings.PoolAddress + ":2019/api/client/";
break;
default: