A diferença mais básica é de escopo.
No primeiro caso, você está declarando uma variável global. É uma variável que é acessível em todos os escopos após sua definição.
void setup()
{
Serial.begin(9600);
}
void inc();
int count = 0;
void loop()
{
Serial.println(count);
count++;
inc();
delay(500);
}
void inc() //Can edit the value of count
{
count=count+1;
};
No segundo caso, você está declarando uma variável estática com escopo local. A variável persistirá para que o programa inteiro seja executado de maneira semelhante às variáveis globais, mas estará acessível apenas no bloco de código em que está declarado. Este é o mesmo exemplo, com apenas uma alteração. countagora é declarado como uma variável estática dentro loop.
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
Isso não será compilado, pois a função inc()não tem acesso count.
As variáveis globais, por mais úteis que sejam, vêm com algumas armadilhas. Eles podem até causar danos quando se trata de escrever programas que podem interagir com o ambiente físico. Este é um exemplo muito básico de algo que provavelmente acontecerá, assim que os programas começarem a ficar maiores. Uma função pode alterar inadvertidamente o estado de uma variável global.
void setup()
{
Serial.begin(9600);
}
void another_function();
int state=0;
void loop()
{
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Inadvertently changes state
state=1;
}
Esses casos são muito difíceis de depurar. Esse tipo de problema, no entanto, pode ser facilmente detectado, simplesmente usando uma variável estática.
void setup()
{
Serial.begin(9600);
}
void another_function();
void loop()
{
static int state=0;
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Results in a compile time error. Saves time.
state=1;
}