[SOLVED] Issue with sprintf or timeLib?

Here's my code:

#include <TimeLib.h>

void setup() {
  setTime(16, 29, 40, 9, 9, 2018);
  Serial.begin(115200);
}

void loop() {
  Serial.printf("Time is %02d:%02d:%02d on %s %d %s\n", hour(), minute(), second(), dayStr(weekday()), day(), monthStr(month()));
  delay(1000);
}

Here's the output:

Time is 16:29:41 on September 9 September
Time is 16:29:42 on September 9 September
Time is 16:29:43 on September 9 September
Time is 16:29:44 on September 9 September
Time is 16:29:45 on September 9 September
Time is 16:29:46 on September 9 September
Time is 16:29:47 on September 9 September

I don't remember there being a day of the week called "September"...

What am I doing wrong?

Both dayStr() and monthStr() use a buffer to fetch the string from PROGMEM. The function returns the pointer to that buffer. And guess what, to save ram they use the same buffer :wink: Think you can figure out the rest :smiley:

Ah! Thanks for the quick response @septillion.

Updated code:

#include <TimeLib.h>

void setup() {
  setTime(16, 29, 40, 9, 9, 2018);
  Serial.begin(115200);
}

void loop() {
  Serial.printf("Time is %02d:%02d:%02d on %s ", hour(), minute(), second(), dayStr(weekday()));
  Serial.printf("%d %s\n", day(), monthStr(month()));
  delay(1000);
}

Output:

Time is 16:29:43 on Sunday 9 September
Time is 16:29:44 on Sunday 9 September
Time is 16:29:45 on Sunday 9 September
Time is 16:29:46 on Sunday 9 September
Time is 16:29:47 on Sunday 9 September
Time is 16:29:48 on Sunday 9 September
Time is 16:29:49 on Sunday 9 September
Time is 16:29:50 on Sunday 9 September
Time is 16:29:51 on Sunday 9 September

So Serial.printf() is a thing???
You can do that???
That's news to me.

Can you also printf() to a 16x2 character LCD?

Ah, yes, but it depends what type of "Arduino" you are using. I am using a Wemos Mini (esp8266-based board).

If I try to compile the above sketch for Nano, I get

exit status 1
'class HardwareSerial' has no member named 'printf'

@odometer. you can wrap any print object derived from Print class including LCD into StreamLib's CStringBuilder or BufferedPrint object. They have printf on any Arduino platform.

char buff[17];
CStringBuilder sb(buff, sizeof(buff));
sb.printf(F("%c %d%d%d%d %c M% 5dW"), (char) state, mainRelayOn, bypassRelayOn, balboaRelayOn, 
   valvesRelayOn,   valvesBackExecuted() ? 'B' : ' ', meterPower);
lcd.print(0, 0, buff);
sb.reset();
sb.printf(F("BAT%3d%%   % 5dW"), pvSOC, pvChargingPower);
lcd.print(0, 1, buff);