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.
Olá, estou fazendo um led acender com palmas (projeto residencial de iluminação), se eu adicionar essa programação na que já tenho, consigo obter os dois resultados ( led acendendo por palmas) e (intensidade regulada)? O que vc sugere?
Olá Mariana.
A lógica para ajuste do brilho pode ser mantida. O que precisa ser adicionado é a leitura do sensor de palma, que quando for detectado a mudança, irá alterar o estado do LED entre ligado e desligado.
No caso, palmas para apagar = 0 volts no LED e palmas para ligar = manter a leitura original do código.
Att.
Vitor Mattos.
Suporte Técnico MakerHero.
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