If you don’t learn sprintf(), your code will hate you later

แชร์
ฝัง
  • เผยแพร่เมื่อ 3 มิ.ย. 2021
  • 🤩 FREE Arduino Crash Course 👇👇
    bit.ly/get_Arduino_skills
    Want to learn more? Check out our courses!
    bit.ly/2SMqxWC
    We designed this circuit board for beginners!
    Kit-On-A-Shield: amzn.to/3lfWClU
    FOLLOW US ELSEWHERE
    ---------------------------------------------------
    Facebook: / programmingelectronics...
    Twitter: / progelecacademy
    Website: www.programmingelectronics.com/
    **Get the code, transcript, challenges, etc for this lesson on our website**
    bit.ly/2Ra5zAy
    SPRINTF() WITH ARDUINO | PRINT MULTIPLE VARIABLES TO THE SERIAL MONITOR
    Are you trying to figure out sprintf() with Arduino?
    Or maybe you want to display multiple variables on the serial monitor without having to use a bunch of separate Serial.print() statements.
    If so, you’re in the right place. In this lesson you’ll learn exactly how to use sprintf().
    JUST USING SERIAL.PRINT()
    Let’s say you want to print this line of text to the serial monitor:
    “The 3 burritos are 147.7 degrees F”
    Where the number of burritos and the temperature value are both variables. Using Serial.print() would take 5 lines of code to print out just this single line of text.
    Serial.print("The ");
    Serial.print(numBurritos);
    Serial.print(" burritos are ");
    Serial.print(tempStr);
    Serial.println(" degrees F");
    In fact, for every variable you add to the output, you add two more serial prints in the code. What if you wanted to print a line with 4 variables inserted into a string like this:
    “The 3 burritos are 147.7 degrees F, weigh 14oz, and were finished 3 minutes ago.”
    It would take 9 lines of code!
    SPRINTF() TO THE RESCUE
    This is where sprintf() comes in handy. We can print out as many variables into our string as we want, and the amount of code required stays at 3 lines.
    Here the three lines of code you’ll need:
    char buffer[40];
    sprintf(buffer, "The %d burritos are %s degrees F", numBurritos, tempStr);
    Serial.println(buffer);
    First you need a character array to save the output string into.
    Then you need the sprintf() function, which will combine our text and variables into a string.
    Finally, you use Serial.print() to display the formatted string.
    Let’s take a closer look at each line of code.
    char buffer[40];
    The character array needs to be as large, or larger than the final output string.
    So count the characters you plan to store in that string, and make sure the buffer is at least that large.
    The next line of code is the actual sprintf() function. sprintf() stands for “string print format(ted)”.
    sprintf(buffer, "The %d burritos are %s degrees F", numBurritos, tempStr);
    sprintf() takes a minimum of 2 arguments. The first argument is where you plan to store the string that sprintf() will be making for you. This is where you use the character buffer that you created on the previous line.
    show buffer argument in sprintf()
    The next argument is the string you want to create, filled in with format specifiers where you want to insert your variables. The format specifier is the % sign. The letter following the format specifier is called the format character, and it tells sprintf() what datatype will be used for that variable.
    show the second string argument for sprintf(), with format specifiers labeled
    "The 3 burritos are 147.7 degrees F"
    In this example we have 2 format specifiers (%) - this means we want 2 variables inserted into the output string. The character specifiers are a little weird at first. They are simply letters that stand for the kind of data type that will be inserted - once you learn what each letter means it starts to make more sense.

ความคิดเห็น • 93

  • @ericBcreator
    @ericBcreator ปีที่แล้ว +14

    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.

    • @kriscurkovic9265
      @kriscurkovic9265 4 หลายเดือนก่อน +1

      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.

  • @jon_raymond
    @jon_raymond 3 ปีที่แล้ว +28

    The sub-specifiers are super handy and there isn't very many good explanations of them. A video detailing them would be super helpful.

  • @NotMarkKnopfler
    @NotMarkKnopfler ปีที่แล้ว +6

    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);
    }

    • @shadamethyst1258
      @shadamethyst1258 ปีที่แล้ว +2

      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

  • @iamsparkicus
    @iamsparkicus 3 ปีที่แล้ว +3

    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!

  • @GaboG85
    @GaboG85 5 หลายเดือนก่อน +1

    The best explanation that u ever seen on TH-cam. Loved it!!

  • @mtraven23
    @mtraven23 2 ปีที่แล้ว +3

    a good explanation...but thats still cumbersome. I prefer using the "Streaming.h" library. this allows for c++ style prints:
    Serial

    • @programmingelectronics
      @programmingelectronics  ปีที่แล้ว +1

      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!

  • @_GB84
    @_GB84 3 ปีที่แล้ว +3

    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!

  • @alejandrom72
    @alejandrom72 3 ปีที่แล้ว +1

    Nicely explained. Thank you.

    • @programmingelectronics
      @programmingelectronics  3 ปีที่แล้ว

      Glad you liked it! Thanks so much for the note and for watching!

  • @MN-be7sx
    @MN-be7sx 2 ปีที่แล้ว +1

    please make very detailed videos series on sprintf and sub-specifiers

  • @KashifKhan-kw3ez
    @KashifKhan-kw3ez 3 ปีที่แล้ว +6

    itoa(), and dtostrf(), function detail explain.please

  • @vikky452
    @vikky452 2 ปีที่แล้ว +1

    thank you sir, very good tutorial. plz make such wonderful tutorial.

  • @sombatmuenphan1555
    @sombatmuenphan1555 2 ปีที่แล้ว +1

    Many thank.Excellent explain.

  • @DavidRisnik
    @DavidRisnik ปีที่แล้ว +1

    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

  • @rossli8621
    @rossli8621 ปีที่แล้ว +1

    Very nice video!!!

  • @fernandosimonetti6595
    @fernandosimonetti6595 ปีที่แล้ว +1

    Excelente explicación! Muchas gracias!!!

  • @banditboy6444
    @banditboy6444 3 ปีที่แล้ว +1

    As always, great vid

  • @joshuapitong899
    @joshuapitong899 ปีที่แล้ว

    Really great.✔️ Thanks.🙌

  • @ED99LAM
    @ED99LAM ปีที่แล้ว +1

    very useful n informative

  • @JPN76
    @JPN76 2 ปีที่แล้ว

    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?

  • @John-qe3ky
    @John-qe3ky 3 ปีที่แล้ว +3

    Very nicely explained, please continue with the additional functions.

  • @ingenierocristian
    @ingenierocristian 3 ปีที่แล้ว +1

    Love it, thanks

  • @steventhehistorian
    @steventhehistorian 2 ปีที่แล้ว +2

    You have the best Arduino function tutorials. Thank you so much for this content.

  • @giorgito3313
    @giorgito3313 2 ปีที่แล้ว +1

    Excellent!!

  • @MrShanmunir
    @MrShanmunir 2 ปีที่แล้ว +1

    great man. Really good explanation.. please do a follow up. Thx

  • @markadyash
    @markadyash 2 ปีที่แล้ว +1

    thanks lot helpful

  • @bobowen7861
    @bobowen7861 3 ปีที่แล้ว +2

    Very excellent tutorial. You made this simple. Would be very interested in seeing an additional tutorial on using optional sub-specifiers.

  • @user-su5sq5ib3i
    @user-su5sq5ib3i 2 ปีที่แล้ว +1

    Nice explanation just what I hope will work with my microchip pic18f and C language. I'm doing a weather station

    • @programmingelectronics
      @programmingelectronics  2 ปีที่แล้ว +1

      Thanks - best of luck in your project!

    • @user-su5sq5ib3i
      @user-su5sq5ib3i 2 ปีที่แล้ว +1

      @@programmingelectronics just wanted to give you an update this piece of code that I wrote worked perfect thanks again

    • @programmingelectronics
      @programmingelectronics  2 ปีที่แล้ว +1

      @@user-su5sq5ib3i So glad it helped!

  • @dalwinderssi4094
    @dalwinderssi4094 2 ปีที่แล้ว +1

    Yes , I want to buy ,lessions

  • @TOMTOM-nh3nl
    @TOMTOM-nh3nl 2 ปีที่แล้ว +1

    Thank You

  • @12DGJB21
    @12DGJB21 ปีที่แล้ว

    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.

    • @yo90bosses
      @yo90bosses ปีที่แล้ว

      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.

  • @redcrafterlppa303
    @redcrafterlppa303 ปีที่แล้ว +1

    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.

  • @christiaansteyn4088
    @christiaansteyn4088 ปีที่แล้ว

    Please do the additional tutorials

  • @yugalkishor3131
    @yugalkishor3131 3 ปีที่แล้ว +1

    Superb

  • @dalwinderssi4094
    @dalwinderssi4094 2 ปีที่แล้ว +1

    Want know how to read from sd card and print on tft display using arduino uno

  • @thunderbolt997
    @thunderbolt997 3 ปีที่แล้ว +1

    super!

  • @jslonisch
    @jslonisch ปีที่แล้ว +1

    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.

    • @programmingelectronics
      @programmingelectronics  ปีที่แล้ว

      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 :)

    • @berndeckenfels
      @berndeckenfels ปีที่แล้ว +3

      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.

  • @user-yg4nl2tf4z
    @user-yg4nl2tf4z 2 ปีที่แล้ว +1

    thanks. I dont found a good explanation of this function in Russia TH-cam. Good reason to learn English)

  • @chrisspencer6502
    @chrisspencer6502 3 ปีที่แล้ว +1

    I got caught out by the same thing in Matlab

  • @DodgyBrothersEngineering
    @DodgyBrothersEngineering 3 ปีที่แล้ว

    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\".

  • @electronics5449
    @electronics5449 2 ปีที่แล้ว +1

    Awesome

  • @Clip7heApex
    @Clip7heApex 2 ปีที่แล้ว +1

    Would this work for LCD print?

    • @programmingelectronics
      @programmingelectronics  2 ปีที่แล้ว

      I believe LCD print just takes in a string, so that should work. Best of luck!

  • @bibel2k
    @bibel2k 2 ปีที่แล้ว +1

    I'm ‏speechless!
    One of the most annoying things on arduino is to print a long message like you have shown.
    Mind blowing!

  • @ElIngLopez
    @ElIngLopez 2 ปีที่แล้ว

    Great! ... I'd like to print the % sign, how i do this?

    • @mtraven23
      @mtraven23 2 ปีที่แล้ว

      Serial.print("%")

    • @berndeckenfels
      @berndeckenfels ปีที่แล้ว

      Inside printf with "%%"

  • @jason_man
    @jason_man 5 หลายเดือนก่อน

    just use String() and + this point

  • @xroppa5290
    @xroppa5290 2 ปีที่แล้ว

    Top

  • @berndeckenfels
    @berndeckenfels ปีที่แล้ว

    The function is called snprintf

  • @lesatkins42
    @lesatkins42 5 หลายเดือนก่อน

    or you could use Serial.printf(" .... ", var1, var2, ... varn);

  • @crissd8283
    @crissd8283 ปีที่แล้ว

    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.

  • @semibiotic
    @semibiotic ปีที่แล้ว +1

    It should be snprintf().

  • @livetohash6152
    @livetohash6152 2 หลายเดือนก่อน

    Can we use $"The taco is {tempTaco} degrees"
    ?