Ajustando o Brilho de um LED por PWM 21

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.

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.

Gostou de aprender a ajustar o brilho de um LED por PWM? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

21 Comentários

  1. gostaria de saber se é possivel fazer isso com uma lampada de led 220v?

    1. Olá Guilherme,

      Não é possível :/

      Abraço!
      Rosana – Equipe FilipeFlop

  2. Boa tarde, não entendi em relação ao 255.. por que ele é o valor maximo?

     

    1. Olá Felipe!

      Os valores das variáveis na memória é dada por bits, e cada bit pode ser 0 ou 1. Então dependendo no número de bits diz qual o valor máximo que se pode ter alguma variável.

      1 bit = 0 a 1
      2 bits = 0 a 3
      3 bits = 0 a 7
      4 bits = 0 a 15
      5 bits = 0 a 31
      6 bits = 0 a 63
      7 bits = 0 a 127
      8 bits = 0 a 255

      No fim das contas, o valor máximo da variável vai ser igual a 2 elevado ao numero de bits.

      Abraços!

      André – Equipe FILIPEFLOP

  3. tenho um led rgb de dois terminais, como seria a programaçao para ele mudar a cor?

    1. Olá Jardel!

      Geralmente os LEDs RGB têm 4 pinos: um para cada cor e um para a alimentação.

      Acredito que no de 2 pinos você liga a alimentação e espera ele trocar a cor com o tempo.

      Abraços!

      André – Equipe FILIPEFLOP

  4. Como faço para utilizar em duas portas? No caso portas 11 e 10!

  5. 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

  6. 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?

    1. Olá João!

      Dá uma olhadinha nesse tutorial aqui:

      https://www.filipeflop.com/blog/fita-de-leds-por-wifi-usando-esp8266/

      Ele faz uma coisa bem parecida, pode te ajudar.

      Abraços!

      André – Equipe FILIPEFLOP

    2. Olá João!

      Dá uma olhadinha nesse tutorial aqui:

      https://www.filipeflop.com/blog/fita-de-leds-por-wifi-usando-esp8266/

      Ele faz uma coisa bem parecida, pode te ajudar.

      Abraços!

      André – Equipe FILIPEFLOP

  7. 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
    }
    }

    1. #include
      #define led1 13
      #define led2 10
      #define pinIr 8
      #define gndIr 9
      #define vccIr 10

      //mapeamento teclas do controle
      #define UM 0XFFE11E //codigo da tecla 1
      #define DOIS 0XFF619E //codigo da tecla 2
      #define REPET 0XFFFFFFFF //codigo de repetição (tecla mantida pressionada)

      //variaveis
      bool ledState = 0, controleState = 0;
      byte brilho = 0;
      long delayAtraso = 0, delayControle = 0;

      IRrecv Receiver(pinIr);
      decode_results decod, memo;

      void setup() {
      Serial.begin(9600);
      pinMode(led1, OUTPUT);
      pinMode(led2, OUTPUT);
      pinMode (vccIr,OUTPUT);
      pinMode (gndIr,OUTPUT);
      digitalWrite(vccIr,1);
      digitalWrite(gndIr,0);
      digitalWrite(led1, 0);
      digitalWrite(led2, 0);
      Receiver.enableIRIn();
      }

      void loop() {
      controleIR();
      if (millis() – delayAtraso > 500) {
      delayAtraso = millis();
      if (controleState) {
      switch (memo.value) {
      case UM:
      if (brilho 0)brilho–;
      break;
      }
      }
      }
      digitalWrite(led1, ledState);
      analogWrite(led2, brilho);
      }

      void controleIR() //rotina de recepção
      {
      if (Receiver.decode(&decod))
      {
      if (decod.value != REPET)
      {
      memo.value = decod.value;
      controleState = 1;
      ledState = 1;
      delayControle = millis();
      Serial.println(memo.value,HEX);
      }
      else if (decod.value == REPET && controleState)
      {
      delayControle = millis();
      }
      Receiver.resume();
      }
      if ((millis() – delayControle) > 150 && controleState) //tempo deve ser maio que o tempo de repetição do controle;
      {
      controleState = 0;
      ledState = 0;
      }
      }

    2. Olá Rafael!

      Você tentou ler os dados das teclas separadamente?

      Quando tentamos misturar várias coisas ajuda se você tentar fazer elas funcionarem separadamente.

      Abraços!

      André – Equipe FILIPEFLOP

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

  9. 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.

    1. Bom dia Tiago,

      São leds endereçáveis ? Você pode usar esse post como base: http://blog.filipeflop.com/arduino/pisca-pisca-com-arduino.html

      Abraço!

      Adilson – Equipe FILIPEFLOP

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

    1. Valeu Rafael! Abraço.

      Equipe FILIPEFLOP

  11. Gostei, simples, bem explicado e funcional!

    1. Valeu Celso !

      Abraço.

      Adilson – Equipe FILIPEFLOP