blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Ik zoek regelmatig naar microcontrolers die mij handigt lijken voor projectjes.
En dan vooral naar modellen waar al een display op zit, dus een complete module.
De laatste twee weken meerdere microcontroler binen gehad e ner komt nog meer binnen.
De eerste leuke was de HELTEC: WiFi kit 32 deze heeft een 128x64 OLED schermpje en daarvan is het mij gelijkt om mijn eigen data op het schermpje te krijgen.
Maar nu het probleem geval...
Dat is de HELTEC: Vision Master T190 hierop is een prachtig mooi TFT schermpje gemonteerd met een resulutie van 170x320 pixels.
Verder nog veel meer mogelijkheden, maar zie daarvoor maar de onderstaande link met alle mogelijkheden.
Mijn doel is een mooi scherm, snel genoeg en voldoende programma ruimte, alle andere toeters en bellen zal ik niet gaan gebruiken.
De link naar het model en zijn toepassingen en gegevens, doorscrollen naar beneden voor veel info:
https://heltec.org/project/vision-master-t190/
User Manual
https://docs.heltec.org/en/node/esp32/ht_vmt190/index.html
Beeldscherm datasheet, display driver is de ST7789
https://resource.heltec.cn/download/HT-VMT190/SPEC%20N190-1732TBWPG01-…
Ik heb mijzelf al een slag in de ronte gezocht hoe ik het display aan het werk krijg met een stukje eigen code.
Er wordt echt een enorme baal aan voorbeelden meegelevert, maar nergens in die code is te vinden welke SPI pinnen ik moet gebruiken en hoe ik de Adafruit ST7789 library moet configureren.
In een forum wordt verwezen naar deze library van Adafruit, maar mij is het niet gelult een eigen plaatje te toveren op het display.
De unit word geleverst met wat software dat ook het display aanstuurd, en dat is echt een plaatje, prachtige kleuren en hoge helderheid,
dit samen met de grote van het display vind ik dit ene prachtig product, nu nog beeld krijgen door eigen code, dat zou mooi zijn!
Wat heb ik zelf al gedaan, natuurlijk mij rot gezocht in alle voorbeelden, denk aan meer dan 50 stuks, gezocht bij Heltec zelf, niets kunnen vinden dat mij hielp.
Aan de hand van het schema van deze microcontroler module proberen te bepalen welke pin nummers ik moet gebruiken voor het aansturen van de ST7789.
Rechts op het schema fragment het display.
Aan de linker zijde de controler print, wat ik denk dat van belang is, staat in de groene kaders.
Wel je een groot schema, klik dan op de onderstaande link.
https://resource.heltec.cn/download/HT-VMT190/HT-VMT90%20Schematic%20D…
.

Mooi, dan hier ene stukje code waarin de driver wordt aangeroepen met de pinnummers voorde SPI interface van de processor/display.
Hieronder een stukje uit de code waar ik veel opmerkingen heb verwijderd die ondermeer voor andere dispaly grootes zijn.
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
// OR for the ST7789-based displays, we will use this call
//Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
Adafruit_ST7789 tft = Adafruit_ST7789(39, 38, xx, xx, 40);
float p = 3.1415926;
void setup(void) {
Serial.begin(9600);
Serial.print(F("Hello! ST77xx TFT Test"));
// OR use this initializer (uncomment) if using a 1.9" 170x320 TFT:
tft.init(170, 320); // Init ST7789 170x320
// SPI speed defaults to SPI_DEFAULT_FREQ defined in the library, you can override it here
// Note that speed allowable depends on chip and quality of wiring, if you go too fast, you
// may end up with a black screen some times, or all the time.
//tft.setSPISpeed(40000000);
Serial.println(F("Initialized"));
Het gaat er dus om, welke pinning ik nu op moet geven in de regel: tft = Adafruit_ST7789(39, 38, xx, xx, 40);
Natuurlijk al aardig wat geprobeerd maar behelve bij de orginele code die in de controler zat, heb ik zelf geen pixel kunne laten oplichten.
Zoveel data is er te vinden over deze modules, maar geen enkele data voor het correct aansturen van het display, onbegrijpeliijk...
Ik zal wel weer blind zijn...
zien jullie misschien hoe ik het moet aanvatten?
Dank alvast,
Bram
benleentje
Golden Member
maar nergens in die code is te vinden welke SPI pinnen ik moet gebruiken
De code gaat altijd uit van de SPI 0 interface en de SPI pinnen liggen vast voor elke microcontroller. De Arduino software weet doordat je specifiek microcontroller hebt geselecteerd dan automatisch wat de spi pinnen zijn.
Als je dan wilt weten welke pinnen voor spi zijn dan zal je dat specifiek moeten zoeken voor de HELTEC: WiFi kit 32
IK zoek in Google dan zelf
HELTEC: WiFi kit 32 spi pins
https://heltec.org/project/wifi-kit32-v3/
Maar dan loop ik daar ook vast ik zie nu ook even niet wat de SPI pinnen zijn.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
benleentje het gaat om de Heltec Vision Mastet T190!
Ik heb net dit gevonden, zie de link hieronder en ik ben met de pinnummers aan het spelen in de code.
Tot nog toe geen succes.
Zie regels 60 t/m 65 betreffende het TFT display.
https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series/blob/master/varian…
Groet,
Bram
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Zoals Roches al aangaf, stukje uit het shema geknipt met de pinnen die naar je display gaan.
@Bram, in de geposte github code komen ze ook weer terug, maar dat zul je moeten aanpassen op jouw boardje.
Github:
static const uint8_t TFT_SCL = 38;
static const uint8_t TFT_CS = 39;
static const uint8_t TFT_RST = 40;
static const uint8_t TFT_RS = 47;
static const uint8_t TFT_SDA = 48;Jouw bord:
static const uint8_t TFT_SCL = 48;
static const uint8_t TFT_CS = 44;
static const uint8_t TFT_RST = 45;
static const uint8_t TFT_RS = 47;
static const uint8_t TFT_SDA = 51;[Bericht gewijzigd door Roland van Leusden op (21%)]
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Ik wou net vor het slapen gaan weer het bijltje er bij neer gooien voor vandaag.
Ik heb de Adafruit code(ST7789) opnieuw geladen in de Arduino IDE, daar zitten trouwens nog wat bugs in, maar een herstart van het programma lost dit meestal op.
Dit hielp bij de eerste stap.
static const uint8_t Vext = 5;
static const uint8_t TFT_SCL = 38;
static const uint8_t TFT_CS = 39;
static const uint8_t TFT_RST = 40;
static const uint8_t TFT_RS = 47;
static const uint8_t TFT_SDA = 48;
Maak kijkend in het schema zijn er nog twee items die moeten worden aangepakt, omdat je anders geen beeld hebt, hoe goed je de driver ook aanstuurd
Dat zijn de MOSFet voor de voeding van het display op Arduino pen-7, welke trouwens niet naar buiten is gevoerd.
En ook de AW9364DNR moet worden aangestuurd op pin-17, ik denk dat deze bedoeld is om met PWM aan testuren en deze bepaald de helderheid van de achtergrond verlichting.
Ik heb beide aansluitingen in de code gezet en wat denken jullie... er is nu beeld met de standaard Adrfruit gafische test code.
Dit stukje maakt het display werkend.
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
//Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
Adafruit_ST7789 tft = Adafruit_ST7789(39, 47, 48, 38, 40);
float p = 3.1415926;
void setup(void) {
Serial.begin(9600);
Serial.print(F("Hello! ST77xx TFT Test"));
// OR use this initializer (uncomment) if using a 1.9" 170x320 TFT:
tft.init(170, 320); // Init ST7789 170x320
pinMode(7, OUTPUT);
digitalWrite(7, LOW);
pinMode(17, OUTPUT);
digitalWrite(17, HIGH);
Nu kan ik verder frutten om te zien om wat data dat ik op het scherm wil weergeven ook past en netjes is.
Slechte foto, maar er is te zien dat het display nu werkt, met mijn telefoon is het moeilijk een goede foto te maken van dit display.
.
Dank weer voor het meedenken en groet,
Bram
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Ik krijg de indruk dat het display niet echt snel is, en heb wat geprobeerd te spelen met de snelheid voor de SPI clock frequentie.
Dit lijkt allemaal weinig uit te maken...
Heeft iemand van jullie het goede commando om de SPI Snelheid voor een ESP32 te maximaliseren?
Dit stukje in de Adafruit code werkt niet, verschillende waarden geprobeert natuurlijk. 
tft.setSPISpeed(9000000);
Groet,
Bram
KGE
Golden Member
Misschien is hier iets te vinden:
https://community.platformio.org/t/esp32-spi-clock-frequency-arduino-f…
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi KGE, 
Daar was ik net aan het lezen en ik wou wat proberen in de Arduino IDE 2.3.3.
Maar die laat dit nu niet toe, omdat hij steeds vast slaat op het bijwerken van de Teensy modellen, GFerfERtawERwe! 
Even die regel uit de settings halen voor Teensy en dan weer verder testen.
Dank en groet,
Bram
KGE
Golden Member
Op maandag 11 november 2024 11:49:19 schreef blackdog:
Hi KGE,Daar was ik net aan het lezen en ik wou wat proberen in de Arduino IDE 2.3.3.
Maar die laat dit nu niet toe, omdat hij steeds vast slaat op het bijwerken van de Teensy modellen, GFerfERtawERwe!
Even die regel uit de settings halen voor Teensy en dan weer verder testen.
Dank en groet,
Bram
Over Teensy gesproken, met een Teensy 4.0 heb ik aan een SPI TFT LCD 480x320 met 24 bit kleurdiepte snelheden tot 120 MHz in kunnen stellen.
De ESP32 is niet zo flexibel helaas maar ik zag 40 en 80 MHz dus daar moet wel meer uit te halen zijn.
Ik heb hier wel gespeeld met een ILI9341 TFT schermpje. Ook op SPI.
Die controller heeft een officiële max frequentie van 10 MHz, maar in de praktijk blijkt het ook op hogere frequenties wel te werken. 20MHz gaat zeker nog goed, daarboven krijg je soms problemen.
En het maakt wel uit welke data je stuurt. Een pixel is 16 bit kleur (5 + 6 + 5 bits). Maar om te bepalen welk pixel wordt aangestuurd moet je eerst een adres bereik selecteren. Daarmee kies je een rechthoek op het scherm dat je vervolgens met pixels kunt vullen. Voor het zetten van zo een rechthoek heb je 2 commando's nodig, samen 10 bytes. Plus 2 bytes voor elke pixel.
Dat werkt goed als je rechthoeken wilt vullen, zoals bijv een tekst veldje. Maar geeft veel overhead voor random pixels zoals bijv in schuine lijnen. Dat kost dan 12 bytes per pixel.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Vanmiddag een beetje lopen frutten met de Heltec Microcontroler met het display er op.
Het doel was om te zien wat er onder meer op past met bepaalde font groottes contrast en het weer ophalen/ervaring van de Adafruit GFX Library.
Hieronder een foto, die beter kan, maar deze geeft wel aan dat het formateren van de items weer een beetje aan het lukken is.
Ik heb ook hier een library gebruikt om lokaal verbinding te maken met de WiFi en dan via NTP de tijd op te halen.
De correcte tijd wordt dan geprogrammeerd in een DS3231 printje.
De ESP32 heeft zelf ook een 32K kristal, maar ik kon zo snel geen werkende code vinden.
Met het nu gebruikte printje dat ik vorige week zo precies mogelijk heb getuned op 32KHZ met wat software weet ik in ieder geval dat het goed is en blijft.
De software synct de DS3231, maar natuurlijk alleen als er een WiFi verbinding is.
Geen verbinding dan is er geen sync mogelijk en dan komt de tijd uit de gekalibreerde DS3231.
Dit is gewoon een stukje code dat ik later meer wil gaan gebruiken en hier is het nu toegepast om in het rood de tijd weer te geven.
Natuurlijk weer die vervelende shifting van de getallen van de klok weergave, hiervoor moet ik de code die ik als eens van jullie heb gekregen nog implementeren.

.
Dus dit plaatje is om even te laten zien dat ik de hulp waardeer. 
Groet,
Bram
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Ik ben bezig uit te zoeken hoe ik de tijd netjes op het beeldscherm geformatteerd krijg.
Dat hangt af ondermeer van de #include <DS3231.h> file.
Welke van de 4 stuks die ik in de library directory heb staan, gebruikt de Arduino IDE 2.3.3 nu eigenlijk?
Ik heb in de settings zitten zoeken van de IDE, maar ik kan niets vinden als er gecompileerd gaat worden en welke van de vier er dan gebruikt wordt.
Weten jullie hoe ik dit in beeld kan krijgen?
Dank en groet,
Bram
KGE
Golden Member
Op maandag 11 november 2024 18:55:42 schreef blackdog:
Hi,Ik ben bezig uit te zoeken hoe ik de tijd netjes op het beeldscherm geformatteerd krijg.
Dat hangt af ondermeer van de #include <DS3231.h> file.
Welke van de 4 stuks die ik in de library directory heb staan, gebruikt de Arduino IDE 2.3.3 nu eigenlijk?
Ik heb in de settings zitten zoeken van de IDE, maar ik kan niets vinden als er gecompileerd gaat worden en welke van de vier er dan gebruikt wordt.Weten jullie hoe ik dit in beeld kan krijgen?
Dank en groet,
Bram
Bij de libraries zitten vaak voorbeelden waar je kan zien hoe je dingen kunt doen. In de DS3231 library zit een voorbeeldje 'echo_time' waarin de tijd uitgelezen wordt en met Serialprint weergegeven wordt.
Je ziet daarin al hoe alle losse delen van de tijd (uren, minuten etc.) uitgevoerd worden. Je kunt dit wel omzetten naar print commando's voor jouw LCD.
Wat ook kan is met sprintf (= print to string with formatting) die tijdstukjes netjes aan elkaar rijgen tot één nieuwe string die je dan naar het LCD stuurt.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Ik heb een poginge gedaan om het "sprintf" commando te gebruiken, dat werkt nu niet.
Ik zal zeker het verkeerd toepassen, kunnen jullie mij even schoppen.
Het staat onder aan de loop, ik breng 2x de tijd in beeld de eerste keer met deze opbouw: tft.print(Clock.getHour(h12, PM), DEC); enz en dat werkt.
En de tweede keer probeer ik het met het "sprintf" commando, dat geeft dan dit in beeld 10:10:10 Que!
De code
/**************************************************************************
// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
**************************************************************************/
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
//---------
#include <TimeLib.h>
#include <NTPtimeESP.h>
#include <WiFiClient.h>
#include <DS3231.h>
#include <Wire.h>
//---------
//--------- Time config
DS3231 Clock;
DS3231 myRTC;
bool century = false;
bool h12Flag;
bool pmFlag;
const char* ssid = "BlagBlahBlah"; //SSID of your Wifi network: Change this
const char* password = "BlagBlahBlah"; //Wi-Fi Password: Change this
//**** NTP Server to use
const char* NTP_Server = "BlagBlahBlah"; // local Time Server
//**** Your time zone UTC related (floating point number)
#define TIME_ZONE 1.0f
NTPtime NTPch(NTP_Server);
strDateTime dateTime;
//****************************************************
//* SYNCRONIZE SYSTEM TIME with NTP SERVERS
//****************************************************
#define SEND_INTV 1
#define RECV_TIMEOUT 1
// --------------------------------------
// epochUnixNTP set the UNIX time
// number of seconds sice Jan 1 1970
// --------------------------------------
time_t epochUnixNTP()
{
Serial.println(">>>> TimeSync function called <<<<");
//**** BIG ISSUE: in case of poor connection, we risk to remain in this loop forever
NTPch.setSendInterval(SEND_INTV);
NTPch.setRecvTimeout(RECV_TIMEOUT);
do
{
dateTime = NTPch.getNTPtime(TIME_ZONE, 1);
delay(1);
}
while(!dateTime.valid);
Clock.setSecond(dateTime.second);
Clock.setMinute(dateTime.minute);
Clock.setClockMode(false); // set to 24h
//setClockMode(true); // set to 12h
Clock.setHour(dateTime.hour);
Clock.setYear(dateTime.year-2000);
Clock.setMonth(dateTime.month);
Clock.setDate(dateTime.day);
Clock.setDoW(dateTime.dayofWeek);
Serial.println(">>>> DS3231 sync'ed with NTP time <<<<");
Serial.print("NTP time : ");
NTPch.printDateTime(dateTime);
//set system time
setTime(dateTime.hour,dateTime.minute,dateTime.second,dateTime.day,dateTime.month,dateTime.year);
return 0;
}
//***********************************************************************
//* SSIDCONNECT
//***********************************************************************
void ssidConnect()
{
Serial.println(ssid);
Serial.println(password);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(700);
Serial.print(".");
}
Serial.println();
Serial.print(F("Connected to "));
Serial.println(ssid);
Serial.print(F("IP address: "));
Serial.println(WiFi.localIP());
}
//--------- End Time config
//Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
Adafruit_ST7789 tft = Adafruit_ST7789(39, 47, 48, 38, 40); // Heltec T190 gebruikt een ST7789 driver IC met deze SPI aansluitingen
int myDT = 0;
void setup(void) {
// ---------------------------------------------------------------------------------
bool i2c_found;
Serial.begin(115200); while (!Serial);
Serial.println("COM setup successful.");
delay(10);
WiFi.mode(WIFI_STA);
// connect to WiFi network
ssidConnect();
// Start the I2C interface
Wire.begin();
// Set time sync provider
setSyncProvider(epochUnixNTP); //set function to call when sync required
setSyncInterval(5); //every 60 seconds
//In the same moment you retrieve the time from the library, that function will look up whether it is time to sync the time.
//If you don't retrieve the time or if you do, but the syninterval has not yet passed, nothing will happen.
// display the time
Serial.print("DS3231 time: ");
PrintDS3231Time();
}
//***********************************************************************
//* Print DS3231 time
//***********************************************************************
bool Century=false;
bool h12;
bool PM;
void PrintDS3231Time(){
Serial.print((Clock.getYear()+2000), DEC);
Serial.print('-');
// then the month
Serial.print(Clock.getMonth(Century), DEC);
Serial.print('-');
// then the date
Serial.print(Clock.getDate(), DEC);
Serial.print('-');
// and the day of the week
Serial.print(Clock.getDoW(), DEC);
Serial.print(' ');
// Finally the hour, minute, and second
Serial.print(Clock.getHour(h12, PM), DEC);
Serial.print("H ");
Serial.print(Clock.getMinute(), DEC);
Serial.print("M ");
Serial.print(Clock.getSecond(), DEC);
Serial.print("S ");
// Add AM/PM indicator
if (h12) {
if (PM) {
Serial.print(" PM ");
} else {
Serial.print(" AM ");
}
} else {
Serial.print(" (24h) ");
}
// Display the temperature
Serial.print("T=");
Serial.print(Clock.getTemperature(), 2);
// Tell whether the time is (likely to be) valid
if (Clock.oscillatorCheck()) {
Serial.print(" O+");
} else {
Serial.print(" O-");
}
Serial.print('\n');
Serial.print('\n');
// ---------------------------------------------------------------------------------
// OR use this initializer (uncomment) if using a 1.9" 170x320 TFT:
tft.init(170, 320); // Init ST7789 170x320 voor Heltec T190 display
tft.setSPISpeed(300000000); // set SPI clock display
tft.setRotation(1); // Draait het display voor horizontaal gebruik
pinMode(7, OUTPUT); // Set de voeding voor het TFT display aan
digitalWrite(7, LOW);
pinMode(17, OUTPUT); // Maakt de PWM ingang voor de achtergrond verlichting "1"
digitalWrite(17, HIGH);
tft.fillScreen(0x0000); //tft.fillScreen(ST77XX_BLACK);
tft.drawRect(0, 0, 320, 170, 0x07E0); // Groen kader om display
tft.drawRect(6, 25, 305, 2, 0x07FF);
tft.drawRect(12, 35, 290, 2, 0xFFE0);
tft.drawRect(18, 45, 275, 2, 0xF800);
tft.setCursor(25, 70);
tft.setTextSize(3);
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
tft.print("Circuits-Online");
// Geel kader om Circuits-Online
tft.drawRect(0, 0, 320, 170, 0x07E0);
tft.setCursor(25, 145);
tft.setTextSize(2);
tft.setTextColor(ST77XX_GREEN, ST77XX_BLUE);
tft.print(" Mijn dank is GROOT! ");
}
void loop() {
tft.setCursor(110, 115);
tft.setTextSize(2);
tft.setTextColor(ST77XX_RED, ST77XX_BLACK);
// delay(1);
// tft.print(myRTC.getHour(h12Flag, pmFlag), DEC); //24-hr
// tft.print(":");
// tft.print(myRTC.getMinute(), DEC);
// tft.print(":");
// tft.println(myRTC.getSecond(), DEC);
// Klok onderzijde zonder formatering
tft.print(Clock.getHour(h12, PM), DEC);
tft.print("-H ");
tft.print(Clock.getMinute(), DEC);
tft.print("-M ");
tft.print(Clock.getSecond(), DEC);
tft.print("-S ");
tft.drawRect(19, 65, 280, 34, 0xFFE0);
// Klok poging met formattering
tft.setTextSize(2);
tft.setCursor(5, 5);
// buffer voor tijdaanduiding
char tbuffer[30];
// set uren, minuten, seconden en dubbele punten in buffer
snprintf(tbuffer,30,"%02i:%02i:%02i",(Clock.getHour(h12, PM), DEC),(Clock.getMinute(), DEC),(Clock.getSecond(), DEC));
tft.print(tbuffer);
}
// -------------------------------------------------
Dus... hoe set ik de variabelen goed in de snprintf buffer?
Dank en groet,
Bram
Je print nu de waarde van DEC (= 10), en niet de tijd van de klok.
Probeer die laatste regel eens zo:
// set uren, minuten, seconden en dubbele punten in buffer
snprintf(tbuffer,30,"%02i:%02i:%02i", Clock.getHour(h12, PM),
Clock.getMinute(),
Clock.getSecond() );
tft.print(tbuffer);
PS, de ", DEC" zijn parameters van de oorspronkelijke Serial.print funktie. Die zijn hier niet van toepassing.
KGE
Golden Member
Ja dat is het vage aan Arduino.. de Strings...
Met een tussen 'string' variabele moet het wel lukken:
String tijd;
char tbuffer[30];
.... code die een char array buffer vult
tijd=String(tbuffer);
tft.print(tijd);
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Even de code zo aangepast zoals deKees het aangaf, en dit is het resultaat, links bovenaan het resultaat. 

.
Dank en groet,
Bram
@KGE : Dat heeft niks te maken met vage strings in Arduino, maar alles met eigenschappen van de compiler.
Met deze code als parameter :
(Clock.getHour(h12, PM), DEC)Dat zijn feitelijk 2 aparte parameters "Clock.getHour(h12, PM)" en "DEC" die door de haakjes en de comma tot een enkele parameter worden samengebonden. De laatste wordt dan de waarde van het geheel. Dus in dit geval DEC (=10).
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Ik ben wezen testen met een modernere telefoon, ook in de Pro modus maar geen mooier plaatje...
Toen mijn vriendin aar mooie camera en lens laten pakkken denk samen de prijs van ongeveer mijn Keithley 7510. 
En wat denken jullie, beter maar niet goed, zie het plaatje hieronder.
Het geeft wat beter de kleuren weer maar uit de hand is het niet scherp te krijgen, bij de huidige ligt condities is een statief nodig.
De onderste regel is nog steeds niet kleur correct, het rood gaat nu wel, maar in het echt spettert het van het schempje af.

.
Voor jullie info, deze T190 is nu voor iets minder dan 18 Euro te koop.
Er is ook een model met het zelfde TFT display maar geen LoRa voor iets van 12 Euro.
En dan nu het volgende onderdeel van deze Microcontroller proberen aan het werk te krijgen!
Groet,
Bram
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi,
Aangezien dit toch al een verzamel topic is voor mijn programmeer onkunde *grin* het ik nog een vraag over millis.
Ik weet al lang dat er een limit is van iets meer dan 49 dagen.
Voor mij is die limmit van belang omdat de microcontroler een spannings referentie aanstuurd en deze maanden lang aan kan staan.
Nu dacht ik er aan omdat ik toch een DS3232 in het systeem heb( en NTP via WiFi) om b.v. het dagnummer te gebruiken om de microcontroler te resetten.
De meeste moderne microcontrolers starten snel op en dit zal verder geen noemenswaardige verandering geven in de oven temperatuur,
dit i.v.m. de thermische massa.
Ik zou b.v. op dag 1, 7, 14, 21 en 28 van de maand en dan om 00:00 een reset kunnen geven, b.v. zo in de code: resetFunc();
Als ik de reset buiten de microcontroler wil houden, dan kan ik ook de alarm uitgang van de DS3232 gebruiken hiervoor.
Dat met opset restarten voor de betrouwbaarheid doe ik ook regelmatig bij LTE Routers op iedere zondag van de week om ze "fris" te houden.
Als ik deze reset functie toepas, dan weet ik ook zeker dat via NTP de DS3232 weer goed op tijd wordt gezet.
Wat is jullie mening hierin, meenemend wat ik hierboven aangeef waarom ik het onder meer wil.
Dank en groet,
Bram
KGE
Golden Member
Zolang je de millis in unsigned 32 bits variabelen (uint_32t) houdt is er niets aan de hand, hij gaat na ongeveer 49 dagen over de kop maar daar merk je dan niets van tenzij je die waarde als absolute tijd wil gebruiken. (maar daar heb je de DS3232 voor)
De ESP32 heeft zelf ook een 64 bits timer:
The ESP32 uses a micro counter, esp_timer_get_time(), that is a uint64_t and rolls over after 200+ years.
De waarde (in absolute microseconden) kun je opvragen met:
uint_64t var = esp_timer_get_time();
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi KGE en anderen, 
Ik wil het resetten op een paar manieren kunnen doen, dus de "Boot Reset" op een ESP32 en later ook andere microcontrolers, dit is voor mij een leerproces .
Hieronder mijn probeer code waarvan ik nu drie manieren werkend heb.
Een echte watchdog schakeling die de loop timed, een stukje code die kijkt naar de datum en de tijd en deze vergelijkt met een voor geprogrammeerde waarde en als laatste een drukknop, als je deze langer dan een bepaalde waarde ingedrukt houd dan reset de ESP32 ook.
Ik heb geprobeerd de code in stukjes te hangen en dan deze appart in de loop aan te roepen.
De loop zelf is nu nog mooi schoon, voor mij een unicum. 
Even laten zien wat ik vanmiddag werkend heb gekregen.
Nog steeds met veel Serial prints er in, maar dat gooi ik er later wel uit.
Het gaat om het stukje van de void loop.
Deze functies moeten nog "getimed" worden, dat komt later, nu nog bezig met de alarm fucties uit te vogelen.
Print_tijd();
Print_bme();
Time_Reboot();
Wachthond();
.
/**************************************************************************
// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
**************************************************************************/
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#include "esp_system.h"
#include "rom/ets_sys.h"
#include <TimeLib.h>
#include <NTPtimeESP.h>
#include <WiFiClient.h>
#include <DS3231.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C configuratie voor deze sensor
unsigned long delayTime;
// Nodig voor Watchdog
const int button = 21; // gpio pin to use to trigger delay via "User Button T190" voor het testen van de Watchdog
const int wdtTimeout = 1000; // time in ms to trigger the watchdog
hw_timer_t *timer = NULL;
void ARDUINO_ISR_ATTR resetModule() {
ets_printf("reboot\n");
esp_restart();
}
// Einde Watchdog settings
// Tijd eenheden variabele, wordt gebruikt voor klok gestuurde herstart microcontroler
int rd = 0; // Variabel voor dag waarde
int rh = 0; // Variabele voor de uur waarde
int rm = 0; // Variabele voor de minuut waarde
int rs = 0; // Variabele voor de seconden waarde
//---------
//---------
DS3231 Clock;
DS3231 myRTC;
bool century = false;
bool h12Flag;
bool pmFlag;
const char* ssid = "Hatseflast-Blah34"; //SSID of your Wifi network: Change this
const char* password = "huppleldepupskie"; //Wi-Fi Password: Change this
//**** NTP Server to use
const char* NTP_Server = "o.o.o.o"; // local Time Server
//**** Your time zone UTC related (floating point number)
#define TIME_ZONE 1.0f
NTPtime NTPch(NTP_Server);
strDateTime dateTime;
//****************************************************
//* SYNCRONIZE SYSTEM TIME with NTP SERVERS
//****************************************************
#define SEND_INTV 1
#define RECV_TIMEOUT 1
// --------------------------------------
// epochUnixNTP set the UNIX time
// number of seconds sice Jan 1 1970
// --------------------------------------
time_t epochUnixNTP()
{
Serial.println(">>>> TimeSync function called <<<<");
//**** BIG ISSUE: in case of poor connection, we risk to remain in this loop forever
NTPch.setSendInterval(SEND_INTV);
NTPch.setRecvTimeout(RECV_TIMEOUT);
do
{
dateTime = NTPch.getNTPtime(TIME_ZONE, 1);
delay(1);
}
while(!dateTime.valid);
Clock.setSecond(dateTime.second);
Clock.setMinute(dateTime.minute);
Clock.setClockMode(false); // set to 24h
//setClockMode(true); // set to 12h
Clock.setHour(dateTime.hour);
Clock.setYear(dateTime.year-2000);
Clock.setMonth(dateTime.month);
Clock.setDate(dateTime.day);
Clock.setDoW(dateTime.dayofWeek);
Serial.println(">>>> DS3231 sync'ed with NTP time <<<<");
Serial.print("NTP time : ");
NTPch.printDateTime(dateTime);
//set system time
setTime(dateTime.hour,dateTime.minute,dateTime.second,dateTime.day,dateTime.month,dateTime.year);
return 0;
}
//***********************************************************************
//* SSIDCONNECT
//***********************************************************************
void ssidConnect()
{
Serial.println(ssid);
Serial.println(password);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(700);
Serial.print(".");
}
Serial.println();
Serial.print(F("Connected to "));
Serial.println(ssid);
Serial.print(F("IP address: "));
Serial.println(WiFi.localIP());
}
//--------- End Time config
//Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
Adafruit_ST7789 tft = Adafruit_ST7789(39, 47, 48, 38, 40); // Heltec T190 gebruikt een ST7789 driver IC met deze SPI aansluitingen
int myDT = 0;
void setup(void) {
bool i2c_found;
Serial.begin(115200); while (!Serial);
Serial.println("COM setup successful.");
delay(10);
WiFi.mode(WIFI_STA);
// connect to WiFi network
ssidConnect();
// Start the I2C interface
Wire.begin();
// Set time sync provider
setSyncProvider(epochUnixNTP); //set function to call when sync required
setSyncInterval(5); //every 60 seconds
//In the same moment you retrieve the time from the library, that function will look up whether it is time to sync the time.
//If you don't retrieve the time or if you do, but the syninterval has not yet passed, nothing will happen.
// display the time
Serial.print("DS3231 time: ");
PrintDS3231Time();
}
//***********************************************************************
//* Print DS3231 time
//***********************************************************************
bool Century=false;
bool h12;
bool PM;
void PrintDS3231Time(){
Serial.print((Clock.getYear()+2000), DEC);
Serial.print('-');
// then the month
Serial.print(Clock.getMonth(Century), DEC);
Serial.print('-');
// then the date
Serial.print(Clock.getDate(), DEC);
Serial.print('-');
// and the day of the week
Serial.print(Clock.getDoW(), DEC);
Serial.print(' ');
// Finally the hour, minute, and second
Serial.print(Clock.getHour(h12, PM), DEC);
Serial.print("H ");
Serial.print(Clock.getMinute(), DEC);
Serial.print("M ");
Serial.print(Clock.getSecond(), DEC);
Serial.print("S ");
// Add AM/PM indicator
if (h12) {
if (PM) {
Serial.print(" PM ");
} else {
Serial.print(" AM ");
}
} else {
Serial.print(" (24h) ");
}
// Display the temperature
Serial.print("T=");
Serial.print(Clock.getTemperature(), 2);
// Tell whether the time is (likely to be) valid
if (Clock.oscillatorCheck()) {
Serial.print(" O+");
} else {
Serial.print(" O-");
}
Serial.print('\n');
Serial.print('\n');
// ---------------------------------------------------------------------------------
// Initializer using a 1.9" 170x320 TFT:
tft.init(170, 320); // Init ST7789 170x320 voor Heltec T190 display
tft.setSPISpeed(300000000); // set SPI clock display
tft.setRotation(1); // Draait het display voor horizontaal gebruik
pinMode(7, OUTPUT); // Set de voeding voor het TFT display aan
digitalWrite(7, LOW);
pinMode(17, OUTPUT); // Maakt de PWM ingang voor de achtergrond verlichting "1"
digitalWrite(17, HIGH);
tft.fillScreen(0x0000); //Maak de achtergrond zwart
tft.drawRect(0, 0, 320, 170, 0x07E0); // Groen kader op het display
tft.drawRect(6, 25, 305, 2, 0x07FF); //plaatst smal kader op het display
tft.drawRect(12, 35, 290, 2, 0xFFE0); //plaatst smal kader op het display
tft.drawRect(18, 45, 275, 2, 0xF800); //plaatst smal kader op het display
tft.setCursor(25, 70);
tft.setTextSize(3);
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
tft.print("Circuits-Online");
// weather monitoring
unsigned status;
// default settings
status = bme.begin(0x76);
// BME280 Sensor configuratie
bme.setSampling(Adafruit_BME280::MODE_NORMAL,
Adafruit_BME280::SAMPLING_X16, // temperature
Adafruit_BME280::SAMPLING_X16, // pressure
Adafruit_BME280::SAMPLING_X16, // humidity
Adafruit_BME280::FILTER_X16,
Adafruit_BME280::STANDBY_MS_250 );
// Nodig voor Watchdog
pinMode(button, INPUT_PULLUP); //init control pin
timer = timerBegin(1000000); //timer 1Mhz resolution
timerAttachInterrupt(timer, &resetModule); //attach callback
timerAlarm(timer, wdtTimeout * 1000, false, 0); //set time in us
// Einde Watchdog settings
}
// ---------------------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------
void loop() {
Print_tijd();
Print_bme();
Time_Reboot();
Wachthond();
}
// --------------------------------------------------------------------------------
// Dit is de functie voor het resetten van de microcontroler na Wachthont gebeurtenis
// --------------------------------------------------------------------------------
void Wachthond() {
timerWrite(timer, 0); //reset timer (feed watchdog)
long loopTime = millis();
//while button is pressed, delay up to 3 seconds to trigger the timer
while (!digitalRead(button)) {
Serial.println("button pressed"); // <== Kan later weg
delay(500); // <== Kan later weg
}
loopTime = millis() - loopTime;
// Einde Watchdog settings
}
// --------------------------------------------------------------------------------
// Dit is de functie voor het resetten van de microcontroler na een bepaalde tijd gestuurd vanuit de DS3232
// --------------------------------------------------------------------------------
void Time_Reboot() {
rd = myRTC.getDate();
rh = myRTC.getHour(h12Flag, pmFlag);
rm = myRTC.getMinute();
rs = myRTC.getSecond();
if( (rd == 12) && (rh == 18) && (rm == 12) && (rs == 0) ) { // <== op deze tijd reboot de micro: op dag-12 van de maand om 18:12:00
esp_restart(); // Reboot commando
}
// debug regels time, kan later weg
Serial.println(rd);
Serial.println(rh);
Serial.println(rm);
Serial.println(rs);
Serial.println();
}
// --------------------------------------------------------------------------------
// Dit is de functie voor het weergeven van de tijd op het display
// --------------------------------------------------------------------------------
void Print_tijd() {
// Plaatst realtime klok met formattering op het display
tft.setTextColor(ST77XX_YELLOW, ST77XX_BLACK);
tft.setTextSize(2);
tft.setCursor(218, 149);
// Buffer voor klok weergave met formattering voorloop nul
char tbuffer[30];
// Set de klok gegevens in de snprintf buffer
snprintf(tbuffer,30,"%02i:%02i:%02i",(Clock.getHour(h12, PM)),(Clock.getMinute()),(Clock.getSecond()));
// Plaatst de inhoud van de buffer op het display
tft.print(tbuffer);
}
// --------------------------------------------------------------------------------
// Dit is de functie voor de BM280 sensor, voor temperatuur en lucht vochtigheid
// --------------------------------------------------------------------------------
void Print_bme() {
tft.setTextSize(2);
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
tft.setCursor(68, 149);
tft.print((char)247); // plaatst het Celcius rondje voor de C
tft.setCursor(79, 149);
tft.print("C");
tft.setCursor(7, 149);
tft.print(bme.readTemperature());
tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
tft.setCursor(145, 149);
tft.print("%Hum");
tft.setCursor(117, 149);
tft.print(bme.readHumidity(),0);
}
Nog een doel is dus of ik uit de DS3232 ook een alarm functie kan pulleken die b.v. 1x per maand de reset-pin van de T190 kan frutten.
Daar is jammer genoeg bij deze T190 geen echte aansluitpen voor aanwezig, maar aan de onderzijde is het reset toetsje gemonteerd met open en bloot de solderingen hiervan, no problemo dus.
Alarm DS3232
Ik heb al in wat voorbeeld code gekeken van de door mij gebruikte library voor de DS3232 van Andrew Wickert, maar ik denk dat ik daarvoor een stukje frisser moet zijn dan nu op dit moment. *grin*
Ik dacht dat library's er voor zouden zorgen dat de code makkelijk toepasbaar zou worden.
Van de voorbeeld code betreffende een van de alrm functies ga ik eerst alle debug codes die ik verder niet nodig heb verwijderen, ik raak daar echt de weg van kwijt.
Mag ik jullie naar de DS3232 code laten kijken en mij proberen duidelijk te maken waat ik in de naam van de Heer b.v. dag 20 van de maand om 00:01:01 een alarm kan invullen in de onderstaande code?
/*
DS3231_test.pde
Eric Ayars
4/11
Test/demo of read routines for a DS3231 RTC.
Turn on the serial monitor after loading this to check if things are
working as they should.
*/
#include <DS3231.h>
#include <Wire.h>
DS3231 myRTC;
bool century = false;
bool h12Flag;
bool pmFlag;
byte alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits;
bool alarmDy, alarmH12Flag, alarmPmFlag;
void setup() {
// Start the I2C interface
Wire.begin();
// Start the serial interface
Serial.begin(57600);
}
void loop() {
// send what's going on to the serial monitor.
// Start with the year
Serial.print("2");
if (century) { // Won't need this for 89 years.
Serial.print("1");
} else {
Serial.print("0");
}
Serial.print(myRTC.getYear(), DEC);
Serial.print(' ');
// then the month
Serial.print(myRTC.getMonth(century), DEC);
Serial.print(" ");
// then the date
Serial.print(myRTC.getDate(), DEC);
Serial.print(" ");
// and the day of the week
Serial.print(myRTC.getDoW(), DEC);
Serial.print(" ");
// Finally the hour, minute, and second
Serial.print(myRTC.getHour(h12Flag, pmFlag), DEC);
Serial.print(" ");
Serial.print(myRTC.getMinute(), DEC);
Serial.print(" ");
Serial.print(myRTC.getSecond(), DEC);
// Add AM/PM indicator
if (h12Flag) {
if (pmFlag) {
Serial.print(" PM ");
} else {
Serial.print(" AM ");
}
} else {
Serial.print(" 24h ");
}
// Display the temperature
Serial.print("T=");
Serial.print(myRTC.getTemperature(), 2);
// Tell whether the time is (likely to be) valid
if (myRTC.oscillatorCheck()) {
Serial.print(" O+");
} else {
Serial.print(" O-");
}
// Indicate whether an alarm went off
if (myRTC.checkIfAlarm(1)) {
Serial.print(" A1!");
}
if (myRTC.checkIfAlarm(2)) {
Serial.print(" A2!");
}
// New line on display
Serial.println();
// Display Alarm 1 information
Serial.print("Alarm 1: ");
myRTC.getA1Time(alarmDay, alarmHour, alarmMinute, alarmSecond, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
Serial.print(alarmDay, DEC);
if (alarmDy) {
Serial.print(" DoW");
} else {
Serial.print(" Date");
}
Serial.print(' ');
Serial.print(alarmHour, DEC);
Serial.print(' ');
Serial.print(alarmMinute, DEC);
Serial.print(' ');
Serial.print(alarmSecond, DEC);
Serial.print(' ');
if (alarmH12Flag) {
if (alarmPmFlag) {
Serial.print("pm ");
} else {
Serial.print("am ");
}
}
if (myRTC.checkAlarmEnabled(1)) {
Serial.print("enabled");
}
Serial.println();
// Display Alarm 2 information
Serial.print("Alarm 2: ");
myRTC.getA2Time(alarmDay, alarmHour, alarmMinute, alarmBits, alarmDy, alarmH12Flag, alarmPmFlag);
Serial.print(alarmDay, DEC);
if (alarmDy) {
Serial.print(" DoW");
} else {
Serial.print(" Date");
}
Serial.print(" ");
Serial.print(alarmHour, DEC);
Serial.print(" ");
Serial.print(alarmMinute, DEC);
Serial.print(" ");
if (alarmH12Flag) {
if (alarmPmFlag) {
Serial.print("pm");
} else {
Serial.print("am");
}
}
if (myRTC.checkAlarmEnabled(2)) {
Serial.print("enabled");
}
// display alarm bits
Serial.println();
Serial.print("Alarm bits: ");
Serial.println(alarmBits, BIN);
Serial.println();
delay(1000);
}
.
Schiet mij maar lek, heel veel debug Serial.print, ik probeer daar omheen te lezen, maar ik kan geen regels vinden waar alarm-1 of alarm-2 met mijn tijd kan worden geladen.
Zover mijn kennis rijkt, kan alleen alarm-1 gebruikt worden, daar alarm-2 geen seconde functie heeft, dan blijft de uitgang van de DS3232 de ESP32 een minuut i nde reset stand houden en dat is niet fijn. 
Ik hoop dat de Software Goden mij weer de goede richting op kunnen duwen.
Dank weer en groet,
Bram
Die code gaat er vanuit dat er al een alarm ingesteld is. Daar is een speciale functie voor, Zie header file.
Instellen gaat zo:
byte A1Day = 20;
byte A1Hour = 0;
byte A1Minute = 1;
byte A1Second = 1;
byte AlarmBits = 0b0000; // Alarm when date, h, m, s match
bool A1Dy = false; // Assume DayOfMonth
bool A1h12 = false; // Using 24-hour clock
bool A1PM = false; //
myRTC.setA1Time(A1Day, A1Hour, A1Minute, A1Second,
AlarmBits, A1Dy, A1h12, A1PM);