HugoPT:
So uma pequena correçao na funçao liga_led penso que te enganaste e deverá ter de ficar asssim
void liga_led(unsigned char led) {
for (char i = 0; i <3; i ++ {
if (i == led) {
digitalWrite(LEDs[i], HIGH); //liga LED
} else {
digitalWrite(LEDs[i], LOW); //desliga LED
}
}
}
Muito bem visto... correr o que eu deixei com a porta série havia de ser engraçado... LOL
HugoPT:
O prefixo unsigned quer dizer sem sinal ou seja serve para delimitar o valor minimo e maximo de uma variavel.
Por defeito um int se nao indicares prefixo ele é signed (com sinal ), como um Int sao 16 Bits na arquitectura do arduino ele pode conter no maximo 65535 valores( que é 2 ^16)
Sendo ela unsigned começa de 0 a 65535
Se for signed é dividida ao meio contendo valores negativos(65535/2 ) que dá ?32,768 to 32,767
Se na programaçao do arduino declareces uma variavel assim e a colocasses na loop() imprimindo o valor actual para a Porta Serie
int numero = 0;
loop()
{
Serial.print(numero);
numero ++;
}
Ele iria contar ate 32767 e depois pulava para o valor negativo dando a volta.
Se calhar é melhor experimentares com uma variável char (que contém valores de -126 a 127) em vez do int. Apenas porque demora menos tempo para mostrar o mesmo conceito.
Eu tenho por norma usar o unsigned sempre e se uma variável tiver a possibilidade de conter valores negativos, então usar o signed ou deixar em branco essa opção. O motivo pelo qual tenho esta norma vem do facto que eu iniciei a programação de microcontroladores em Assembly com PICs. Ora, as PIC que usava tinham pouca memória, apenas 31 instruções de assembly e era uma máquina de 8 bits. Então, tinha de "espremer" ao máximo os valores que podia conter dentro das variáveis e mais tarde passei essa preocupação ou método para o meu C. Daí tentar sempre garantir que tenho o maior espaço disponível na variável (0 a X em vez de -X/2 a X/2)
Não fiques preocupado, no exemplo em questão ser unsigned não implica em nada para o funcionamento do exemplo, é apenas a minha maneira de escrever código (como podes confirmar nos restantes posts que tenho aqui no fórum).
Nota também, apenas como curiosidade, que podes activar uma flag que trata todas as variáveis como unsigned. Ou seja... normalmente defines uma variável assim:
int my_var = 0;
No entanto, se reparares bem, em lado nenhum dizes ao compilador que a variável é signed ou unsigned. O compilador é que, por defeito, assume que é signed. No entanto, a forma completa de escrever a definição da variável seria
signed int my_var = 0;
//ou
unsigned int my_var = 0;
Num programa pequeno, dentro do mesmo ficheiro e que seja de muito baixo nível (implementações que mexem directamente com registos do micro processador, por exemplo), este cuidado é irrelevante ou até muito pouco problemático uma vez que é simples de ajustar o tipo de variável consoante o compilador.
No entanto, em projectos grandes onde o código vai estar distribuído por várias equipas ou pessoas e que seja um código de alto nível, ou seja, suposto correr em plataformas diferentes (tipo em PIC, ARM e AVR), ter este cuidado de definir exactamente o tipo de variável ajuda a evitar problemas com a compilação.
Isto é algo que testado é melhor... vê o exemplo do Hugo.
Algo que é complementar a isto são os casts. Já falaste ou leste sobre isso? Se não sabes o que é, apita que metemos aqui um exemplo para perceberes. 