Created on: 14 September 2014
Updated on: 18 January 2017
Part 2 of the Arduino Programming Course
Part 2 of the Arduino programming course explains what a loop is in software and demonstrates how the main loop of an Arduino sketch works.
A function in a sketch performs some task (i.e. performs a function). We say that we "call a function" when we use a function to perform its specified task. This is explained in the second half of this part of the course.
As seen in the previous part of this course, an Arduino sketch consists of two main functions called setup() and loop(). The loop() function is the main loop in the Arduino sketch. After statements that only need to be run once have finished being executed in the setup() function, program execution starts in the loop() function.
Once program execution has started in the main loop, the statements in the main loop will be executed continuously until the Arduino is switched off or reset. The main loop is where the actual operational functionality of the Arduino takes place – for example, if the Arduino is programmed to be a flashing light sequencer, then the flashing light functionality will be placed in the main loop.
Statements in the loop() function will be executed from top to bottom, until the bottom of the loop() function is reached. When the bottom of the loop function is reached, statements are executed from the top of the loop() function again, thus completing the "loop" as shown in the image below.
The main_loop sketch shown below, demonstrates how the main loop works in an Arduino sketch. Type the sketch into your Arduino IDE, or copy and paste it into the IDE.
Load the sketch to the Arduino and then open the serial monitor window to see the sketch output text as it runs.
void setup() { Serial.begin(9600); Serial.println("*** This message will only be displayed on start or reset. ***"); delay(2000); } void loop() { Serial.println("-- Arduino now at top of main loop. --"); Serial.println("--------------------------------------"); delay(2000); Serial.println("Executing instructions in main loop."); delay(2000); Serial.println("Arduino now at bottom of main loop.\r\n"); }
The text that the sketch prints to the serial monitor window is shown below.
The text in the setup() function is only displayed once when the serial monitor window is first opened and the Arduino is reset. After this, program execution enters the loop() function and repeatedly executes the statements in the loop from top to bottom and back to the top again in a never ending loop.
In the main_loop sketch above, each statement in setup() and loop() consists of a function being called – i.e. being called means that it is executed or run.
When the delay() function is called in the statement delay(2000); then the delay function causes a waiting period of 2 seconds (2000 milliseconds – there are 1000 milliseconds in one second, also written 1000ms). The time of the delay can be changed by passing a different value to delay(), e.g. 3000 will cause a 3 second delay: delay(3000);
The println() function sends text out of the serial / USB port of the Arduino and is displayed in the serial monitor window.
The println() function is different from the delay() function in that it has Serial and a dot (.) before it: Serial.println("Text to print.");
The reason for this notation (Serial.function_name()) is because the function acts on the serial port or Serial object. You will notice in setup() that Serial.begin() is called. This is the begin() function acting on the serial port – in this case to set it to the desired speed.
These functions that are preceded by an object name (e.g. Serial) are called "methods" in object oriented programming.
The following will hopefully clear up what functions are and the terminology used with them. A deeper understanding of functions will only be possible once we start writing our own functions.
setup() and loop() are two special functions that form part of the structure of an Arduino sketch.
We are actually writing these special functions by giving them a function body (between the opening and closing braces: {}) and writing statements in the function body.
The statements in these functions in the above sketch were calling pre-existing functions that perform the tasks that we want, e.g. set up the serial port speed, cause a time delay, write text to the serial monitor window.
The setup() and loop() functions are automatically called at the right time because they are special Arduino functions.
By calling or using pre-existing functions, we are using code that someone else has already written.
The delay() function has a function body that contains statements that cause it to perform a delay. We do not see these statements or the function body because they are either part of the Arduino programming language or exist in an external function library.
When a value (e.g. a number or text string) is used by a function, we must pass the value to the function.
We call the delay() function in the sketch as in the following statement:
delay(2000);
The delay value in milliseconds (2000) is said to be passed to the function.
We pass a text string to the println() function as shown in this statement:
Serial.println("Executing instructions in main loop.");
We must pass the text string to the function so that the function knows what to send out of the serial / USB port. The text between the opening and closing quotation marks ("") is known as a string in programming.
The main_loop sketch from above can be seen here again, but with commentary explaining what is happening in the sketch.
void setup() { The Arduino sketch starts to run here when the setup() function is automatically called. First we set up the serial port at the baud rate of 9600 which must match the baud rate in the serial monitor window. The baud rate can be thought of as the speed that communication is taking place at between the Arduino and serial monitor window. Serial.begin(9600); A line of text (known as a "string" of text in programming languages) is sent out of the serial / USB port for display in the serial monitor window. Serial.println("*** This message will only be displayed on start or reset. ***"); A 2 second delay has been added so that the next text to be displayed in the serial monitor window does not appear immediately. delay(2000); } The statements in the setup() functions have all finished being executed, so now the loop() function is called automatically. void loop() { Now that execution is taking place in the loop, the statements inside the loop() function will be executed from top to bottom. When the bottom of the loop is reached, all the statements will be executed again from top to bottom. This text is sent to the serial monitor window and is the first statement to be executed in the loop. Serial.println("-- Arduino now at top of main loop. --"); This text is just to highlight that we are at the top of the loop. Because there is no delay between the above text and this text, both appear at the same time in the serial monitor window. Serial.println("--------------------------------------"); A two second delay so that the line of text that follows does not appear instantly with the above text. delay(2000); We are now executing statements (also called instructions) in the middle of the main Arduino loop. This statement sends more text to the serial monitor window. Serial.println("Executing instructions in main loop."); Another delay so that the line of text that follows does not appear at the same time as the line of text above. delay(2000); The last statement in the loop and the last text that gets sent to the serial monitor window before returning to the top of the loop to start executing statements again. The println() function causes the invisible cursor to move to the next line in the serial monitor window. This causes the next text sent to the serial monitor window to appear on the line below the currently printed text. The \r\n at the end of this text of string moves the invisible cursor down one more line leaving a blank line between the text printed at the bottom of the loop and the text printed at the top of the loop. Serial.println("Arduino now at bottom of main loop.\r\n"); }