collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Alternar leds fazendo um fade entre eles  (Lida 12020 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Alternar leds fazendo um fade entre eles
« Responder #30 em: 28 de Outubro de 2010, 00:08 »
Compilar já é meio caminho andado...

Agora desafio-te a tentares correr o código sequencialmente passo-a-passo (na tua cabeça, claro, ou num papel) para perceberes o que está a acontecer...

HINT: Tu queres fazer update aos valores apenas quando passaram 500ms desde o último update, e não em todos os ciclos loop.

Offline joaobernardino

  • Mini Robot
  • *
  • Mensagens: 59
Re: Alternar leds fazendo um fade entre eles
« Responder #31 em: 28 de Outubro de 2010, 00:11 »
Para isso tenho isto:

if(currentMillis - previousMillis > 500)  // Se quiseres fazer o update a cada 500ms
  previousMillis = currentMillis;  // salvas o novo valor de tempo

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Alternar leds fazendo um fade entre eles
« Responder #32 em: 28 de Outubro de 2010, 00:12 »
Estás muito perto...  :)

O problema é que não tens o switch() dependente desse IF(), ou seja, o teu switch vai acontecer, quer a condição seja verdadeira ou falta.

Offline joaobernardino

  • Mini Robot
  • *
  • Mensagens: 59
Re: Alternar leds fazendo um fade entre eles
« Responder #33 em: 28 de Outubro de 2010, 00:17 »
Já está. Mas continua a não executar nada como pretendido

Código: [Seleccione]
void loop(){

unsigned long currentMillis;

currentMillis = millis();
 
if(currentMillis - previousMillis > 500) { // Se quiseres fazer o update a cada 500ms
  previousMillis = currentMillis;  // salvas o novo valor de tempo

 
  switch(state){
    case 1:
 
    {
      if(redVal < 255){ redVal++; }// se ainda nao chegámos aos 255, aumenta o valor de redVal
      else state = 2; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
     
    }
    case 2:
   
    {if(greenVal < 255){ greenVal++; }// se ainda nao chegámos aos 255, aumenta o valor de greenVal
      else state = 3; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
   
    }
    case 3:

    {if(blueVal < 255) {blueVal++;} // se ainda nao chegámos aos 255, aumenta o valor de greenVal
      else state = 4; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
     
    }
    case 4:

    {if(greenVal < 255) {greenVal++; redVal++;}// se ainda nao chegámos aos 255, aumenta o valor de greenVal
    else state = 5; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
   
    }
    case 5:

    {if(greenVal < 255) {greenVal++; blueVal++;}// se ainda nao chegámos aos 255, aumenta o valor de greenVal
      else state = 6; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
   
    }
    case 6:

    {if(redVal < 255) {redVal++; blueVal++;}// se ainda nao chegámos aos 255, aumenta o valor de greenVal
      else state = 7; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
     
    }
       
  case 7:
 
    {
      if(redVal < 255){redVal++;blueVal++; greenVal++;}
      else state = 1;
     
    }
  }
}
  analogWrite(redPin, redVal); // Escreve o valor do PWM do led vermelho
  analogWrite(greenPin, greenVal); // Escreve o valor do PWM do led verde
  analogWrite(bluePin, blueVal); // Escreve o valor do PWM do led azul
}

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Alternar leds fazendo um fade entre eles
« Responder #34 em: 28 de Outubro de 2010, 00:20 »
Muito bem...

Agora é uma questão de codificar "o pretendido". :)

Se queres que o vermelho vá de 0 a 255 e de seguida de 255 a 0, tens de codificar isso.
Eu só te vejo a incrementar o valor das variáveis. Não há nenhum sítio onde tu decrementes os valores.

Até tenho medo só de pensar na confusão de valores que estás a passar ao analogWrite() :P Mas não te preocupes com isso, pensa só no que te disse.

Offline Cynary

  • Mini Robot
  • *
  • Mensagens: 182
Re: Alternar leds fazendo um fade entre eles
« Responder #35 em: 28 de Outubro de 2010, 00:21 »
Gostaria de ajudar, no entanto, é muito código para ler xD e o teu objectivo está um pouco confuso :S
Consegues especificar melhor o que pretendes fazer?
Pelo que percebi do vídeo, queres variar a cor de um LED RGB, de acordo com a posição do toque no touchpad, correcto?
Nesse caso, não me preocuparia com o fade, mas tiraria o valor do x,y,z do touchpad, e usaria esses valores para o analogWrite, de forma a mudar a cor, e o fade acontece com o próprio movimento.
Para fazer isto em sincronia com o enviar um sinal midi, usaria interrupções com os timers, que tratariam do LED, enquanto o código principal trataria do sinal midi.
Não uso as bibliotecas do arduino para programar, mas aqui tens um exemplo de uso de interrupções, com a biblioteca MsTimer2:
http://lusorobotica.com/index.php/topic,527.0.html

Offline joaobernardino

  • Mini Robot
  • *
  • Mensagens: 59
Re: Alternar leds fazendo um fade entre eles
« Responder #36 em: 28 de Outubro de 2010, 00:26 »
microbyte

Como codifico isso dá-me só um exemplo eu depois faço no resto.

Cynary

Obrigado pela atenção. Amanhã ou depois quando começar o código com o touchpad falo consigo, obrigado mais uma vez

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Alternar leds fazendo um fade entre eles
« Responder #37 em: 28 de Outubro de 2010, 08:40 »
Para aumentar um LED, tens algo como:
redVal++;

Em que mudas de estado, quando chegas a 255.
Se queres decrementar no estado seguinte, tens de ter algo como
redVal--;
E alterar a condição de paragem para quando chegas a 0.

Tens de saltar de um estado para outro.
Assim, ele vai até 255, depois muda de estado e desce até 0.

Offline joaobernardino

  • Mini Robot
  • *
  • Mensagens: 59
Re: Alternar leds fazendo um fade entre eles
« Responder #38 em: 28 de Outubro de 2010, 11:52 »
Tenho estado a trabalhar no que disses-te mas não funciona :S

Offline joaobernardino

  • Mini Robot
  • *
  • Mensagens: 59
Re: Alternar leds fazendo um fade entre eles
« Responder #39 em: 28 de Outubro de 2010, 11:55 »
Código: [Seleccione]
#define redPin 5
#define greenPin 6
#define bluePin 9

unsigned long previousMillis = millis();
int redVal = 0;
int greenVal = 0;
int blueVal = 0;
int state = 1;

void setup(){
Serial.begin(9600);
  }

void loop(){

unsigned long currentMillis;

currentMillis = millis();
 
if(currentMillis - previousMillis > 500) { // Se quiseres fazer o update a cada 500ms
  previousMillis = currentMillis;  // salvas o novo valor de tempo

 
  switch(state){
    case 1:
 
   
      if(redVal < 255){ redVal++; }// se ainda nao chegámos aos 255, aumenta o valor de redVal
      else state = 2; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
     break;
   
    case 2:
   
    if(redVal == 255){ redVal--; }
    if(redVal == 0){ redVal = 0; }
    if(redVal < 20){ greenVal++; }
    if(greenVal == 250){greenVal--; }// se ainda nao chegámos aos 255, aumenta o valor de greenVal
      else state = 3; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
   break;
   
    case 3:

    if(blueVal < 255) {blueVal++;} // se ainda nao chegámos aos 255, aumenta o valor de greenVal
      else state = 4; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
      break;
     
    case 4:

    if(greenVal < 255) {greenVal++; redVal++;}// se ainda nao chegámos aos 255, aumenta o valor de greenVal
    else state = 5; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
   break;
   
    case 5:

    if(greenVal < 255) {greenVal++; blueVal++;}// se ainda nao chegámos aos 255, aumenta o valor de greenVal
      else state = 6; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
   break;
   
    case 6:

    if(redVal < 255) {redVal++; blueVal++;}// se ainda nao chegámos aos 255, aumenta o valor de greenVal
      else state = 7; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
     break;
       
  case 7:
 
    if(redVal < 255){redVal++;blueVal++; greenVal++;}
      else state = 1;
     break;
   
  }
}
  analogWrite(redPin, redVal); // Escreve o valor do PWM do led vermelho
  analogWrite(greenPin, greenVal); // Escreve o valor do PWM do led verde
  analogWrite(bluePin, blueVal); // Escreve o valor do PWM do led azul
  Serial.print("vermelho");
  Serial.print(redVal);
  Serial.print("/t verde");
  Serial.print(greenVal);
  Serial.print("/t azul");
  Serial.print(blueVal);
}

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Alternar leds fazendo um fade entre eles
« Responder #40 em: 28 de Outubro de 2010, 12:01 »
Não estás a perceber o fluxo de execução do programa.
Tenta imaginar (ou faz um desenho) do fluxo de execução e de como as variáveis vão sendo alteradas ao longo de cada iteração.

Offline joaobernardino

  • Mini Robot
  • *
  • Mensagens: 59
Re: Alternar leds fazendo um fade entre eles
« Responder #41 em: 28 de Outubro de 2010, 12:17 »
Já está :) Muito Obrigado

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Alternar leds fazendo um fade entre eles
« Responder #42 em: 28 de Outubro de 2010, 13:56 »
Só falta postares aqui para outros que venham com problemas semelhantes...  ;)

Offline joaobernardino

  • Mini Robot
  • *
  • Mensagens: 59
Re: Alternar leds fazendo um fade entre eles
« Responder #43 em: 28 de Outubro de 2010, 14:34 »
Aqui está o código final.

Código: [Seleccione]
#define redPin 5
#define greenPin 6
#define bluePin 9

unsigned long previousMillis = millis();
int redVal = 0;
int greenVal = 0;
int blueVal = 0;
int state = 1;

void setup(){
Serial.begin(9600);
  }

void loop(){

unsigned long currentMillis;

currentMillis = millis();
 
 //LED LED LED SOLTO **************************************************************

if(currentMillis - previousMillis > 10) { // Se quiseres fazer o update a cada 500ms
  previousMillis = currentMillis;  // salvas o novo valor de tempo

 
  switch(state){
    case 1:
 if(blueVal >0) {blueVal--;}
      if(redVal < 255){ redVal++; }// se ainda nao chegámos aos 255, aumenta o valor de redVal
      else state = 2; // se atingiste os 255, mudas para o proximo estado, onde vais decrementar o valor do vermelho
     break;
   
    case 2:
    if(redVal < 30){ greenVal++; }
    if(redVal > 0){ redVal--; }
   else state = 3;
   break;
   
       case 3:
 if(greenVal < 255){ greenVal++; }
      else state = 4;
     break;
   
    case 4:
   if(greenVal < 30){ blueVal++; }
    if(greenVal > 0){ greenVal--; }
      else state = 5;
   break;
   
    case 5:
  if(blueVal < 255) {blueVal++;}
      else state = 6;
      break;
     
      case 6:
    if(blueVal < 30) {greenVal++;}
   if(blueVal < 30) {redVal++;}
    if(blueVal > 0){ blueVal--; }
   else state = 7;
   break;
   
    case 7:
    if(redVal < 255) {redVal++;}
    if(greenVal < 255) {greenVal++; }
    else state = 8;
   break;
   
    case 8:

    if(greenVal >30){greenVal--;}
    if(redVal < 30) {blueVal++;}
    if(redVal > 0) {redVal--;}
    else state = 9;
   break;
   
     case 9:
    if(blueVal < 255) {blueVal++;}
    if(greenVal < 255) {greenVal++; }
    else state = 10;
   break;
   
    case 10:
    if(blueVal > 30) {blueVal--;}
    if(greenVal < 30) {redVal++;}
    if(greenVal > 0) {greenVal--;}
    else state = 11;
   break;
   
    case 11:
   if(redVal < 255) {redVal++;}
    if(blueVal < 255) {blueVal++;}
    else state = 12;
   break;
   
   case 12:
   if(redVal >0) {redVal--;}
    if(blueVal >0) {blueVal--;}
    if(redVal<30) {state=1;}
   
   break;
   
  }
}


  analogWrite(redPin, redVal);
  analogWrite(greenPin, greenVal);
  analogWrite(bluePin, blueVal);
  Serial.print("vermelho= ");
  Serial.print(redVal);
  Serial.print("\t verde = ");
  Serial.println(greenVal);
  Serial.print("\t azul = ");
  Serial.println(blueVal);
 
}

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Alternar leds fazendo um fade entre eles
« Responder #44 em: 28 de Outubro de 2010, 22:12 »
Se queres um efeito bonitinho de transição entre as várias cores que podes obter de um led RGB experimenta isto:
Código: [Seleccione]
  int RedVal=1;
  int BlueVal=1;
  int GreenVal=1;
 
  int redPin=9;
  int bluePin=11;
  int greenPin=10;
 
  int i=1;
  void setup() {
    //Serial.begin(9600);
}

void loop() {
 
  analogWrite(redPin,RedVal);
  analogWrite(bluePin,BlueVal);
  analogWrite(greenPin,GreenVal);
 
  RedVal =((i<255)*i)+((i>=255)*255)+((i>511)*(512-i))+((i>766)*(i-766))+((i>=1276)*(i-1276))+((i>1530)*(1530-i))+((i>1786)*(1786-i));
  GreenVal =(i<256)*(1)+(i>255)*(i-255)+(i>510)*(510-i)+(i>1020)*(1020-i)+(i>1274)*(i-1274)+(i>1530)*(i-1531)+(i>1785)*(3571-(2*i));
  BlueVal =(i<764)*(1)+(i>765)*(i-765)+(i>1020)*(1020-i)+(i>1786)*(1786-i);

  if(i>2040){
   i = 1;
  }
 
  i++;
  delay(30);
 
}
Avr fanboy