Op woensdag 18 december 2024 14:33:31 schreef blurp:
[...]

En loop je het risico op een raceconditie waar de tijd verspringt tussen het printen en copieren, waardoor je de volgende update bagger krijgt.

Dan kun je beter met een tweede variabele werken, en de tijd opvragen voor je de oude tijd wist.

Wat ik sowieso doe.

In de loop

tijd = rtc.now();
if(tijd != oudeTijd){
  Print_Time(tijd, oudeTijd);
  oudeTijd = tijd;
}

void Print_Time(DateTime printTime, DateTime oldPrintTime) {

// Place Time values on the screen    
    tft.setFont(&FreeMonoOblique9pt7b);                   // Set specifieke font
    tft.setCursor(227, 208);                              // Positie waar de tijdwaarde op het scherm komt
    tft.setTextSize(1);                                   // Tekst grote is 1
    tft.setTextColor(ST77XX_BLACK, ST77XX_BLACK);         // Zet tekstkleur op achtergrond
    tft.print(oldPrintTime);                                   // Plaatst oude tijd in "zwart" over de aanwezigwe waarde heen
    tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);         // Zet de voorgrond kleur nieuwe tijd waarde
    tft.setCursor(227, 208);                              // Positie waar de nieuwe tijdwaarde op het scherm moet komen
    tft.print(printTime);                                   // Plaatst te tijd uit de string op het scherm
    tft.setFont();                                        // Reset naar de standaard GFX font
}

Zal niet fout gaan.

Hi deKees,

Het is niet echt opgelost, misschien zie ik iets over het hoofd, maar ondanks dat ik nogmaals de coordinaten voor de tekst opgeef, werkt dit niet voor de datum plaatsing op het scherm.

Ik laat hier even beide stukjes code zien, ik zie niet waar ik het fout doe..., jullie wel?


// Place Date values on the screen
  DateTime time = rtc.now();
  tft.setFont(&FreeMonoOblique9pt7b);
  tft.setCursor(57, 208);                                           // De positie voor de tekst met de zwarte voorgrond kleur
  tft.setTextSize(1);
  tft.setTextColor(ST77XX_BLACK, ST77XX_BLACK);                     // Zet tekstkleur op achtergrond
  tft.print(old_date);                                              // Plaatst oude tijd in "zwart" over de aanwezigwe waarde heen
  tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);
  old_date = tft.print(time.timestamp(DateTime::TIMESTAMP_DATE));   // Plaatst de Date_Timestamp in de "old_date" string "old_date"
  tft.setCursor(57, 208);                                           // Nogmaals de positie voor de tekst met de witte voorgrond kleur
  tft.setTextSize(1);
  tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK); 	            // Zet de tekst kleur nu al voorgrond "wit"
  tft.print(old_date);                                              // Plaatst te tijd uit de string op het scherm

tft.setCursor(3, 208);
tft.setTextSize(1);
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
tft.print("Date:");
tft.setCursor(173, 208);
tft.setTextColor(ST77XX_GREEN, ST77XX_BLACK);
tft.print("Time:");
tft.setFont();                                                       // Reset font
}


void Print_Time() {

// Place Time values on the screen
    DateTime time = rtc.now();  
    tft.setFont(&FreeMonoOblique9pt7b);                    // Set specifieke font
    tft.setCursor(227, 208);                               // Positie waar de tijdwaarde op het scherm komt
    tft.setTextSize(1);                                    // Tekst grote is 1
    tft.setTextColor(ST77XX_BLACK, ST77XX_BLACK);          // Zet tekstkleur op achtergrond
    tft.print(old_time);                                   // Plaatst oude tijd in "zwart" over de aanwezigwe waarde heen
    tft.setTextColor(ST77XX_WHITE, ST77XX_BLACK);          // Zet de voorgrond kleur nieuwe tijd waarde
    old_time = time.timestamp(DateTime::TIMESTAMP_TIME);   // Volt de "String" oldtime met de nieuwe klok tijd
    tft.setCursor(227, 208);                               // Positie waar de nieuwe tijdwaarde op het scherm moet komen
    tft.print(old_time);                                   // Plaatst te tijd uit de string op het scherm
    tft.setFont();                                         // Reset naar de standaard GFX font
}

Dan nog deze en ik denk dat dit goed genoeg gaat werken voor het rode streepje van de meter.
In de eerdere versie schreef ik een zwarte balk net binnen het groene kader van de Bargraph.
Nu wis ik de ruimte net voor en net na het rode streepje.
Als de variabel niet te snel varieerd is denk ik twee lijn diktes er voor en er achter dan voldoende is.

Code plaatsing rode streepje voor de meter SW1 is de variabel van de eerste rotary encoder en hieronder trek ik er 5 pixels af en tel er 5 bij op.
De waarde vijf heeft hier betrekking op de snelheid waarmee ik aan de encoder draai en dat er geen lijntjes achter blijven.
Door de thermische massa en het beschikbare vermogen voor verwarming denk ik dat één of twee pixels uiteindelij voldoende zullen zijn.


tft.fillRect((SW1 -5), 115, (SW1 +5), 20, ST77XX_BLACK);   // Zwarte wis "balk"
tft.drawFastVLine(SW1, 115, 20, ST77XX_RED);               // Rode vertikale lijn, welke een ingezoomd deel van de waarde van de oven sensor aangeeft

In het bovenste stukje gaat het mis, doordat je 3 keer schrijft naar het scherm.


  old_date = tft.print(time.timestamp(DateTime::TIMESTAMP_DATE));  

Moet zijn:


  old_date = time.timestamp(DateTime::TIMESTAMP_DATE);