Controlar Led RGB con pulsadores y solo un potenciometro

buenas tardes .

Soy bastante nuevo en el foro pero siempre busco apoyo en sus lecturas y códigos para fabricar los propios.

me encuentro con un proyecto con led RGV que quisiera solicitar su apoyo en corrección e ideas.

el proyecto consiste en controlar un led RGB por medio de tres pulsadores y solo un potenciometro .

me explico :

mantengo pulsado el primer pulsador y modifico el valor del primer pwm con el potenciometro luego lo suelto y el valor queda guardado para esa salida ,

manualmente vuelvo el potenciometro a cero y comienzo con el segundo pwm.

mantengo presiono el segundo boton y modifico el valor pwm 2 con el potenciometro , luego lo suelto y el valor queda grabado para esa salida .

manualmente vuelvo el potenciometro a cero y comienzo con el tercer pwm.

mantengo presiono el tercer boton y modifico el valor pwm 3 con el potenciometro , luego lo suelto y el valor queda grabado para esa salida .

les presento el codigo el cual funciona pero tengo ciertas dudad ya que al soltar el pulsador queda igual modificando el pwm y solo se detiene al pulsar otro de los pulsadores.

int pot=A0;
int v1=0;
int v2=0;
int v3=0;
int l1=9;
int l2=10;
int l3=11;
const int p1=5;
const int p2=6;
const int p3=7;
int j;
int k;
int l;
int num;


void setup() {
Serial.begin(9600);
pinMode(l1,OUTPUT);
pinMode(l2,OUTPUT);
pinMode(l3,OUTPUT);
pinMode(p1,INPUT);
pinMode(p2,INPUT);
pinMode(p3,INPUT);

}
void pulso1(){
  v1 = (analogRead(pot)/4);
  analogWrite(l1,v1);
  
}

void pulso2(){
  v2 = (analogRead(pot)/4);
  analogWrite(l2,v2);
  
}

void pulso3(){
  v3 = (analogRead(pot)/4);
  analogWrite(l3,v3);
  
}

void loop() {


j= digitalRead(p1);
if (j==HIGH){
  num=1;
  delay(100);
  
}
k= digitalRead(p2);
if(k==HIGH){
  num=2;
  delay(10);
}
l= digitalRead(p3);
if(l==HIGH){
  num=3;
  delay(10);
}

 pot =analogRead(A0);
 
 if(num==1)//j ==1 && k==0 && l==0)
 {
  pulso1();
  
 }
 if(num==2)//j ==0 && k==1 && l==0)
 {
  pulso2();
 }

 if(num==3)//j ==0 && k==0 && l==1)
 {
  pulso3();
 }

Serial.print("valor pot = ");
Serial.print(pot);
Serial.print("  ");
Serial.print("valor l1 = ");
Serial.print(v1);
Serial.print("  ");
Serial.print("valor l2 = ");
Serial.print(v2);
Serial.print("  ");
Serial.print("valor l3 = ");
Serial.print(v3);
Serial.print("  ");
Serial.print("valor num = ");
Serial.println(num);
//delay(10);

}

En la imagen tengo colocado 3 led simulando el led RGB

[/img].

de antemano muchas gracias por su ayudas y consejos

Bueno yo he cambiado levemente el enfoque.
Ahora con solo presionar un pulsador P1 a P3 cambias cual esta activo de modo permanente de modo que no tienes que mantenerlo presionado.

Si quieres cambiar el P2 solo lo pulsas 1 vez y ya todo cambio que hagas sobre P2 se verá en su salida.. y asi por siempre hasta que cambies a otro pulsador.

Podrian hacer muchas cosas mas.. incluso pulsar para que cambie y pulsar para que no cambie mas y quede fijo.
Podrias usar solo uno y con cada cambio te mueves por cada salida.

Te dejo lo que te propongo, pruébalo a ver que te parece.

int pot = A0;
int v1  = 0;
int v2  = 0;
int v3  = 0;
int l1  = 9;
int l2  = 10;
int l3  = 11;
const int p1 = 5;
const int p2 = 6;
const int p3 = 7;
bool j, jAnt;
bool k, kAnt;
bool l, lAnt;
bool configuroP1 = false;
bool configuroP2 = false;
bool configuroP3 = false;
unsigned long start;


void setup() {

  Serial.begin(9600);
  pinMode(l1,OUTPUT);
  pinMode(l2,OUTPUT);
  pinMode(l3,OUTPUT);
  pinMode(p1,INPUT);
  pinMode(p2,INPUT);
  pinMode(p3,INPUT);
}

void pulso1(){
  v1 = (analogRead(pot)/4);
  analogWrite(l1,v1);
}

void pulso2(){
  v2 = (analogRead(pot)/4);
  analogWrite(l2,v2);
}

void pulso3(){
  v3 = (analogRead(pot)/4);
  analogWrite(l3,v3);
  
}

void loop() {

  j = digitalRead(p1);
  if (j && !jAnt) {
      configuroP1 = true;
      configuroP2 = false;
      configuroP3 = false;
  }
  jAnt = j;

  k = digitalRead(p2);
  if (k && !kAnt){
      configuroP1 = false;
      configuroP2 = true;
      configuroP3 = false;
  }
  kAnt = k;

  l = digitalRead(p3);
  if (l && !lAnt){
      configuroP1 = false;
      configuroP2 = false;
      configuroP3 = true;
  }
  lAnt = l;

  if (configuroP1) { // ajusto potenciometro P1 todo el tiempo
      pulso1();
  }

  if (configuroP2) { 
      pulso2();
  }
   
  if (configuroP3) {
      pulso3();
  }

  if (millis() - start > 1000UL) {
      Serial.print("valor pot = ");
      Serial.print(pot);
      Serial.print("  ");
      Serial.print("valor l1 = ");
      Serial.print(v1);
      Serial.print("  ");
      Serial.print("valor l2 = ");
      Serial.print(v2);
      Serial.print("  ");
      Serial.print("valor l3 = ");
      Serial.print(v3);
      start = millis();
  }
}

Muchas gracias comprobé el código y funciona mejor , incluso la lectura y escritura del potenciometro mejoro, ya que antes existía mucha variación en los pwm que inyectaba a los led , ahora es mas estable , lo que si tengo una duda .

Al tratar de realizar el print del potenciometro real A0 la lectura que realiza es siempre 14 pero no cambia aun cuando la e declarado como una variable nueva solo para el print.

.

Saludos y gracias SURBYTE, por las correcciones , siempre veo que estas atento y dispuesto a ayudar . gracias por su tiempo .

ya solucionado , había un problema en los caracteres pero ya quedo ok solo se creo una variable nueva de lectura.

dejo el código final por si alguien lo quiere probar.

int pot = A0;
int lectura;
int v1  = 0;
int v2  = 0;
int v3  = 0;
int l1  = 9;
int l2  = 10;
int l3  = 11;
const int p1 = 5;
const int p2 = 6;
const int p3 = 7;
bool j, jAnt;
bool k, kAnt;
bool l, lAnt;
bool configuroP1 = false;
bool configuroP2 = false;
bool configuroP3 = false;
unsigned long start;


void setup() {

  Serial.begin(9600);
  pinMode(lectura,INPUT);
  pinMode(l1,OUTPUT);
  pinMode(l2,OUTPUT);
  pinMode(l3,OUTPUT);
  pinMode(p1,INPUT);
  pinMode(p2,INPUT);
  pinMode(p3,INPUT);
}

void pulso1(){
  v1 = (analogRead(pot)/4);
  analogWrite(l1,v1);
}

void pulso2(){
  v2 = (analogRead(pot)/4);
  analogWrite(l2,v2);
}

void pulso3(){
  v3 = (analogRead(pot)/4);
  analogWrite(l3,v3);
  
}

void loop() {
  lectura=analogRead(A0);

  j = digitalRead(p1);
  if (j && !jAnt) {
      configuroP1 = true;
      configuroP2 = false;
      configuroP3 = false;
  }
  jAnt = j;

  k = digitalRead(p2);
  if (k && !kAnt){
      configuroP1 = false;
      configuroP2 = true;
      configuroP3 = false;
  }
  kAnt = k;

  l = digitalRead(p3);
  if (l && !lAnt){
      configuroP1 = false;
      configuroP2 = false;
      configuroP3 = true;
  }
  lAnt = l;

  if (configuroP1) { // ajusto potenciometro P1 todo el tiempo
      pulso1();
  }

  if (configuroP2) { 
      pulso2();
  }
   
  if (configuroP3) {
      pulso3();
  }

  if (millis() - start > 1000UL) {
      Serial.print("valor pot = ");
      Serial.print(lectura);
      Serial.print("  ");
      Serial.print("valor l1 = ");
      Serial.print(v1);
      Serial.print("  ");
      Serial.print("valor l2 = ");
      Serial.print(v2);
      Serial.print("  ");
      Serial.print("valor l3 = ");
      Serial.println(v3);
      start = millis();
  }
}

saludos y buenas tardes .