LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: anaes em 24 de Novembro de 2009, 15:30
-
Boas ,
Tou a fazer uma led "strip" com leds ligados em paralelo e ligados directamente ao arduino.
E tenho na board um ldr com uma resistencia e este ligado a porta analogica 0 do arduino.
A questão e a seguinte:
Dá para fazer um fade dos leds a medida que a iluminação vai sendo mais fraca? E aumentar conforme ela tambem aumenta?
Peço desculpa se a pergunta é basica mas os meus skills no java são miuto poucos.
O código que tenho agora só liga e desliga :
pinMode(12,OUTPUT);//LED STRIP
void loop() {
val=analogRead(0); //led strip
if(val< 850){
digitalWrite(12,HIGH);
delay(2000);
}
if(val> 850){
digitalWrite(12,LOW);
delay(2000);
}
}
Desde já obrigado , e fico contente com o suporte que tenho recebido no luso robotica.
-
Uma pergunta de algibeira eu vou fazer...
Será que não dá para ler o valor do ADC, e mandar esse valor invertido para o PWM que alimenta os LEDs ?
Assim o fade é mais linear. Pode aplicar-se um algoritmo para a variação não ser tão brusca.
Dá para fazer isso no Arduino? presumo que sim!, não passa de um microcontrolador :)
-
Uma pergunta de algibeira eu vou fazer...
Será que não dá para ler o valor do ADC, e mandar esse valor invertido para o PWM que alimenta os LEDs ?
Assim o fade é mais linear. Pode aplicar-se um algoritmo para a variação não ser tão brusca.
Dá para fazer isso no Arduino? presumo que sim!, não passa de um microcontrolador :)
:o não percebi nada do que disseste! "ADC"? "PMW"?! Sou mesmo muito noob! Comecei nisto há cerca de 2 semanas e não tenho bases de electronica nenhumas!
Desculpa! Não basta fazer um algoritmo para incrementar o valor analogico gradualmente?! (é que tb não sei mt de java)
Dão cadeiras destas a designers dps dá nisto"! ^^
bgd pela rapidez de resposta.
-
:) sem stress
ADC = Analogue to Digital Converter
PWM = Pulse Width Modulation (que pode ser usado para fazer DAC = Digital to Analogue Converter)
O teu LDR está ligado a um pino ADC, que te converte um sinal real, num valor digital.
Esse valor digital é então passado, depois de invertido, para um PWM, que vai fazer variar o brilho consoante o valor do LDR.
Segundo o que entendi, queres variar inversamente os LEDs, consoante a luz no LDR ?
Ou seja, menos luz no LDR, mais luz nos LEDs?
fui explicito? :-\
-
Sim agora ja cheguei lá...
Mas entao vou ter de ligar a uma pwm... prai a 11, e so dps fazer o algoritmo que ainda não percebi bem como fazer!
Mas o pretendido e realmente fazer a inversão ... menos luz ambiente mais luz nos leds.
Tenho de ligar a uma pwm portanto?
-
Sim, exactamente.
Mas quantos LEDs tens? e a alimentação dos mesmo, como é?
Há que ter isto em conta.
Dá requisitos completos, sff.
-
Para controlar uma saída PWM usas a função "analogWrite" (vê os detalhes na documentação do Arduino).
Essa função aceita um valor entre 0 e 255, em que 0 vai manter o teu LED apagado e 255 deixa-o aceso com o maior brilho possivel. O teu algoritmo agora é converter o valor de 0 a 1023 que lês com o analogRead para um valor entre 0 e 255 para escrever com o analogWrite, tendo em conta o comportamento que desejas para o LED.
-
ok vou tentar
:)
-
Tens um exemplo de fazer o efeito "fade" em Examples > Analog > Fading, no software do Arduino.
Só um reparo... Tens falado que não percebes nada de JAVA, mas o Arduino é programado em C, não é em JAVA (JAVA é o IDE, que é o programa que abres para fazer upload do código para a placa). Não sei se me fiz entender...
-
Tens um exemplo de fazer o efeito "fade" em Examples > Analog > Fading, no software do Arduino.
Só um reparo... Tens falado que não percebes nada de JAVA, mas o Arduino é programado em C, não é em JAVA (JAVA é o IDE, que é o programa que abres para fazer upload do código para a placa). Não sei se me fiz entender...
xiii brigado vou ja micar isso ;)
-
o fade do exemplo não depende dos valores recebidos de um LDR...
int ledPin2 = 11;
void loop() {
// fade in from min to max in increments of 5 points:
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin2, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
// fade out from max to min in increments of 5 points:
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin2, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
Neste momento o fade é crescente e decrescente... alguma ideia como usar agora a porta analogica e os valores do LDR para controlar o fade?!
Desculpem as duvidas basicas! Mas já é o desespero pré-entrega! -.-"
-
Amigo, eu disse que o código fazia o efeito "fade", não disse que te fazia a papinha toda... :p
Basicamente é só uma questão de programação agora... Basta fazeres um if.
Allgoritmo:
MUD = Valor de mudança
se o valor do LDR for maior que MUD e LED = HIGH
// Código Fade Out
Ou
se o valor do LDR for menor que MUD e LED = LOW
// Código Fade In
Agora passas isso para código que o Arduino entenda. Não podes esperar que te façamos tudo, acho que é importante que sejas tu a fazer, para depois veres o fruto do teu trabalho.
-
Amigo, eu disse que o código fazia o efeito "fade", não disse que te fazia a papinha toda... :p
Basicamente é só uma questão de programação agora... Basta fazeres um if.
Allgoritmo:
MUD = Valor de mudança
se o valor do LDR for maior que MUD e LED = HIGH
// Código Fade Out
Ou
se o valor do LDR for menor que MUD e LED = LOW
// Código Fade In
Agora passas isso para código que o Arduino entenda. Não podes esperar que te façamos tudo, acho que é importante que sejas tu a fazer, para depois veres o fruto do teu trabalho.
;) eu tou a tentar , mas sem ver efeitos começa a ser complicado! Mas compreendo o teu ponto de vista.
Para os mais curiosos podem ver o broadcast do projecto : http://www.wate-r-evolution.com/AquaStatus/index.html# (http://www.wate-r-evolution.com/AquaStatus/index.html#) se virem fumo é normal!
-
int ledPin2 = 11;
int val=0;
void setup() {
val=analogRead(0);
if(val> 10){
ledPin2==HIGH;
}
else{ledPin2==LOW;}
// fade in from min to max in increments of 5 points:
if(val<800 && ledPin2==HIGH){
for(int fadeValue = val ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin2, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
}
if(val>800 && ledPin2==LOW){
// fade out from max to min in increments of 5 points:
for(int fadeValue = val ; fadeValue >= 0; fadeValue -=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin2, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
} }
seria algo tipo isto ?... ou estou a dar um tiro muito ao lado?
-
Não podes ter ledPin2==HIGH, porque no início definiste que a variável ledPin2 é do tipo Inteiro.
Está quase.. Dou-te uma dica. Usa uma variável auxiliar...
(boolean ledOn = false;)
-
int ledPin2 = 11;
int val=0;
pinMode(ledPin2, OUTPUT);
void loop() {
val=analogRead(0);
// fade in from min to max in increments of 5 points:
if(val>800){
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin2, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(20);
}
}
if(val<800){
// fade out from max to min in increments of 5 points:
for(int fadeValue = 255 ; fadeValue >= (val/4); fadeValue -=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin2, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(20);
}
}
Tenho a impressão que estou muito perto ... mas agora falta isto para de piscar! 0_0 .... alguma sugestão?
-
Só para perceber o que queres fazer: quando o valor esta acima de 800 queres que varie a intensidade do led entre 0 e 255 e depois quando o valor esta a abaixo de 800 queres que a intensidade varie entre 255 e (val/4), explica-me este val a dividir por 4, porque se o valor for 799 ele vai variar entre 255 e 200 e podes não notar diferença.
Experimenta o seguinte:
int ledPin2 = 11;
int val=0;
pinMode(ledPin2, OUTPUT);
void loop() {
// VE ISTO AQUI!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//defines aqui tu o valor e assim testas se o problema é do valor que vem do LDR,
//assim com segues eliminar um problema.
val=850;
val=750;
// fade in from min to max in increments of 5 points:
if(val>800){
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin2, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(20);
}
}
if(val<800){
// fade out from max to min in increments of 5 points:
for(int fadeValue = 255 ; fadeValue >= (val/4); fadeValue -=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin2, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(20);
}
}
}
-
humm a minha intenção era que o valor do val que é o que recebe do ldr fosse quantificado de forma inversa ao que e transmitido para os leds... isto é aumentando a entrada de luz no ldr diminui-a a potencia dos leds. O val/4 era para obter valores semelhantes ao do fadeValue. Penso a que este ponto ja nem fade será necessário! ... Basta fazer uma equivalencia!
Se calhar não e a melhor forma de fazer isto.
-
É muito fácil fazer o que tu queres. Até já tens uma função (map) que faz a tal conversão de que te falei lá atrás. Com 3 comandos fazes tudo isso, lês o LDR, convertes o valor para a saída (PWM, LED) a acendes o LED.
-
É muito fácil fazer o que tu queres. Até já tens uma função (map) que faz a tal conversão de que te falei lá atrás. Com 3 comandos fazes tudo isso, lês o LDR, convertes o valor para a saída (PWM, LED) a acendes o LED.
:-X pois acho que compliquei demais e acabei em caminhos que levavam a tudo menos o resultado desejado!
Já fiz uma simulação disso que disseste ... embora obtenha comportamentos estranhos ... vou jantar! e dps revejo o codigo!
int ledPin2 = 11;
int val=0;
void setup() {
pinMode(ledPin2, OUTPUT);
}
void loop() {
val=analogRead(0);
analogWrite(ledPin2, (val/4)); // vi algures que a dividir por quatro ajustava! (duvido)
}
Com este codigo so desliga com sombra!!!! se tapar completamente liga! estranho!
obrigado a todos pela paciencia!
-
Tás lá quase, já tens 2 dos 3 comandos. Agora só precisas de MAPear os valores lidos do LDR nos valores para acender o LED.
-
Tás lá quase, já tens 2 dos 3 comandos. Agora só precisas de MAPear os valores lidos do LDR nos valores para acender o LED.
(qd acabar o meu sofrimento vou-te partir uma perna xD ) Vou jantar primeiro haahahah cumprimentos
-
Tás lá quase, já tens 2 dos 3 comandos. Agora só precisas de MAPear os valores lidos do LDR nos valores para acender o LED.
Penso que a solução dele funciona... A divisão por 4 é a forma que uso para passar uma escala 0-1023 para 0-255.
É, pelo menos mais simples do anaes perceber, do que usar já a função map.
-
Para mapear 0-1023 para 0-255 dividir por 4 faz todo o sentido :D
A grande vantagem do map é poder mapearem-se valores de intervalos distintos onde algum deles ou ambos não começam em 0 (por exemplo mapear 0-1023 no intervalo 16-235).
:)
-
Ainda assim cm o código que tenho não esta a comportar-se como devia! ... mas agora tou no intervalo da bucha!
-
anaes, posta aí o código integral que tens... ;)
-
ta aki o codigo integral - http://wate-r-evolution.com/AquaStatus/index.html# (http://wate-r-evolution.com/AquaStatus/index.html#) - se conseguires puxar cm o poder da mente xD ! (ainda tou na buxa ) Mas só tenho aquele pedaço postei antes .
-
ta aki o codigo integral - http://wate-r-evolution.com/AquaStatus/index.html# (http://wate-r-evolution.com/AquaStatus/index.html#) - se conseguires puxar cm o poder da mente xD ! (ainda tou na buxa ) Mas só tenho aquele pedaço postei antes .
:-X :P
-
ta aki o codigo integral - http://wate-r-evolution.com/AquaStatus/index.html# (http://wate-r-evolution.com/AquaStatus/index.html#) - se conseguires puxar cm o poder da mente xD ! (ainda tou na buxa ) Mas só tenho aquele pedaço postei antes .
:-X :P
Eu hj ainda tenho umas piadas na manga amnha kd for apresentar o projecto que não funciona é que vai ser o pânico xD !
Mas pronto os leds já estão quase a funcar!
O motor para a alimentação ta td ligado...
Só falta a ligação através da net! ^^
-
Os valores lidos do LDR não devem ser lineares e o problema pode estar aqui. Faz o seguinte, imprimi o valor lido do LDR na consola e vê como este se comporta para os diferentes níveis de luz.
-
Assim não nos entendemos...
Mandaste um link para uma webcam... Se calhar é a tua, mas eu continuo sem ver o código...
-
o que eles estava a dizer era que o código estava no computador ou no Arduino e tinhas que usar o poder da mente para o teres lool e depois disse que o unico código que tinha era o que postou antes :p
-
o que eles estava a dizer era que o código estava no computador ou no Arduino e tinhas que usar o poder da mente para o teres lool e depois disse que o unico código que tinha era o que postou antes :p
isso mm =P (já sei onde deixei o tabaco) =X
-
És viciado no twitter não és? :D :D :D :D :D
-
LOL nem por isso
Vou comecar agr a ver isto !
-
Para fazer o print dos valores basta ter "Serial.begin(9600);" e dps Serial.println(val);? certo?!
é que não aparece nada! 0_0
-
LOL...podiam ter avisado que tinha de abrir a janela serial! ::)
Isto age de forma muito estranha com este codigo:
int ledPin2 = 11;
int val=0;
void setup() {
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}
void loop() {
val=analogRead(0);
analogWrite(ledPin2, (val/10));
Serial.println(val);
}
o val manda valores entre 600 e 900...!
será da minha resistencia que esta a cortar demais os valores do ldr (se é que isso é possivel!)?
A porta analogica não ta a responder... só manda zeros! =/
-
Já meti a funcionar de forma estranha! inexplicavel mesmo! Os valores variavam pouco então arranjei forma de os distanciar um bocado:
int ledPin2 = 11;
int analogPin = 1;
int val=0;
int awrite=0;
int ligado=0;
int desligado=0;
void setup() {
pinMode(ledPin2, OUTPUT);
Serial.begin(9600);
}
void loop() {
val=analogRead(analogPin);
awrite=val/4;
ligado= awrite%4;
desligado=awrite;
if (awrite>100){
analogWrite(ledPin2, desligado );
}
if (awrite<200){
analogWrite(ledPin2, ligado );
}
Serial.println(awrite);
}
Alguem me pode por isto a funcionar como deve ser?! é que ja fiz de tudo e nada!
-
Sim, alterando a resistência consegues obter um gama de valores maiores. Se tiveres um multímetro tens que ver como varia a resistencia do LDR em função da luz. Se tiveres o datasheet desse LDR coloca aqui.
Depois de ter estes valores da resistencia medidos com o multímetro coloca aqui.
-
Vejo que tens alguns "problemas" no que diz respeito ao método que usas para programar.
Se queres um conselho, habitua-te a usar a "indentação" (o espaço entre a margem esquerda e o código)... É que o código como tu puseste é muito difícil de analisar.
Vê o exemplo do código que estive a fazer:
int ledPin = 9; // Pino onde está ligado o LED
int ldrPin = 0; // Pino onde está ligado o LDR
int valLimite = 800; // Valor para ligar/desligar o LED
int valLDR = 0; // variável que vai ficar com o valor lido do LDR (0-1023)
int valNorm = 0; // variável que tem o valor do LDR normalizado (0-255)
boolean ligado = false; // variável auxiliar que vai dizer se o LED está ligado
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
// FASE 1: Lemos o valor de input do LDR e normalizamos
valLDR = analogRead(ldrPin);
valNorm = valLDR/4;
// DEBUG (opcional) : Mostramos o valor na consola
// Útil para ajustares o valLimite
Serial.print("Valor do LDR: ");
Serial.print(valLDR);
Serial.print(" (Normalizado: ");
Serial.print(valNorm);
Serial.println(")");
// FASE 2: Decidimos o que fazer consoante esse valor
if(valNorm < valLimite && ligado == false){
// Se a luz ambiente estiver mais baixa do que o limite e o LED estiver desligado
fadeIn(); // Ligamos o LED com o efeito fade
ligado = true; // "ligado" = verdadeiro, para sabermos que o LED está ligado
}else if(valNorm >= valLimite && ligado == true){
// Se a luz ambiente estiver mais alta do que o limite e o LED estiver ligado
fadeOut(); // Desligamos o LED com o efeito fade
ligado = false; // "ligado" = falso, para sabermos que o LED está desligado
}
}
void fadeIn()
{
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5)
{
analogWrite(ledPin, fadeValue);
delay(30);
}
}
void fadeOut()
{
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5)
{
analogWrite(ledPin, fadeValue);
delay(30);
}
}
Não é muito mais fácil analisar o código (mesmo sem as cores do IDE)?
Bom, não sou apologista de fazer a papinha toda, mas testa lá o código e diz qualquer coisa...
Deixo-te um desafio: tenta fazer com que o código não seja bloqueante. Isto é, quando por exemplo, passas a mão por cima do LDR e tiras logo a seguir, o que vai acontecer é que no instante em que o LDR detecta a "sombra", vai correr a rotina de fadeIn() até ao fim e quando acabar vai voltar a ler o valor do LDR e como já não tens lá a mão, vai correr o fadeOut()...
O desafio que te proponho é alterares o código para que uma situação destas não aconteça... Para que o valor que sai para o LED apenas aumente quando há "sombra" e quando tiras a mão, ele desça até 0.
-
É por isto que eu não gosto de fazer o trabalho todo... Aparecem aqui para fazermos o trabalho por eles e depois nunca mais dizem nada... Nem se funcionou, se não funcionou... >:(
-
Calma microbyte, pode não ter podido vir ao fórum...
-
ei pessoal... calma aí....
não podemos ficar chateados, por a nossa ajuda não ter feedback!
é mesmo assim, há pessoas assim. Temos que compreender e aceitar.
continuemos a ajudar, de certeza que não cai em saco rôto.
-
LooL...
O meu smile deu a entender que estava muito agressivo... xD
Não é isso... :D Eu gosto de ajudar, e vou continuar a ajudar, mas este tipo de atitudes não me incentivam a isso, porque ainda demorei a fazer o que ali está (principalmente a comentar).
-
Peço imensa desculpa se não passei aqui antes!
Mas tenho mais trabalhos em mãos e não tive oportunidade.
o código que funcionou foi dos últimos que postei, em que quando a iluminação da sala estava ligada a led stripe desligava e o contrario tb acontecia.
Embora ache que o código que tenho não está "decente" já deu para desenrascar!
Mais uma vez obrigado a todos pela força.
(o meu próximo desafio vai ser programar para um "ecrã" multi-touch DIY usando o processing ...aiai!)
Quanto ao codigo do microbite... tenho imensa pena não ter testado mas já entreguei o arduino à faculdade... o tempo esgotou! =|
Obrigado pelo esforço!
cumprimentos