Unir dos códigos de programa y ejecutarlos simultáneamente (Motor y Sonido).

Hola a todos CyberElectronicos que se apasionan por Arduino.

Ojala los que tengan basta experiencia o entiendan mas que yo puedan echarme la mano con la siguiente problemática que tengo.

Les cuento: tengo ya varios días intentando hacer funcionar dos códigos a la vez, he logrado compilarlo en un solo Sketch, pero solo ejecuta uno solo (MELODIA), estos códigos son: variar la velocidad de un motor dc y a la vez que se reproduzca una melodia. Ya los probe por separado y funcionan bien pero quisiera que estuvieran en un solo código para usar solo un arduino, estoy usando Arduino NANO.
Los códigos son los siguientes:
//MOTOR
int pot = A0;
int val = 0;
int mot = 3;

void setup() {
}

void loop() {
val = analogRead(pot);
val = map (val, 0 , 1023, 0 , 255);
analogWrite (led, val);
}

//SONIDOS
int pinTono=4;
void setup() {
pinMode (4, OUTPUT);
}
void loop() {
for(int i=20; i<2400; i=i+50){
tone (4, i, 100);
delay (100);
}
}

Cualquier aporte o comentario es bienvenido.

SALUDOS!!

Bienvenido al foro. Las estructuras void loop y void setup solo puede haber una de cada una en el programa. Fijate en este ejemplo.

Saludos

Primero que nada: debiste leer las reglas del foro. Una de ellas, es que el código se debe postear entre tags generados por el botón </>

Segundo: el tema este de fusionar dos programas es bastante interesante, y un tanto desafiante.
Por qué? Porque hay que seguir varias reglas para que esto se logre con éxito:

  • Para una mejor visualización, los loop de cada programa deben estar encapsulados en funciones diferentes.
  • Los bucles o ciclos (for y while/do-while) están terminantemente prohibidos; a menos de que los programas “fusionados” se deban ejecutar secuencialmente y no simultáneamente.
  • Todo delay está también prohibido; sin embargo, se aplica la misma excepción del punto anterior.
  • Si los setup de los programas involucran muchas líneas de código; se deben, de igual forma, separar en funciones diferentes; como ocurre en los loop de cada uno.
    Y también se debe aplicar el sentido común: incluir todas las librerías utilizadas por todos los programas (sin repetir), juntar todas las variables globales, funciones adicionales que posiblemente tengan, etc.

Aplicando todo lo anterior, tu código debería quedar así:

//MOTOR
const byte pot = A0;
unsigned int val = 0;
const byte mot = 3;

//SONIDOS
const byte pinTono = 4;
const byte delaySonido = 100; // El delay que originalmente programaste para la duración de tone.
unsigned int i = 20; // Es la variable i que se declaraba en el for
unsigned long tiempo = 0; // Guarda el momento en que se cambió la frecuencia del tono.

void setup() {
 pinMode(mot, OUTPUT);
 pinMode(pinTono, OUTPUT);
}

void loop() {
 loopMotor();
 loopSonido();
 // Para visualizar mejor como se fusionan dos programas, es mejor separar los "loop" de cada uno, en funciones.
}

void loopMotor() {
 val = analogRead(pot);
 val = map (val, 0 , 1023, 0 , 255);
 analogWrite (mot, val);
}
// No hay delay, no hay bucles/ciclos; entonces se queda igual.

void loopSonido() {
 
 if (millis() - tiempo >= delaySonido) {
   tiempo = millis();
   // For es un bucle o ciclo; entonces si se usa, no se podrá variar la velocidad del motor hasta que se salga.
   // Esta función se llama constantemente, entonces es posible usar una alternativa al for. 
   tone (pinTono, i);
   // No se puede usar delay, sino el programa se bloquea. Para eso está el if del principio.
   i += 50;
   if (i > 2400) { i = 20; }
 }
}
/* El original era: for (int i = 20; i < 2400; i = i + 50). Como la función se llama constantemente, se logra el
* mismo efecto aún sin este.
* 
* i += 50 hace el aumento de i cada vez que ocurra el cambio de frecuencia.
* 
* if (i > 2400) { i = 20; } el valor de i vuelve a 20 si anteriormente sobrepasó los 2400
* 
* if (millis() - tiempo >= delaySonido) provoca que el cambio de frecuencia del tono ocurra cada 100 milisegundos.
* Equivale al delay(100); solo que ahora le permite al programa hacer otra cosa mientras espera.
*/