Manual
do
Maker
.
com
No Desafio maker 02 tivemos uma código seguindo os requisitos descritos no artigo. A solução dada eu não havia previsto, mas é excelente e certamente fácil de lembrar e aplicar; mais do que bit field. Vamos começar apresentando a solução encontrada pelo Ricardo Amaral Andrade (nosso revisor, mas também leitor).
O código apresentado:
int led = 0;
unsigned int i=0;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, i%2);
i++; delay(1000);
}
Aqui ele utilizou o módulo (%), que retorna 0 ou 1, que é a diferença da divisão por 2. Quando o valor incrementado for par, o retorno do módulo será 0 e quando o valor incrementado for ímpar, o retorno do módulo será 1 (ex.: 17/2 = 8; sobra 1, que é o módulo). Agora vou apresentar a solução pretendida.
Como a do Ricardo foi apresentada primeiro, a minha fica sendo então a segunda solução.
struct {
unsigned int i:1;
} counter;
void setup(){
pinMode(13,OUTPUT);
counter.i = 0;
}
void loop(){
digitalWrite(13,counter.i);
counter.i++;
delay(1000);
}
Qual é mais simples? Obviamente é mais clara a solução do Ricardo Amaral. Mas a segunda solução tem um propósito, que é justamente explicar o que acontece com a variável da struct.
Nossa base numérica é decimal, indo de 0 à 9, portanto 10 dígitos. Quando passamos do número 9, a unidade volta para 0. Esse é o primeiro estouro de base. Na struct temos um unsigned int, que só apresentará valores positivos. Ao declarar int i:1 definimos apenas 1 bit a ser usado. Mas isso não significa que a variável tem 1 bit; no Arduino o tipo int tem 16 bits - ou, 2 bytes. Tendo definido apenas 1 bit para manipulação, os valores possíveis são o 0 e o 1, sendo 2 o estouro da base binária, portanto retornando ao 0 novamente.
Assim como fez o Ricardo, é importante definir como unsigned int o tipo da variável porque os tipos tem valores negativos e ao estourar uma base ela começará a acumular novamente a partir do valor negativo. Se tivesse usado apenas int, o resultado seria 0 e -1, respectivamente.
Esse recurso se chama "bit field" e só funciona dentro de uma struct, por isso foi necessário declará-la. Depois é só fazer o loop e incrementar ad eternum, seguido pelo delay proposto.
Já escrevi sobre esse recurso no artigo "Programar em C/C++ para microcontoladores PIC e Arduino", onde discorro sobre outros recursos da linguagem.
Esse desafio é um oferecimento da Usina Info, uma das grandes lojas para comprar seus eletrônicos sem receio, já conhecida por muitos makers.
Espero que estejam gostando da brincadeira, logo mais tem o terceiro desafio!
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.