Dimmer com Arduino usando portas analógicas
Que tal um dimmer com Arduino para entender como funciona a variação de “dados” na porta analógica dessa placa?
O nosso circuito usa um potenciômetro, ligado à entrada analógica 5, para controlar a luminosidade de um led ligado na porta digital 10. Conforme giramos o potenciômetro no sentido horário, a intensidade de iluminação do led vai se aproximando do ponto máximo.
Circuito dimmer com Arduino
Nesse projeto, vamos usar o seguinte material:
- Potenciometro de 10 K
- Led
- Resistor de 330 ohms
Monte então o seguinte circuito:
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 da função map é 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.
O “truque” do PWM é ligar e desligar essa porta rapidamente, simulando uma tensão 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).
// 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:
Gostou? Confira outros projetos com Arduino aqui mesmo no Arduino e Cia!
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
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 !
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
Boa tarde !
Legal, se puder compartilhar as informações aqui no blog, agradeço !
Abraço.
Eae, blz?
Queria saber se seria possivel eu fazer isso sem utilizar a função map.
vlww abraço.
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 !
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 !
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 !
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 ?
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 !
esqueci de agradecer, esse seu código me ajudou bastante num projeto que eu fiz, muito Obrigado !
Bom dia David !
Eu que agradeço a visita. Visite-nos sempre que puder. Abraços !
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?
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 !
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 !
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
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.
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!
Tem como eu ajustar o brilho do led para um valor fixo que eu escolher? como por exemplo 900 de luminosidade?
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!
Tem como fazer um sensor usando o ldr para medir a luminosidade, e adicionar um PID ao código?
Boa Tarde .. gostaria de uma ajuda, como faço pra controlar a tensão usando o potenciometro, onde que essa tensão tem que permanecer constante, ou seja, invariável ?
Boa tarde, estou construindo um temporizador cíclico variável com arduino nano, com dois potenciômetro, um para controlar o tempo ligado e outro para controlar o tempo desligado.
Não tenho conhecimento em programação c, mas conheço um pouco de programação ladder, preciso colocar os petenciometros para funcionar nas entradas analógicas. Pode me ajudar?
Estou usando o LDMicro.
Grato.
Márcio.
Eae, blz?
Queria saber se seria possivel eu fazer isso sem o pontenciometro e sim automatico?
colocando o valor do pwm e como ficaria?
aguardo resposta.
obrigado
Olá.
Seria possível este dimmer com dois arduino?
Um arduino com o potenciômetro, e o led no outro arduino.
Onde os dois arduinos seriam interligados pela porta serial, 0rx e 1tx.
Como ficaria o código nos dois arduinos?
Desde já, obrigado.
Boa tarde, como faço o mesmo circuito, com dois leds, só que enquanto um acende o outro apaga? Obrigado!