Usar una parte del código u otra

Hola, estoy liado con un proyecto de clase y necesito ayuda.

El proyecto en sí es un pequeño brazo impreso en 3D que controlo mediante potenciómetros y tiene memoria, con lo que reproduce hasta un máximo de 5 posiciones que yo le marqué antes.

Ahora el problema viene a la hora de añadirle comandos de voz. Con los comandos por separado funciona perfectamente, lo que necesito es añadir los comandos de voz al código que me permite controlarlo mediante potenciómetros.

Lo que necesito es crear de alguna forma un sistema de preferencia, es decir, mientras no le diga mediante comandos de voz debe funcionar con potenciómetros, pero en el momento que quiera darle una orden por voz debe dejar de hacer caso a los potenciómetros.

Resumiendo, quiero que mientras no le diga nada, él haga caso de los potenciómetros, pero utilizando quizás un comando de voz como “activado”, quiero que el control del brazo pase a los comandos de voz y deje de hacer caso a los potenciómetros. También necesito que, con otro comando de voz, por ejemplo “desactivado”, vuelva a hacer caso a los potenciómetros.

El código que tengo actualmente utiliza un boolean para las funciones de recordar y repetir del brazo y le he añadido otra para intentar hacer funcionar el tema de pasar de potenciómetros a voz y viceversa. El código es el siguiente:

/*
 * PRUEBA PARA DAR PRIORIDAD A LOS COMANDOS
 * CUANDO FUNCIONE COMANDOS NO FUNCIONA POT Y AL REVES
 * 
 * SE USA UN BOOLEAN PARA INTENTAR PRIORIDAD
 */

#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;

const int LED1 = 2;
const int LED2 = 3;
const int LED3 = 4;
const int LED4 = 7;
const int LED5 = 8;

const int boton1 = 12;
const int boton2 = 11;

int boton1pres = 0;
boolean boton2pres = false;

const int pot1 = A0;
const int pot2 = A1;
const int pot3 = A2;
const int pot4 = A3;

int pot1Val;
int pot2Val;
int pot3Val;
int pot4Val;

int pot1Ang;
int pot2Ang;
int pot3Ang;
int pot4Ang;

int servo1PosSaves[] = {1,1,1,1,1};
int servo2PosSaves[] = {1,1,1,1,1};
int servo3PosSaves[] = {1,1,1,1,1};
int servo4PosSaves[] = {1,1,1,1,1};

//COMANDOS VOZ
boolean voz = false;
String mensaje;

void setup() {
  servo1.attach(5);
  servo2.attach(6);
  servo3.attach(9);
  servo4.attach(10);

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);

  pinMode(boton1, INPUT);
  pinMode(boton2, INPUT);

  Serial.begin(9600);
}

void loop() {

  while(Serial.available()){
    delay(10);
    char c = Serial.read();
    mensaje += c;
  }
  if(mensaje.length()>0){
    if(mensaje=="*activado#"){
      voz = true;
    }
  }
  if(mensaje.length()>0){
    if(mensaje=="*desactivado#"){
      voz = false;
    }
  }

  if(voz = false){
  pot1Val = analogRead(pot1);
  pot1Ang = map(pot1Val, 0, 1023, 0, 179);
  pot2Val = analogRead(pot2);
  pot2Ang = map(pot2Val, 0, 1023, 0, 179);
  pot3Val = analogRead(pot3);
  pot3Ang = map(pot3Val, 0, 1023, 0, 179);
  pot4Val = analogRead(pot4);
  pot4Ang = map(pot4Val, 0, 1023, 0, 179);

  servo1.write(pot1Ang);
  servo2.write(pot2Ang);
  servo3.write(pot3Ang);
  servo4.write(pot4Ang);

  Serial.print(pot1Ang);
  Serial.print(pot2Ang);
  Serial.print(pot3Ang);
  Serial.println(pot4Ang);

  if(digitalRead(boton1) == HIGH){
    boton1pres++;
    switch(boton1pres){
      case 1:
        servo1PosSaves[0] = pot1Ang;
        servo2PosSaves[0] = pot2Ang;
        servo3PosSaves[0] = pot3Ang;
        servo4PosSaves[0] = pot4Ang;
        digitalWrite(LED5, HIGH);
        Serial.println("Pos 1 Saved");
        break;

      case 2:
        servo1PosSaves[1] = pot1Ang;
        servo2PosSaves[1] = pot2Ang;
        servo3PosSaves[1] = pot3Ang;
        servo4PosSaves[1] = pot4Ang;
        digitalWrite(LED4, HIGH);
        Serial.println("Pos 2 Saved");
        break;

      case 3:
        servo1PosSaves[2] = pot1Ang;
        servo2PosSaves[2] = pot2Ang;
        servo3PosSaves[2] = pot3Ang;
        servo4PosSaves[2] = pot4Ang;
        digitalWrite(LED3, HIGH);
        Serial.println("Pos 3 Saved");
        break;

      case 4:
        servo1PosSaves[3] = pot1Ang;
        servo2PosSaves[3] = pot2Ang;
        servo3PosSaves[3] = pot3Ang;
        servo4PosSaves[3] = pot4Ang;
        digitalWrite(LED2, HIGH);
        Serial.println("Pos 4 Saved");
        break;

      case 5:
        servo1PosSaves[4] = pot1Ang;
        servo2PosSaves[4] = pot2Ang;
        servo3PosSaves[4] = pot3Ang;
        servo4PosSaves[4] = pot4Ang;
        digitalWrite(LED1, HIGH);
        Serial.println("Pos 5 Saved");
        break;
    }
  }
  
  if(digitalRead(boton2) == HIGH){
    boton2pres = true;
  }

  if(boton2pres){
    for(int i = 0; i < 5; i++){
      servo1.write(servo1PosSaves[i]);
      servo2.write(servo2PosSaves[i]);
      servo3.write(servo3PosSaves[i]);
      servo4.write(servo4PosSaves[i]);

      Serial.println(" pot Angulo: ");
      Serial.println(servo1PosSaves[i]);
      Serial.println(servo2PosSaves[i]);
      Serial.println(servo3PosSaves[i]);
      Serial.println(servo4PosSaves[i]);
      delay(1050);
    }
  }
  }
  //AQUI VA LO NUEVO
  if(voz = true){
  while(Serial.available()){
    delay(10);
    char c = Serial.read();
    mensaje += c;
  }
  if(mensaje.length()>0){
    if(mensaje=="*posición 1#"){
      servo4.write(31);
    }
  }
  if(mensaje.length()>0){
    if(mensaje=="*posición 2#"){
      servo4.write(128);
    }
  }
  delay(300);
  mensaje="";
}
}

Un saludo y gracias!

He hecho una modificación que es lo mismo que tu tienes pero ahora solo esta levemente mejor ordenado.

Mira donde tienes un gran problema. delay(1050) dontro del for i=0…4 lo que implica 5 segundos demorados.

/*
 * PRUEBA PARA DAR PRIORIDAD A LOS COMANDOS
 * CUANDO FUNCIONE COMANDOS NO FUNCIONA POT Y AL REVES
 * 
 * SE USA UN BOOLEAN PARA INTENTAR PRIORIDAD
 */

#include <Servo.h>

Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;

const int LED1 = 2;
const int LED2 = 3;
const int LED3 = 4;
const int LED4 = 7;
const int LED5 = 8;

const int boton1 = 12;
const int boton2 = 11;

int boton1pres = 0;
boolean boton2pres = false;

const int pot1 = A0;
const int pot2 = A1;
const int pot3 = A2;
const int pot4 = A3;

int pot1Val;
int pot2Val;
int pot3Val;
int pot4Val;

int pot1Ang;
int pot2Ang;
int pot3Ang;
int pot4Ang;

int servo1PosSaves[] = {1,1,1,1,1};
int servo2PosSaves[] = {1,1,1,1,1};
int servo3PosSaves[] = {1,1,1,1,1};
int servo4PosSaves[] = {1,1,1,1,1};

//COMANDOS VOZ
boolean voz = false;
String mensaje;

void setup() {
  servo1.attach(5);
  servo2.attach(6);
  servo3.attach(9);
  servo4.attach(10);

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);

  pinMode(boton1, INPUT);
  pinMode(boton2, INPUT);

  Serial.begin(9600);
}

void loop() {

  while (Serial.available()){
        delay(10);
        char c = Serial.read();
        mensaje += c;
  }
  if (mensaje.length()>0){
      if (mensaje=="*activado#"){
          voz = true;
      }
  }
  if (mensaje.length()>0){
      if (mensaje=="*desactivado#"){
          voz = false;
    }
  }

  if (voz){ // Potenciómetros
      voice();
  else
      potenciometros();
}

void potenciometros() {
  pot1Val = analogRead(pot1);
  pot1Ang = map(pot1Val, 0, 1023, 0, 179);
  pot2Val = analogRead(pot2);
  pot2Ang = map(pot2Val, 0, 1023, 0, 179);
  pot3Val = analogRead(pot3);
  pot3Ang = map(pot3Val, 0, 1023, 0, 179);
  pot4Val = analogRead(pot4);
  pot4Ang = map(pot4Val, 0, 1023, 0, 179);

  servo1.write(pot1Ang);
  servo2.write(pot2Ang);
  servo3.write(pot3Ang);
  servo4.write(pot4Ang);

  Serial.print(pot1Ang);
  Serial.print(pot2Ang);
  Serial.print(pot3Ang);
  Serial.println(pot4Ang);

  if (digitalRead(boton1) == HIGH){
      boton1pres++;
      switch(boton1pres){
        case 1:
          servo1PosSaves[0] = pot1Ang;
          servo2PosSaves[0] = pot2Ang;
          servo3PosSaves[0] = pot3Ang;
          servo4PosSaves[0] = pot4Ang;
          digitalWrite(LED5, HIGH);
          Serial.println("Pos 1 Saved");
          break;

        case 2:
          servo1PosSaves[1] = pot1Ang;
          servo2PosSaves[1] = pot2Ang;
          servo3PosSaves[1] = pot3Ang;
          servo4PosSaves[1] = pot4Ang;
          digitalWrite(LED4, HIGH);
          Serial.println("Pos 2 Saved");
          break;

        case 3:
          servo1PosSaves[2] = pot1Ang;
          servo2PosSaves[2] = pot2Ang;
          servo3PosSaves[2] = pot3Ang;
          servo4PosSaves[2] = pot4Ang;
          digitalWrite(LED3, HIGH);
          Serial.println("Pos 3 Saved");
          break;

        case 4:
          servo1PosSaves[3] = pot1Ang;
          servo2PosSaves[3] = pot2Ang;
          servo3PosSaves[3] = pot3Ang;
          servo4PosSaves[3] = pot4Ang;
          digitalWrite(LED2, HIGH);
          Serial.println("Pos 4 Saved");
          break;

        case 5:
          servo1PosSaves[4] = pot1Ang;
          servo2PosSaves[4] = pot2Ang;
          servo3PosSaves[4] = pot3Ang;
          servo4PosSaves[4] = pot4Ang;
          digitalWrite(LED1, HIGH);
          Serial.println("Pos 5 Saved");
          break;
      }
  }

  if (digitalRead(boton2) == HIGH){
      boton2pres = true;
  }

  if (boton2pres){
      for (int i = 0; i < 5; i++){
          servo1.write(servo1PosSaves[i]);
          servo2.write(servo2PosSaves[i]);
          servo3.write(servo3PosSaves[i]);
          servo4.write(servo4PosSaves[i]);

          Serial.println(" pot Angulo: ");
          Serial.println(servo1PosSaves[i]);
          Serial.println(servo2PosSaves[i]);
          Serial.println(servo3PosSaves[i]);
          Serial.println(servo4PosSaves[i]);
          delay(1050);  // <== Esto es un error!!!
      }
  }
}

void voice() {
  while (Serial.available()){
          delay(10);
          char c = Serial.read();
          mensaje += c;
  }
  if (mensaje.length()>0){
      if (mensaje=="*posición 1#"){
          servo4.write(31);
      }
  }
  
  if (mensaje.length()>0){
      if (mensaje=="*posición 2#"){
          servo4.write(128);
      }
  }
  delay(300);
  mensaje="";
}

Gracias!

Ese delay es para que se vean bien los movimientos del brazo a la hora de presentarlo al profesor, si fuera para algo serio sí que lo quitaría, pero muchas gracias por el comentario.

He estado probando toda la tarde y he hecho un código que funciona, ya puedo pasar de uno a otro, además de haber configurado un botón por si acaso entiende mal un comando y no limpia el puerto serie.

De momento estoy "pasándolo a limpio", cuando lo tenga lo posteo.

Un saludo y gracias otra vez!