2 Leds + 2 push botão + 1 potenciometro

olá peço ajuda a vcs pois preciso fazer um projeto que

? A intensidade das lâmpadas de LED devem ser controladas por apenas um
potenciômetro;
? As lâmpadas de LED devem poder assumir valores de intensidade diferentes entre
si.
? Para ajuste da intensidade de cada uma das lâmpadas de LED o circuito deverá
possuir dois botões, cada um representa o ajuste de uma das lâmpadas.
? Ao pressionar o botão que representa uma das lâmpadas de LED o ajuste de
intensidade poderá ser feito até que o outro botão seja pressionado.

fiz o codigo porem que quero que quando o botão for pressionado, seja possível ajustar a intensidade do led até que o outro botão seja pressionado, e ai o segundo led terá sua intensidade controlada.

no atual codigo é preciso ficar com o botão pressionado para alterar sua intensidade.

esté é o atual codigo peço a ajuda de vcs

const int potenciometro = A5;
int led1 = 10;
int led2 = 11;
int Bled1 = 6; //botão led 1
int Bled2 = 7; //botão led 2
int statuB1 = 0; //armazena estado do botão ligado ou desligado do botão1
int statuB2 = 0; // armazena estado do botão ligado ou desligado do botão 2

void setup (){
Serial.begin(9600);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(Bled1, INPUT);
pinMode(Bled2, INPUT);
}
void loop(){

int potenciometro = analogRead(A5);
statuB1=digitalRead(Bled1);
statuB2=digitalRead(Bled2);
if (statuB1==1) {
analogWrite(led1,potenciometro/4);
}
if (statuB2==1) {
analogWrite(led2,potenciometro/4);

}
}

Isso parece trabalho de escola, ou estou errado? rs

você pode fazer isso de duas formas, guardando o estado anterior e usar o loop http://arduino.cc/en/Tutorial/ButtonStateChange
ou usando interrupts http://arduino.cc/en/Reference/AttachInterrupt

Dentro do método da interrupção você verifica a variável statuB1 e statuB2 e altera quando ocorre o evento change, pois no loop só funcionará se o botão estiver pressionado enquanto você ajusta o potenciômetro mesmo.

Tens de guardar o último estado do botão:

void loop(){
  
unsigned char prev_button = 0; //1 botão1, 2 botão2
 
  int potenciometro = analogRead(A5);
  statuB1=digitalRead(Bled1);
  statuB2=digitalRead(Bled2);  

  if (statuB1==1) {
     prev_button = 1; 
 }
   if (statuB2==1) {
      prev_button = 2;
 }
if( prev_button == 1) 
   analogWrite(led1,potenciometro/4);

if( prev_button == 2) 
   analogWrite(led1,potenciometro/4);

}

Isto deve funcionar, mas é feio à brava!!!

bubulindo:
Isto deve funcionar, mas é feio à brava!!!

E não podes tremer ao pressionar o botão, pois poderá acarretar em um duplo pressionamento (liga e desliga), afinal o loop é mais rápido que o dedo ^^

Podes sempre tentar usar um "Switch" para o código ficar mais bonito e persetivel.
Assim por alto deve ser algo assim.Nao testei o codigo pois nao tenho o meu arduino proximo.

const int potenciometro = A5;
int led1 = 10;
int led2 = 11;
int Bled1 = 6; //botão led 1
int Bled2 = 7;  //botão led 2

uint8_t botaoSelecionadoActualmente;


void setup (){
    Serial.begin(9600);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(Bled1, INPUT);
    pinMode(Bled2, INPUT);
    digitalWrite(Bled1,0);//Seta os pull-downs internos
    digitalWrite(Bled2,0);//Seta os pull-downs internos
}
void loop()
{
  Serial.println(devolveBotaoPressionado());
  processaPWMLeds(devolveBotaoPressionado()); 

}
  
//Tens de prever o debounge dos botoes na mesma
uint8_t devolveBotaoPressionado()
{
  if(digitalRead(Bled1) == HIGH){botaoSelecionadoActualmente = 1; return botaoSelecionadoActualmente;}
  if(digitalRead(Bled2) == HIGH){botaoSelecionadoActualmente = 2; return botaoSelecionadoActualmente;}
 
}

void processaPWMLeds(uint8_t botao)
{
  int valordoADC;
  switch (botao) {
    case 1:
      valordoADC = analogRead(A5);
      valordoADC = map(valordoADC, 0, 1023, 0, 255);
      analogWrite(led1, valordoADC);
      break;
    case 2:
      valordoADC = analogRead(A5);
      valordoADC = map(valordoADC, 0, 1023, 0, 255);
      analogWrite(led2, valordoADC);
      break;
    default: 
      Serial.print("Nao detectei nada nos botoes");
  } 
  
  
}

Posta o resultado

Mortis:

bubulindo:
Isto deve funcionar, mas é feio à brava!!!

E não podes tremer ao pressionar o botão, pois poderá acarretar em um duplo pressionamento (liga e desliga), afinal o loop é mais rápido que o dedo ^^

Errado... ele pode tremer as vezes que quiser no mesmo botão. Nota que o botão não faz reset da variável... apenas faz um set.

@Hugo... não quererás dizer isto:

int valordoADC;
      valordoADC = analogRead(A5);
      valordoADC = map(valordoADC, 0, 1023, 0, 255);

  switch (botao) {
    case 1:
      analogWrite(led1, valordoADC);
      break;
    case 2:
      analogWrite(led2, valordoADC);
      break;
    default: 
      Serial.print("Nao detectei nada nos botoes");
  }

A maneira Claudia Schiffer (sim, sou velho) de fazer isto seria...

unsigned char pinos[0] {30;10;11};//imaginemos isto... 

void loop(){
  
unsigned char prev_button = 0; 
 
  int potenciometro = analogRead(A5);
  statuB1=digitalRead(Bled1);
  statuB2=digitalRead(Bled2);  

  if (statuB1==1) {
     prev_button = 1; 
 }
   if (statuB2==1) {
      prev_button = 2;
 }
   analogWrite(pinos[prev_button],potenciometro/4);
}

O problema é mesmo o estado zero... mas isso pode ser resolvido adoptando um dos pinos como defeito.

Sim a tua sugestao fica com o codigo mais legivel, poupa se uns bytes, uns ciclos de codigo e é mais eficaz.
Olhando bem nem sei pk é que coloquei assim :fearful:

bubulindo:
A maneira Claudia Schiffer (sim, sou velho) de fazer isto seria...

lol