Deep Dive: Variables
Similar to Scratch and Python, C allows you to create variables to store temporary values. In the example for Lab 2 we used this code to blink the LED at a rate dependent on the state of a switch:
void loop()
{
    if (digitalRead(3) == LOW)
    {
        // The switch is on, so blink the LED on pin 2 quickly:
        digitalWrite(2, HIGH);
        delay(100);
        digitalWrite(2, LOW);
        delay(100);
    }
    else
    {
        // The switch is off, so blink the LED on pin 2 slowly:
        digitalWrite(2, HIGH);
        delay(200);
        digitalWrite(2, LOW);
        delay(200);
    }
}
We can rewrite this code to read the switch state, store the corresponding delay time in a variable (delayTime), and then blink the light using that delay time instead of hardcoding the delay() calls:
void loop()
{
    // Determine the delay time by reading the switch on pin 3:
    int delayTime;
    if (digitalRead(3) == LOW)
    {
        delayTime = 100;
    }
    else
    {
        delayTime = 200;
    }
    // Blink the LED on pin 2 using the delay we determined above:
    digitalWrite(2, HIGH);
    delay(delayTime);
    digitalWrite(2, LOW);
    delay(delayTime);
}
Much like function parameters, variables in C must be declared before they can be used and must specify a data type. The variable used above, delayTime, is an int that can store an integer between -32,768 and 32,767, but there are many other data types available. Here are some common ones, taken from the Arduino website:
| Type | Description | 
|---|---|
| bool | A boolean value that can be either true or false. | 
| byte | An 8-bit unsigned integer, from 0 to 255. | 
| int | A 16-bit signed integer, from -32,768 to 32,767. | 
| unsigned int | A 16-bit unsigned integer, from 0 to 65,535. | 
| long | A 32-bit signed integer, from -2,147,483,648 to 2,147,483,647. | 
| unsigned long | A 32-bit unsigned integer, from 0 to 4,294,967,295. | 
| float | A 32-bit floating point number (also known as a decimal number). | 
| double | A 64-bit floating point number (also known as a decimal number). | 
Variable Scope
In C, matters are further complicated by a concept called variable scope. If a variable is declared within a set of curly braces it can only be used within those curly braces, and then only after it is declared. Consider the following example, in which a variable is declared within a function and can be accessed from some places but not from others:
void loop()
{
    // We *CANNOT* use delayTime here; it has not yet been declared.
    int delayTime = 0;
    // We *CAN* use delayTime here.
    if (digitalRead(7) == LOW)
    {
        // We *CAN* also use delayTime here because we are still inside
        // the outer set of curly braces that it was declared within.
    }
}
// We *CANNOT* use delayTime here because it is no longer in scope.
If you want to be able to use a variable from anywhere in your program you should put it at the top of your program, before setup() and loop(). This is sometimes called a global variable.