Ajustando o Brilho de um LED por PWM 19

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.

 Gostou? Deixe seu comentário logo abaixo. Em caso de dúvidas, caso queira trocar uma ideia, ou até mesmo dividir seu projeto, acesse nosso Fórum!

Posts Relacionados

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

19 Comentários

  1. Gostei, simples, bem explicado e funcional!

    1. Valeu Celso !

      Abraço.

      Adilson – Equipe FILIPEFLOP

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

    1. Valeu Rafael! Abraço.

      Equipe FILIPEFLOP

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

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

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

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

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

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

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