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:
Código.:
// Projeto MakerHero - 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.
gostaria de saber se é possivel fazer isso com uma lampada de led 220v?
Olá Guilherme,
Não é possível :/
Abraço!
Rosana – Equipe MakerHero
Boa tarde, não entendi em relação ao 255.. por que ele é o valor maximo?
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 MakerHero
tenho um led rgb de dois terminais, como seria a programaçao para ele mudar a cor?
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 MakerHero
Como faço para utilizar em duas portas? No caso portas 11 e 10!
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
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?
Olá João!
Dá uma olhadinha nesse tutorial aqui:
https://www.makerhero.com/blog/fita-de-leds-por-wifi-usando-esp8266/
Ele faz uma coisa bem parecida, pode te ajudar.
Abraços!
André – Equipe MakerHero
Olá João!
Dá uma olhadinha nesse tutorial aqui:
https://www.makerhero.com/blog/fita-de-leds-por-wifi-usando-esp8266/
Ele faz uma coisa bem parecida, pode te ajudar.
Abraços!
André – Equipe MakerHero
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
}
}
#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;
}
}
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 MakerHero
Como faria para controlar um motor de passo (acionado junto ao tb6560) por pwm, sendo que o sinal de referencia é um encoder?
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.
Bom dia Tiago,
São leds endereçáveis ? Você pode usar esse post como base: http://www.makerhero.com/blog/pisca-pisca-com-arduino/
Abraço!
Adilson – Equipe MakerHero
Muito bem explicado!
Me ajudou muito num projeto aqui..
Obrigado!
Valeu Rafael! Abraço.
Equipe MakerHero
Gostei, simples, bem explicado e funcional!
Valeu Celso !
Abraço.
Adilson – Equipe MakerHero