Ajustando o Brilho de um LED por PWM

Ajustando o Brilho de um LED por PWM

Conforme prometido no post anterior,  iremos mostrar como você pode ajustar o brilho de um LED através de um PWM (Pulse Widht Modulation). Os conceitos serão explicados posteriormente, vamos nos concentrar agora na montagem.

Materiais necessários: 1 LED, 1 resistor para limitar a corrente no LED, jumpers, protoboard e Arduino. Para este projeto a FILIPELOP recomenda o Kit Arduino Start.

Conecte os componentes como mostra a imagem abaixo:

Ajustando o Brilho de um LED por PWM

Código.:

// Projeto FilipeFlop - Brilho LED PWM

int ledPin = 11;
float sinVal;
int ledVal;

void setup() 
{
  pinMode(ledPin, OUTPUT);
}

void loop() 
{
  for (int x=0; x<180; x++) 
  {
    // converte graus para radianos e então obtém o valor do seno
    sinVal = (sin(x*(3.1412/180)));
    ledVal = int(sinVal*255);
    analogWrite(ledPin, ledVal);
    delay(25);
  }
}

Compile o código e rode em seu Arduino. Você verá que o LED pulsará em ON/OFF suavemente em vez de um simples ON/OFF abrupto. Será desta forma que controlaremos o brilho de um LED. Abaixo uma explicação mais profunda do código.

Código Overview.:

Primeiramente foi setado as variáveis do LED Pin, um float (floating point data type) para a onda seno, e um ledVal que será o valor inteiro a ser enviado para saída digital PWM Pin 11.

O conceito aqui é que estamos criando uma onda seno em que o brilho do LED a está seguindo em parte da onda, fazendo com que o valor do brilho seja alterado mais vagarosamente do que simplesmente brilho máximo e mínimo.

Como a função seno é somente positiva até 180 graus o laço for limita os valores entre 0 e 179, logo não haverá resultados negativos e o valor para o brilho somente poderá variar entre 0 e 255. Vale ressaltar que a função seno recebe valores apenas em radianos, logo é necessário converter de graus para radianos como mostra o código abaixo.

sinVal = (sin(x*(3.1412/180)));

Os valores do seno serão multiplicados por 255 e o resultado será transformado em inteiro, trancando assim a casa decimal para que seja possível enviar para a saída digital PWM Pin 11.

analogWrite(ledPin, ledVal); 

Este trancamento significa que você converteu o ponto flutuante float em um inteiro, eliminando assim possíveis casas decimais. Mas como posso enviar um sinal analógico por uma porta digital?

Se você olhar o Arduino verá que em alguns pinos digitais está escrito PWM, este pinos são diferentes dos outros pois são capazes de enviar um sinal PWM, que é uma técnica usada para digitalizar sinais analógicos.  Nestes pinos, o Arduino envia uma onda quadrada alternando o pino em ON/OFF rapidamente. A sequência destes ON/OFFs podem simular a variação de tensão entre 0 a 5v. Isto é feito trocando-se a quantidade de tempo que a saída fica em 1 (on) ou em 0 (off). A duração deste tempo é conhecida como pulse widht (largura de pulso).

Por exemplo, caso você envie o valor 0 pela saída digital PWM Pin 11 usando analogWrite(), o período em ON será zero, ou terá 0% de duty cycle (ciclo de trabalho). Se enviar o valor 64 (25% do valor máximo 255) o pino ficará em ON por 25 porcento do tempo e 75 porcento em OFF, logo duty cicle de 25%. O valor 191 terá o teu duty cicle de 75% e o valor 255 de 100%.

Logo basta escolher a intensidade do brilho que se encaixa melhor em seu projeto e enviar via PWM conforme explicamos acima.

Este foi mais um projeto da FILIPELOP. Gostou? Compartilhe!

6
Ajustando o Brilho de um LED por PWM
9 votos, 5.00 classificação média (100% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

10 Comentários

  1. Everson - 29 de maio de 2017

    Olá Adilson tudo bem?!

    Show de bola seu exemplo de controle pwm com o led, porém tenho um projeto que preciso controlar manual a intensidade da saída pwm, por exemplo, num determinado momento preciso que o led tenha 20% da sua luminosiadade, num outro momento preciso que tenha 70%, em um outro 50% em outro 100% e assim por diante!
    Como posso fazer este controle sem o potenciomentro?
    Vou controlar por uma página web mas tendo como controlar ele pelo Serial Monitor depois para a página web consigo, não sei como descrever o código do arduino pra fazer este controle, podes me ajudar?
    Grande Abraço

  2. João - 19 de outubro de 2016

    Olá
    Estou fazendo um projeto com fita de led rgb e quero controlar ela usando arduino, modulo bluetooth e um app. Posso fazer o mesmo processo do que com o led ou tenho que fazer alguma modificação?

  3. Rafael - 16 de junho de 2016

    Boa noite.

    Executei seu código, e funcionou perfeitamente.
    Tentei adaptar para aumentar o brilho com determinada tecla do IR, e diminuir com outra tecla, mas não funcionou.
    Poderia dar um auxilio?
    Segue o código:

    #include

    int RECV_PIN = 2;
    float armazenavalor;
    int led = 11;
    float sinVal;
    int ledVal;
    int valor = 0;

    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void setup()
    {
    pinMode(led, OUTPUT);
    Serial.begin(9600);
    irrecv.enableIRIn(); // Inicializa o receptor IR
    }

    void loop()
    {
    if (irrecv.decode(&results))
    {
    Serial.print(“Valor lido : “);
    Serial.println(results.value, HEX);
    armazenavalor = (results.value);
    if (armazenavalor == 0x20DF8877) //Verifica se a tecla 1 foi acionada
    {
    valor = valor + 50;
    sinVal = (sin(valor*(3.1412/180)));
    ledVal = int(sinVal*255);
    analogWrite(led, valor); //Aumenta brilho
    delay(25);
    }
    if (armazenavalor == 0x20DF48B7) //Verifica se a tecla 2 foi acionada
    {
    valor = valor – 50;
    sinVal = (sin(valor*(3.1412/180)));
    ledVal = int(sinVal*255);
    analogWrite(led, ledVal); //Diminui brilho
    delay(25);
    }
    irrecv.resume(); //Le o próximo valor
    }
    }

  4. Manoel - 20 de maio de 2016

    Como faria para controlar um motor de passo (acionado junto ao tb6560) por pwm, sendo que o sinal de referencia é um encoder?

  5. Tiago Viana - 30 de janeiro de 2016

    Olá obrigado por nos ajudar sempre, como faria se fosse fazer este controle, mas, com uma fita de LED por exemplo, pois, ai a corrente seria maior que o pino do Arduino suporta.
    Estou querendo fazer isso no meu aquário como se fosse o amanhecer e o anoitecer.

  6. Rafael - 12 de setembro de 2015

    Muito bem explicado!
    Me ajudou muito num projeto aqui..
    Obrigado!

  7. Celso - 9 de fevereiro de 2015

    Gostei, simples, bem explicado e funcional!

Deixe uma resposta