It is convenient and tidy but keep in mind this method is (a lot) slower than using a bunch of Serial.print commands, as I found out recently when I tried to clean up my new VU meter project code.
Yeah arrays in general are always quite slow. You have to create 40 bytes on the stack now, then sprintf the new string characters into each slot. If you deconstruct everything into machine instructions it comes out as a lot more processor cycles. Streaming bits onto the serial isn't that computationally heavy.
This is so much clearer than the online Arduino reference that is obviously written by well seasoned programmers and assume that you have solid grasp of the C language.
Everything said in this video is correct. However, a couple of things to bear in mind: sprintf is a LOT slower than Serial.print. Also, sprintf uses a lot of memory. On things like an Arduino Uno, Nano, or ATTINY85 you may struggle. What I do, to keep my code tidy, is write a function to display the things I want to display using Serial.print. You don't save on lines of code, but you can move those pesky Serial.print lines - which tend to clutter up the code - into their own functions. Which is much neater. It's also easier to remove them when you don't need them any more. So, using the burritos example from the video: void displayBurritosInfo(int numberOfBurritos, float temperature) { Serial.print("The temperature of the "); Serial.print(numberOfBurritos); Serial.print(" is "); Serial.println(temperature); }
Also note that using sprintf is *very strongly* discouraged on non-embedded platforms, because of the risk of overflowing the buffer. The examples in the video could trivially be weaponized if the user had control on the `tempStr` variable
Thanks for adding this Matt! I'll definitely check it out - I do wish the native Serial library just "made it easy" with out having to use the String class. If I could just do... Serial.print("I would like " + numTacos + " please"); Would that be great or what!
Brilliant! Great info. I have been struggling with why it wouldn't print %.2f for a large majority of the day and now I know :D, thanks. You mention you have another vid explaining 'dtostrf' but I can't seem to find it. Can you point me in the right direction please? Thanks for your time and effort with your videos, they're super clear!
congratulations for the class, very explanatory. I'm doing a project using a panel of leds-dot matrix to print texts read by the SD card. How can I include the temperature value read by a sensor (DB1820), in the text sent by reading the SD card? thank you if you can clarify this doubt for me
This is potentially creating a buffer overrun. As it depends on how long the inserted numbers/strings are. When inserting strings you can never make the buffer big enough since you don't know the length of the dynamic strings at compile time. Meaning you would need to allocate the buffer on the heap wasting already limited heap memory on an arduino. Also this whole thing is just unnecessary. There is nothing wrong with multiple Serial print statements. In fact it's more efficient. There are cases where sprintf makes sense to use. But this isn't one.
Is it possible to use this to send multiple variable data to another arduino? If so how would you separate it on that side and plug the data into the correct variable on the recieving arduino?
Isn’t it easier just to do it all in one line with Serial.println(String(variable1 + variable2 + ...)). No messing around with a buffer or worrying about if you got the right character specifier to suit your variable.
Yes, it is way easier using the built in String class... www.arduino.cc/reference/en/language/variables/data-types/stringobject/ There is a fun "controversy" to read up about on whether to use/avoid the String class with Arduino... forum.arduino.cc/t/optimizing-memory-without-strings/341158 I guess I landed on the not side of this but probably not for the right reasons though... A mentor programmer of mine told me to avoid them, so I just took his word for it! I should probably do some more of my own research :)
This will however be slow as heck as it allocates the string buffer multiple times with the potential to fail at runtime, not good for embedded projects where you need speed and reliability. Much better with a static or stack allocated buffer.
Thank you, sprintf looks very useful. Would there be any benefit of using sprintf over the following single line command to print a simple string of text with a variable (i)? For example: Serial.println((String)"Relay"+(i+1)+" OFF"); Where the variable i is a numerical value starting at 0.
I know that comment is old but Ill go ahead and reply. Using the string class is never a good idea, in short it has issues due to dynamic memory on memory constrained systems like arduino unos etc. Go ahead and search for "Why not to use string in arduino". Many good videos.
This video would have come in real handy just the other day, but better late than never... Would have been nice if you covered the use of the \ as in \"%s\".
This seems inefficient. While the first example may have more lines of code, the second code certainly uses more resources. Using a character array requires the same data to be stored twice. Once in the program and variables and a second time in the character array. Then you are spending time sending that data into that memory location then sending that new memory location to print(). The first example is certainly faster and more efficient. I understand that neat looking code is desired but the second example is harder to understand and less efficient. Seems like a bad idea.
It is convenient and tidy but keep in mind this method is (a lot) slower than using a bunch of Serial.print commands, as I found out recently when I tried to clean up my new VU meter project code.
Yeah arrays in general are always quite slow. You have to create 40 bytes on the stack now, then sprintf the new string characters into each slot. If you deconstruct everything into machine instructions it comes out as a lot more processor cycles. Streaming bits onto the serial isn't that computationally heavy.
This is so much clearer than the online Arduino reference that is obviously written by well seasoned programmers and assume that you have solid grasp of the C language.
Everything said in this video is correct. However, a couple of things to bear in mind: sprintf is a LOT slower than Serial.print. Also, sprintf uses a lot of memory. On things like an Arduino Uno, Nano, or ATTINY85 you may struggle. What I do, to keep my code tidy, is write a function to display the things I want to display using Serial.print. You don't save on lines of code, but you can move those pesky Serial.print lines - which tend to clutter up the code - into their own functions. Which is much neater. It's also easier to remove them when you don't need them any more. So, using the burritos example from the video:
void displayBurritosInfo(int numberOfBurritos, float temperature)
{
Serial.print("The temperature of the ");
Serial.print(numberOfBurritos);
Serial.print(" is ");
Serial.println(temperature);
}
Also note that using sprintf is *very strongly* discouraged on non-embedded platforms, because of the risk of overflowing the buffer. The examples in the video could trivially be weaponized if the user had control on the `tempStr` variable
yeah you are true rather you can use string concatenation property
a good explanation...but thats still cumbersome. I prefer using the "Streaming.h" library. this allows for c++ style prints:
Serial
Thanks for adding this Matt! I'll definitely check it out - I do wish the native Serial library just "made it easy" with out having to use the String class. If I could just do... Serial.print("I would like " + numTacos + " please"); Would that be great or what!
The sub-specifiers are super handy and there isn't very many good explanations of them. A video detailing them would be super helpful.
Thanks for this Jon!
The best explanation that u ever seen on RUclips. Loved it!!
Thanks!
Cheers Fella,
you are an amazing teacher. Love your channel. I am starting to understand things I thought were beyond my intelect!
Keep 'em coming!
Thanks for watching!
itoa(), and dtostrf(), function detail explain.please
Thanks for the recommendation and thanks for watching!
please make very detailed videos series on sprintf and sub-specifiers
Very nicely explained, please continue with the additional functions.
Thank you!
Brilliant! Great info. I have been struggling with why it wouldn't print %.2f for a large majority of the day and now I know :D, thanks. You mention you have another vid explaining 'dtostrf' but I can't seem to find it. Can you point me in the right direction please? Thanks for your time and effort with your videos, they're super clear!
You have the best Arduino function tutorials. Thank you so much for this content.
Thanks so much Steven!
great man. Really good explanation.. please do a follow up. Thx
Thanks for the note!
Nice explanation just what I hope will work with my microchip pic18f and C language. I'm doing a weather station
Thanks - best of luck in your project!
@@programmingelectronics just wanted to give you an update this piece of code that I wrote worked perfect thanks again
@@user-su5sq5ib3i So glad it helped!
Want know how to read from sd card and print on tft display using arduino uno
Thanks for the recommendation!
congratulations for the class, very explanatory. I'm doing a project using a panel of leds-dot matrix to print texts read by the SD card. How can I include the temperature value read by a sensor (DB1820), in the text sent by reading the SD card? thank you if you can clarify this doubt for me
thank you sir, very good tutorial. plz make such wonderful tutorial.
Glad it helped!
Very nice video!!!
Thank you Ross!
Sir, actually no need to use sprintf rather we can directly use the string concatenation property in serial.print() function
Nicely explained. Thank you.
Glad you liked it! Thanks so much for the note and for watching!
This is potentially creating a buffer overrun. As it depends on how long the inserted numbers/strings are. When inserting strings you can never make the buffer big enough since you don't know the length of the dynamic strings at compile time.
Meaning you would need to allocate the buffer on the heap wasting already limited heap memory on an arduino.
Also this whole thing is just unnecessary. There is nothing wrong with multiple Serial print statements. In fact it's more efficient.
There are cases where sprintf makes sense to use. But this isn't one.
Many thank.Excellent explain.
Thanks so much for watching!
As always, great vid
Appreciate that!
very useful n informative
Thanks!
Is it possible to use this to send multiple variable data to another arduino? If so how would you separate it on that side and plug the data into the correct variable on the recieving arduino?
Very excellent tutorial. You made this simple. Would be very interested in seeing an additional tutorial on using optional sub-specifiers.
Thanks!
I'm speechless!
One of the most annoying things on arduino is to print a long message like you have shown.
Mind blowing!
Would this work for LCD print?
I believe LCD print just takes in a string, so that should work. Best of luck!
Excellent!!
Thanks so much! I hope it helped.
Yes , I want to buy ,lessions
Isn’t it easier just to do it all in one line with Serial.println(String(variable1 + variable2 + ...)). No messing around with a buffer or worrying about if you got the right character specifier to suit your variable.
Yes, it is way easier using the built in String class...
www.arduino.cc/reference/en/language/variables/data-types/stringobject/
There is a fun "controversy" to read up about on whether to use/avoid the String class with Arduino...
forum.arduino.cc/t/optimizing-memory-without-strings/341158
I guess I landed on the not side of this but probably not for the right reasons though... A mentor programmer of mine told me to avoid them, so I just took his word for it! I should probably do some more of my own research :)
This will however be slow as heck as it allocates the string buffer multiple times with the potential to fail at runtime, not good for embedded projects where you need speed and reliability. Much better with a static or stack allocated buffer.
Excelente explicación! Muchas gracias!!!
Thank you!
Thank you, sprintf looks very useful. Would there be any benefit of using sprintf over the following single line command to print a simple string of text with a variable (i)?
For example: Serial.println((String)"Relay"+(i+1)+" OFF"); Where the variable i is a numerical value starting at 0.
I know that comment is old but Ill go ahead and reply. Using the string class is never a good idea, in short it has issues due to dynamic memory on memory constrained systems like arduino unos etc. Go ahead and search for "Why not to use string in arduino". Many good videos.
Really great.✔️ Thanks.🙌
Thanks!
Thank You
Thanks for watching!
Great! ... I'd like to print the % sign, how i do this?
Serial.print("%")
Inside printf with "%%"
Love it, thanks
Thank you!
thanks lot helpful
Thanks for the note! Glad it helped!
Please do the additional tutorials
thanks. I dont found a good explanation of this function in Russia RUclips. Good reason to learn English)
Glad it was helpful!
Superb
Thanks!
This video would have come in real handy just the other day, but better late than never... Would have been nice if you covered the use of the \ as in \"%s\".
Thanks for the note! Great points!
The website will not send me the email needed for signup !!
My aplogies for the issue! Sometimes the email goes to spam
Awesome
Thanks for watching!
The function is called snprintf
I got caught out by the same thing in Matlab
super!
Thanks for watching!
just use String() and + this point
This seems inefficient. While the first example may have more lines of code, the second code certainly uses more resources. Using a character array requires the same data to be stored twice. Once in the program and variables and a second time in the character array. Then you are spending time sending that data into that memory location then sending that new memory location to print(). The first example is certainly faster and more efficient.
I understand that neat looking code is desired but the second example is harder to understand and less efficient. Seems like a bad idea.
or you could use Serial.printf(" .... ", var1, var2, ... varn);
It should be snprintf().
Top
Can we use $"The taco is {tempTaco} degrees"
?