Random zero appears in display!

Apologies if I have upset you in any way, it was not my intention. I have stripped out all the SafeString() code and used sprint() code instead and I have managed to get it to work as before. However as before, when it reaches about 5 minutes and 27 seconds, it drops the padded zero, see photo at 6 minutes 2 seconds and 8 hundredths.


I know I have put in a colon between seconds and hundredths but the decimal point did not show up, I need to edit the smalldigits.h file to get that to work, which I will do. My new code is shown below and it would be much appreciated if you could have a look to see if there is any reason for the padded zero disappearing after 5 mins 27 secs.

EDIT: Decimal point sorted

/*        
 *         Adapted Sketch October 2021
*/

// include the library code:

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

#include "SmallDigits.h"

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4

#define DATA_PIN  11                // Pin for Arduino Nano 11
#define CS_PIN    3                 // Pin for Arduino Nano 3
#define CLK_PIN   13                // Pin for Arduino Nano 13


// Hardware SPI connection
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// Arbitrary output pins

// MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

int ledPin = 8;                     // LED connected to digital pin 8
int buttonPin = 2;                  // button on pin 2
int value = LOW;                    // previous value of the LED
int buttonState;                    // variable to store button state
int lastButtonState;                // variable to store last button state
int blinking;                       // condition for blinking - timer is timing
int frameRate = 100;                // the frame rate (frames per second) at which the stopwatch runs - Change to suit
uint32_t interval = (1000/frameRate);   // blink interval
uint32_t previousMillis = 0;            // variable to store last time LED was updated
uint32_t startTime;                     // start time for stop watch
uint32_t elapsedTime;                   // elapsed time for stop watch
int fractional;                     // variable used to store fractional part of Frames
int fractionalSecs;                 // variable used to store fractional part of Seconds
int fractionalMins;                 // variable used to store fractional part of Minutes
int elapsedFrames;                  // elapsed frames for stop watch
int elapsedSeconds;                 // elapsed seconds for stop watch
int elapsedMinutes;                 // elapsed Minutes for stop watch

char buff[10];                      // I take it this line is OK here?

void setup()
{
  Serial.begin(57600);
  P.begin();                        // intialise the LED Matrix.
  P.setIntensity(5);                // Set LED Matrix Brightness
  P.print("Start!");                // print opening message
  pinMode(ledPin, OUTPUT);          // sets the digital pin as output
  pinMode(buttonPin, INPUT);        // not really necessary, pins default to INPUT anyway
  digitalWrite(buttonPin, HIGH);    // turn on pullup resistors. Wire button so that press shorts pin to ground.
  digitalWrite(ledPin, HIGH);       // LED Check
  delay(1000);
  P.setFont(SmallDigits);
}

void loop(){
  digitalWrite(ledPin, LOW);              // Initiate LED and Step Pin States

  buttonState = digitalRead(buttonPin);   // Check for button press, read the button state and store

// check for a high to low transition if true then found a new button press while clock is not running - start the clock   
 
   if (buttonState == LOW && lastButtonState == HIGH  &&  blinking == false){
      startTime = millis();                             // store the start time
      blinking = true;                                  // turn on blinking while timing
      delay(10);                                        // short delay to debounce switch
      lastButtonState = buttonState;                    // store buttonState in lastButtonState, to compare next time 
   }

// check for a high to low transition if true then found a new button press while clock is running - stop the clock and report

   else if (buttonState == LOW && lastButtonState == HIGH && blinking == true){
   blinking = false;                                    // turn off blinking, all done timing
   lastButtonState = buttonState;                       // store buttonState in lastButtonState, to compare next time

// Routine to report elapsed time  
          
   elapsedTime =   millis() - startTime;                // store elapsed time
   elapsedMinutes = (elapsedTime / 60000L);             // divide by 60000 to convert to minutes - then cast to an int to print
   elapsedSeconds = (elapsedTime / 1000L);              // divide by 1000 to convert to seconds - then cast to an int to print
   elapsedFrames = (elapsedTime / interval);            // divide by 100 to convert to 1/100 of a second - then cast to an int to print
   fractional = (int)(elapsedFrames % frameRate);       // use modulo operator to get fractional part of 100 Seconds
   fractionalSecs = (int)(elapsedSeconds % 60L);        // use modulo operator to get fractional part of 60 Seconds
   fractionalMins = (int)(elapsedMinutes % 60L);        // use modulo operator to get fractional part of 60 Minutes

    sprintf(buff, "%2d:%02d:%02d", fractionalMins, fractionalSecs, fractional);
    P.print(buff);
  
   delay(10);

   }
 
 else{
      lastButtonState = buttonState;                  // store buttonState in lastButtonState, to compare next time
   }

// run commands at the specified time interval
// blink routine - blink the LED while timing
// check to see if it's time to blink the LED; that is, the difference
// between the current time and last time we blinked the LED is larger than
// the interval at which we want to blink the LED.

 if ( (millis() - previousMillis > interval) ) {

    if (blinking == true){
       previousMillis = millis();                      // remember the last time we blinked the LED

       digitalWrite(ledPin, HIGH);                     // Pulse the LED for Visual Feedback

         elapsedTime =   millis() - startTime;         // store elapsed time
         elapsedMinutes = (elapsedTime / 60000L);      // divide by 60000 to convert to minutes - then cast to an int to print
         elapsedSeconds = (elapsedTime / 1000L);       // divide by 1000 to convert to seconds - then cast to an int to print
         elapsedFrames = (elapsedTime / interval);     // divide by 40 to convert to 1/25 of a second - then cast to an int to print
         fractional = (int)(elapsedFrames % frameRate);// use modulo operator to get fractional part of 25 Frames
         fractionalSecs = (int)(elapsedSeconds % 60L); // use modulo operator to get fractional part of 60 Seconds
         fractionalMins = (int)(elapsedMinutes % 60L); // use modulo operator to get fractional part of 60 Minutes

         sprintf(buff, "%2d:%02d:%02d", fractionalMins, fractionalSecs, fractional);
         P.print(buff);
         delay(10);
    }

    else{
          digitalWrite(ledPin, LOW);                   // turn off LED when not blinking 
          }      
 }

}


I really appreciate you taking the time to reply in the first place and I again apologise for upsetting you.

Best regards

Steve