11 julho 2013

Dimmer - Usando portas analógicas para controlar a luminosidade de um led

Que tal um dimmer para entender como funciona a variação de "dados" na porta analógica ?

O nosso circuito usa um potenciômetro, ligado à entrada analógica 5, para controlar a luminosidade de um led ligado à porta 10. Conforme giramos o potenciômetro no sentido horário, a intensidade de iluminação do led vai se aproximando do ponto máximo.

Vamos usar o seguinte material....

  • 1 potenciometro de 10 K 
  • 1 led
  • 1 resistor de 330 ohms

...montando o seguinte circuito :

Circuito dimmer Arduino
O programa usa uma função chamada map (http://arduino.cc/en/Reference/Map), que converte o valor lido da entrada analógica (entre 0 e 1023), para um valor entre 0 e 255 (8 bits), que será utilizado para ajustar a luminosidade do led. A sintaxe dessa função é a seguinte :

map(valor, de_menor_valor, de_maior_valor, para_menor_valor, para_maior_valor)

No nosso caso então, temos :

luminosidade = map(valorpot, 0, 1023, 0, 255);

onde valorpot é o valor lido do potenciometro, entre 0 e 1023, que será convertido para um valor entre 0 e 255, que por sua vez será atribuído à variável luminosidade. Perceba que estamos utilizando a porta 10, digital, como uma porta analógica, usando a função analogWrite. Como o Arduino faz isso ?

Repare na foto abaixo que no Arduino os pinos 3, 5, 6, 9, 10 e 11 são PWM (Pulse Width Modulation - Modulação por Largura de Pulso), o que permite que eles sejam usados de forma analógica.

Detalhes portas PWM Arduino

O "truque" do PWM é ligar e desligar essa porta rapidamente, simulando uma voltagem entre 0 e 5 volts. O tempo que a porta permanece ligada ou desligada determina o valor da saída analógica, assim, se você quiser 50% da luminosidade, a porta ficaria 50% do tempo em modo ON (ligada), e 50% em modo OFF (desligada). Essa variação é feita de forma tão rápida que não é percebida pelo olho humano.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Projeto : Controle de luminosidade de led com potenciometro
// Autor : Arduino e Cia

int pinoled = 10;  //Pino ligado ao anodo do led
int pinopot = 5;   //Pino ligado ao pino central do potenciometro
int valorpot = 0;  //Armazena valor lido do potenciometro, entre 0 e 1023

float luminosidade = 0; //Valor de luminosidade do led

void setup()
{
   Serial.begin(9600);        //Inicializa a serial
   pinMode(pinoled, OUTPUT);  //Define o pino do led como saída
   pinMode(pinopot, INPUT);   //Define o pino do potenciometro como entrada
}

void loop()
{
  // Le o valor - analogico - do pino do potenciometro
  valorpot = analogRead(pinopot);

  //Converte e atribui para a variavel "luminosidade" o
  // valor lido do potenciometro
  luminosidade = map(valorpot, 0, 1023, 0, 255);  

  Serial.print("Valor lido do potenciometro : "); 

  //Mostra o valor lido do potenciometro no monitor serial
  Serial.print(valorpot);   
  Serial.print(" = Luminosidade : ");

  //Mostra o valor da luminosidade no monitor serial
  Serial.println(luminosidade);  

  //Envia sinal analogico para a saída do led, com luminosidade variavel
  analogWrite(pinoled, luminosidade);  
}

Para facilitar a visualização de como as portas analógicas se comportam, o programa mostra no monitor serial não só o valor lido do potenciometro, como também o valor da luminosidade após a utilização da função map que expliquei anteriormente :

Dados dimmer Arduino monitor serial

21 comentários:

  1. Olá amigo .. excelente .. poderia me tirar uma duvida..

    eu comprei um modulo dimmer > http://seriallink.com.br/loja/product_info.php?products_id=330

    tem como usar esse código.. sem usar o potenciômetro , queria controlar via web, nao tenho o shield ethernet , estou usando meu pc como webserve .

    Seria possível , poderia me orientar ? obrigado

    ResponderExcluir
    Respostas
    1. Bom dia !

      Tem sim, apenas você terá que elaborar um programa que conecte o seu webserver à saída serial do computador. No lugar do potenciômetro, você pode enviar os valores diretamente para a saída do módulo, utilizando botão deslizante ou então algum tipo de entrada de dados.

      Interessante o seu projeto, se quiser compartilhar aqui depois, agradeço.

      Abraço !

      Excluir
  2. Ei.. amigo... meu conhecimento muito limitado .. em questão de programação essas coisas.. sou novo na area,,, Em fim o que eu queria erra isso mesmo um botao deslizante para controlar .. consigo apagar e acender a luz com um código que achei na net .. consegui entender um pouco .. não a ponto de conseguir criar um botão desses ai de deslizar hehehe..

    Mais pode deixar conforme , for conseguindo vou passar aqui minhas ideias .rsrsrs ..
    abraços !!1

    ResponderExcluir
    Respostas
    1. Boa tarde !

      Legal, se puder compartilhar as informações aqui no blog, agradeço !

      Abraço.

      Excluir
  3. Eae, blz?
    Queria saber se seria possivel eu fazer isso sem utilizar a função map.

    vlww abraço.

    ResponderExcluir
    Respostas
    1. Bom dia !

      Sim, o que pode ser feito é trocar a função map pelo respectivo cálculo. Alterei a variável luminosidade para long, e fiz o cálculo sem o map.

      O programa ficou assim :

      //Projeto : Controle de luminosidade de led com potenciometro
      //Autor : Arduino e Cia

      int pinoled = 10; //Pino ligado ao anodo do led
      int pinopot = 5; //Pino ligado ao pino central do potenciometro
      long valorpot = 0; //Armazena valor lido do potenciometro, entre 0 e 1023
      long luminosidade = 0; //Valor de luminosidade do led

      void setup()
      {
      Serial.begin(9600); //Inicializa a serial
      pinMode(pinoled, OUTPUT); //Define o pino do led como saída
      pinMode(pinopot, INPUT); //Define o pino do potenciometro como entrada
      }

      void loop()
      {
      valorpot = analogRead(pinopot); //Le o valor - analogico - do pino do potenciometro
      // luminosidade = map(valorpot, 0, 1023, 0, 255); //Converte e atribui para a variavel "luminosidade" o valor lido do potenciometro
      luminosidade = (valorpot-0)*(255-0)/(1023-0)+0;
      Serial.print("Valor lido do potenciometro : ");
      Serial.print(valorpot); //Mostra o valor lido do potenciometro no monitor serial
      Serial.print(" = Luminosidade : ");
      Serial.println(luminosidade); //Mostra o valor da luminosidade no monitor serial
      analogWrite(pinoled, luminosidade); //Envia sinal analogico para a saída do led, com luminosidade variavel
      }

      Abraço !

      Excluir
  4. Olá,

    Tem como eu criar uma função para simular as variações do potenciômetro?
    Não tenho intimidade com a linguagem, por isso minha dúvida !

    vlw !

    ResponderExcluir
    Respostas
    1. Bom dia Dario,

      Tem sim. Você pode atribuir o valor que quiser à variável valorpot, e assim ajustar a luminosidade.

      Tente usar o mesmo esquema desse post, substituindo o código do programa (a parte do loop), por essa daqui :

      void loop()
      {
      valorpot = analogRead(pinopot); //Le o valor - analogico - do pino do potenciometro
      for (int i = 0; i<1024; i = i+50) //Conta i de 0 à 1024 com incrementos de 50
      {
      valorpot =i; //Atribui o valor de i à variável valorpot
      luminosidade = map(valorpot, 0, 1023, 0, 255); //Converte e atribui para a variavel "luminosidade" o valor lido do potenciometro
      Serial.print("Valor lido do potenciometro : ");
      Serial.print(valorpot); //Mostra o valor lido do potenciometro no monitor serial
      Serial.print(" = Luminosidade : ");
      Serial.println(luminosidade); //Mostra o valor da luminosidade no monitor serial
      analogWrite(pinoled, luminosidade); //Envia sinal analogico para a saída do led, com luminosidade variavel
      }
      valorpot = 0;
      }

      Eu deixei as funções do potenciômetro, mas coloquei um IF com o i variando de 0 a 1024 com incrementos de 50 à cada loop, e atribuindo o valor de i à variável valorpot, como comentei acima.

      Espero que ajude. Abraço !

      Excluir
  5. Boa noite! eu consigo com o potenciômetro, ligar e desligar um LED
    sendo que eu queria era ver a intensidade do brilho do LED, mostrado na tela de um LCD Nokia 5110.
    existe algum jeito de fazer essa programação no sketch ?

    ResponderExcluir
    Respostas
    1. Boa noite David,

      Consegue sim. Você pode colocar uma função para testar o valor e, por exemplo, se o valor da entrada analógica estiver abaixo de 512 você desliga o led, e acima disso ele liga.

      Como você está pretendendo colocar a intensidade do led no LCD Nokia ? Em números mesmo ? Se for só texto, eu tenho alguns artigos aqui no site que trabalham com esse LCD.

      Abraço !

      Excluir
    2. esqueci de agradecer, esse seu código me ajudou bastante num projeto que eu fiz, muito Obrigado !

      Excluir
    3. Bom dia David !

      Eu que agradeço a visita. Visite-nos sempre que puder. Abraços !

      Excluir
  6. Oi amigo,boa tarde!
    Eu ainda estou aprendendo a programar.
    Se o meu programa tivesse uma chave que tivesse que apertar 10 vezes, onde cada vez que eu apertar a chave a luminosidade do led aumentasse.. EX: Eu vou apertar a chave 10 vezes...sendo que na décima vez que eu apertar a chave, o led vai ter luminosidade máxima. A luminosidade seria crescente, na última vez que eu apertar a chave.. o led vai ter luminosidade máxima. Como ficaria essa programação?

    ResponderExcluir
    Respostas
    1. OI Eval,

      Dê uma olhada nesse artigo, onde eu uso um push-button para acionar um relé e um led. Você pode usar o mesmo princípio para incrementar um contador e controlar a luminosidade.

      Abraço !

      Excluir
  7. Boa noite pessoal, preciso montar um circuito com 1 potenciometro e duas chaves touch, e um motor. Gostaria que quando apertasse a chave 1, o motor gira em um sentido e quando pressionado a chave 2, giraria no sentido inverso.Quando não pressionadas, o motor fique parado.Ambas as saidas do PWM tem que alternar e ser ajustadas pelo unico potenciometro. Desde já agradeço !

    ResponderExcluir
  8. Microcontroladores -> Faça o código de um semáforo de transito

    Faça um dimmer utilizando Arduíno com um LED e um potenciômetro

    ResponderExcluir
  9. Ola caros, sou leigo no assunto, tenho um ambiente em que precisa ser entregue 300lux, porem a lampada led so deve fazer leitura da luz ambiente e ascender somente o necessario para dar os 300lux, ou seja vai variar ao longo do dia. O que precisaria ser feito no circuito pra conseguir isso.

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Bom, você vai precisar de uma lâmpada de led que possa ser "dimmerizada". Não são todas que aceitam isso. E para medir o lux, eu sugiro o sensor de luminosidade que eu mostro neste post: http://www.arduinoecia.com.br/2016/01/lux-sensor-tsl2561-medidor-luz-arduino.html

      Abraço!

      Excluir
  10. Tem como eu ajustar o brilho do led para um valor fixo que eu escolher? como por exemplo 900 de luminosidade?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Tem sim, coloque esse comando na linha 25 (que vai "anular" o valor da variável da linha 24):
      luminosidade = 900;

      Abraço!

      Excluir
  11. Tem como fazer um sensor usando o ldr para medir a luminosidade, e adicionar um PID ao código?

    ResponderExcluir