O Projeto Fade segue praticamente os mesmos passos do Blink, o que difere é apenas no resultado final é a forma de piscar o led, ao invés dele ter dois estados (aceso e apagado) ele terá vários, 255 para ser mais exato. O led irá continuando acendendo e apagando mas agora com o efeito "Fade".
Para este projeto vamos utilizar além do arduino um led, jumpers e uma protoboard, mesmos utilizados no Blink. Apesar de sua estrutura física ser idêntica ao Blink há a exceção de modificar o pino do 13 para o 9 se for utilizar o código 100% como vem por padrão ao seleciona-lo, mas isto é uma opção que você programador quem decide em qual pino seu led deve estar.
Não esquecendo o importantíssimo detalhe de por o resistor de 200 a 220 ohms em serie com o led para não queima-lo.
UP3gFl.jpg

O código já está pronto, vamos por logo a mão na massa, abra a IDE do arduino e siga este caminho File > Examples > Basics > Fade .

Ao clicar em Fade irá ser aberto uma outra janela IDE do arduino e o código que estará nele mostrado será este:

/* Fade  This example shows how to fade an LED on pin 9 using the analogWrite() function.  This example code is in the public domain.  */

int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

void setup()  {   

// declare pin 9 to be an output: 

pinMode(9, OUTPUT);



void loop()  {

// set the brightness of pin 9;
analogWrite(9, brightness);

// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;

// reverse the direction of the fading at the ends of the fade:  
if (brightness == 0 || brightness == 255) {   

fadeAmount = -fadeAmount ;   

}      


// wait for 30 milliseconds to see the dimming effect     

delay(30);                            

}

Como já sabemos através do projeto Blink, o que estiver entre um ' /* ' e um ' *\ ' ou depois de um ' // ' é um comentário, ou seja, ao compilar o código estes trechos não serão levados em consideração.
A primeira parte do programa que devemos levar em consideração são as duas linhas que tem escrito: 
int brightness = 0;
int fadeAmount = 5;
O que acontece nestas duas linhas é o seguinte, é criado um espaço na memória para que eu possa armazenar um valor. Imagine que a memória é uma tabela, como está:
t5Bwm.png

Cada célula desta tabela tem um identificador que são estes números, vamos simbolicamente chamar estes números de endereços de memória.
Complicou como endereço de memória? Então vamos para um exemplo mais alto nível, imagine que o planeta terra é a memória e para eu encontrar determinado espaço de memória eu preciso de um endereço, correto?
Continente, País, Estado, Cidade, Bairro, Rua, Número alem da latitude e longitude e até mesmo o CEP... São as informações que utilizamos para encontrar um espaço especifico em nosso planeta, da mesma forma um programa desenvolvido por nós necessita de uma referencia de onde está armazenando seus dados, isto no código são chamadas de variáveis. Nas duas primeiras linhas de nosso programa armazenamos valores em dois espaços da memória, se voltarmos ao exemplo anterior da tabela, o armazenamento iria ficar com o endereço de memória que indica onde está a posição de um valor.

gtieg.png

Eu sei que no endereço 01 tenho o valor 0 e no endereço 02 o valor 5, são valores que estão armazenados na memória. Mas se e o que antecede estes valores presente nas duas linhas de comando que vimos? Vamos novamente lê-las para tentar interpretar o que ela nos diz.

int brightness = 0;
int fadeAmount = 5;

int é o tipo da variável, que significa que ela é um número inteiro, fácil né? Note que e o int está nas duas linhas, então temos dois valores inteiros. E o brightness e fadeAmount? o que vem a ser?
Lembram dos endereços de onde estão os valores? Os endereços das variáveis?
Estes nomes (brightness e fadeAmount) são nomes criados pelo programador para melhor poder ler o código que no final irá representar o local de onde será alocado aquele valor na memória. Os endereços na memória não são representados diretamente com o nome que o programador define, estes nomes servem para melhor leitura do código, afinal é muito mais intuitivo dizer por exemplo que a variável "valorPositivo" tem como valor do que a de um endereço de memória que seria mais ou menos como "0x0047".

Pronto, temos nossas variáveis armazenando um espaço na memória com seus respectivos valores, nos projetos posteriores vamos ver mais detalhes sobre variáveis e seus outros vários tipos, vamos para as linhas do código subsequentes, encontramos a função setup e nela só estou indicando o pino do arduino que vou utilizar e qual será seu uso, no caso, como saída de informação: pinMode(9, OUTPUT);

Agora vamos para a função loop, é lá onde a mágica do efeito fade acontece. Aqui em analogWrite(9, brightness); só estamos informando que utilizaremos o analogWrite que tem por parametro dois valores, o primeiro é o pino e o segundo é um valor que vai ser convertido em alguma informação para este pino, este valor inicialmente será o valor declarado na variável brightness lá em cima, ou seja, será passado o valor 0. E o que isso fará ao led? Absolutamente nada, estou apenas indicando neste primeiro momento que o led deve começar apagado. A próxima linha vem o brightness = brightness + fadeAmount; que é apenas um incremento a à variável brightness, o código faz com que seja adicionando o valor que já está em brightness que inicialmente é 0 mais o valor de fadeAmount que é 5, assim a variável brightness passar agora a ter o valor 5.
Próxima linha é o if (brightness == 0 || brightness == 255) , nesta linha temos uma instrução importantíssima importantíssima para o  efeito fade ficar comutando de aceso para apagado, quando o programa estiver rodando dentro do microcontrolador do arduino a função loop será chamada, e como já sabemos que esta função faz é repetir as instruções dentro de seu bloco. Notem quem como esta função sempre será repetitiva e o valor de brightness será acrescido dele mais fadeAmount

nWknRl.png

Vai chegar um momento em que o brightness irá chegar ao valor 255, é aí que entra a funcionalidade da linha onde há o if (brightness == 0 || brightness == 255), este comando irá verificar em cada loop se brightness esta com o valor igual a 255 ou igual a 0, quando isto acontecer ele irá fazer as instruções que estiver dentro de seu bloco de comandos, que será fadeAmount = -fadeAmount;
fadeAmount receberá o valor dele mesmo, só que negativo, isto irá influenciar no próximo loop, quando houver  brightness = brightness + fadeAmount; o brightness terá seu valor decrescido em menos 5, e assim será até seu valor chegar em 0. Quando chegar em zero mais uma vez ele irá entrar em acordo com if (brightness == 0 || brightness == 255), que espera que o valor de brightness seja 0 ou 255, quando entrar no bloco e a instrução fadeAmount = -fadeAmount; for validada, o valor de fadeAmount será agora positivo, no próximo loop brightness será incrementado do 0 até 255 e assim vai.

Em delay(30); o que acontece é apenas uma espera de 30 milisegundos, se não houver esta espera o piscar do led fica imperceptível aos nossos olhos pois o processamento do microcontrolador é bem mais rápido.

Se estiver com dúvidas mande para meu email: fabio@robolivre.org e tentarei esclarecer o mais breve possível.
Até o próximo projeto. 


Atividades recentes