Unir tres códigos simultáneos

Buenas a todos
Tengo que unir tres códigos para que se ejecuten "simultáneamente".
Un pulsador que enciende una bombilla. Un potenciómetro que cambia de color un RGB y a la vez que suene música.
He conseguido que funcionen los tres por separado e incluso los dos primeros a la vez.
El problema me viene cuando introduzco el tercero, la música. No funcionan los dos primeros.
He leído que no puedo usar ni delay ni for, y que tengo que usar la función millis pero no se me ocurre como hacerlo.
Os copio el código por si alguien me puede echar una mano.
Muchas gracias de antemano.

/*

*/
#define verde 13 //rgb
#define azul 12 //rgb
#define rojo 11 //rgb
#define potenciometro 5 //potenciometro
int buzzerPin = 6;
void tocarnota(char note, int duration) {
  char notesName[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E','F','G','A','B', 's', 'v' };
  int tones[] = { 261, 293, 329, 349, 392, 440, 494, 523, 587, 659, 698, 784, 880,  988, 466 };
  for (int k = 0; k<= sizeof(tones); k++) {
    if (note == notesName[k]) {
    tone(buzzerPin, tones[k], duration);
    }
  }
}
    
void setup()
{
  pinMode (verde, OUTPUT); //rgb
  pinMode (azul, OUTPUT); //rgb
  pinMode (rojo, OUTPUT); //rgb
  pinMode (potenciometro, INPUT); //potenciometro
  pinMode (8, INPUT); //boton
  pinMode (7, OUTPUT); //led
  pinMode(buzzerPin, OUTPUT);
  analogWrite(buzzerPin, 0);
}

void loop() {
  loopRGByPoten();
  loopPulsayLed();
  loopMusica();
}
  void loopMusica () {
  char notes[] = "EEFGGFEDCCDEEDEEFGGFEDCCDEDCDEFECDEFEDCDgEEFGGFEDCCDEDC";
  int duration[]  = {2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,1,1,2,2,2,1,1,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,4,4};
  int tempo=100;

  for (int i = 0; i<=sizeof(notes)-1; i++) {
        if (notes[i] == ' ') {
      delay(duration[i] * tempo);
    } else {
      tocarnota(notes[i], duration[i] * tempo);
    }
   delay((tempo*2)*duration[i]);
  }
}                   
  void loopRGByPoten () {
    int valorpotenciometro = analogRead (potenciometro);
    int valor = map (valorpotenciometro,0,1023,0,3);
    
    if (valor==0){
      digitalWrite (verde, LOW);
      digitalWrite (azul, LOW);
      digitalWrite (rojo, LOW);
    }
    if (valor==1){
      digitalWrite (verde, HIGH);
      digitalWrite (azul, LOW);
      digitalWrite (rojo, LOW);
    }
    if (valor==2){
      digitalWrite (verde, LOW);
      digitalWrite (azul, HIGH);
      digitalWrite (rojo, LOW);
    }
    if (valor==3){
      digitalWrite (verde, LOW);
      digitalWrite (azul, LOW);
      digitalWrite (rojo, HIGH);
    }
  }
  void loopPulsayLed () {
      if (digitalRead(8) == HIGH){
    digitalWrite (7, HIGH);
  }else{
    digitalWrite (7, LOW);
  }
  delay (10);
  }
  

This is an international category and must be in English.

Vas a tener que cambiar el enfoque.
La música no la puedes manejar con un for() porque no sale de ahí hasta que termine.
Tienes que hacerlo en loop(), con un contador que irás incrementando cada vez que se cumpla la duración de la nota.
Para controlar eso necesitas usar millis() reemplazando los delay().
Mientras esperas que pase ese tiempo ejecutas las otras 2 tareas.

Suena complicado pero no es tanto, solo cambiar la forma de ver el problema.

Saludos

Thank you so much
I'm a newbie and I don't see how to change the focus.
Can you give me any more clues? A bit of code?

Antonio, estamos en el foro en español, escribimos en español, por favor edita tu post. Gracias.

Hay que rehacer el código prácticamente desde cero, excede lo que yo interpreto es una ayuda.
Por otro lado, ¿qué mejor desafío para aprender a programar?
Te recomiendo que leas
Entender millis y no morir en el intento

Did you mean Spanish?

@antonio_m_b
In the future, please select the appropriate category to post your topics.
It will help us help you.
Could you move this to the Programing question category?
Thank you.

Now I am confused because there are English and Spanish posts….

Buenas a todos
Tengo que unir tres códigos para que se ejecuten "simultáneamente".
Un pulsador que enciende una bombilla. Un potenciómetro que cambia de color un RGB y a la vez que suene música.
He conseguido que funcionen los tres por separado e incluso los dos primeros a la vez.
El problema me viene cuando introduzco el tercero, la música. No funcionan los dos primeros.
He leído que no puedo usar ni delay ni for, y que tengo que usar la función millis pero no se me ocurre como hacerlo.
Os copio el código por si alguien me puede echar una mano.
Muchas gracias de antemano.

/*

*/
#define verde 13 //rgb
#define azul 12 //rgb
#define rojo 11 //rgb
#define potenciometro 5 //potenciometro
int buzzerPin = 6;
void tocarnota(char note, int duration) {
  char notesName[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E','F','G','A','B', 's', 'v' };
  int tones[] = { 261, 293, 329, 349, 392, 440, 494, 523, 587, 659, 698, 784, 880,  988, 466 };
  for (int k = 0; k<= sizeof(tones); k++) {
    if (note == notesName[k]) {
    tone(buzzerPin, tones[k], duration);
    }
  }
}
    
void setup()
{
  pinMode (verde, OUTPUT); //rgb
  pinMode (azul, OUTPUT); //rgb
  pinMode (rojo, OUTPUT); //rgb
  pinMode (potenciometro, INPUT); //potenciometro
  pinMode (8, INPUT); //boton
  pinMode (7, OUTPUT); //led
  pinMode(buzzerPin, OUTPUT);
  analogWrite(buzzerPin, 0);
}

void loop() {
  loopRGByPoten();
  loopPulsayLed();
  loopMusica();
}
  void loopMusica () {
  char notes[] = "EEFGGFEDCCDEEDEEFGGFEDCCDEDCDEFECDEFEDCDgEEFGGFEDCCDEDC";
  int duration[]  = {2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,1,1,2,2,2,1,1,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,4,4};
  int tempo=100;

  for (int i = 0; i<=sizeof(notes)-1; i++) {
        if (notes[i] == ' ') {
      delay(duration[i] * tempo);
    } else {
      tocarnota(notes[i], duration[i] * tempo);
    }
   delay((tempo*2)*duration[i]);
  }
}                   
  void loopRGByPoten () {
    int valorpotenciometro = analogRead (potenciometro);
    int valor = map (valorpotenciometro,0,1023,0,3);
    
    if (valor==0){
      digitalWrite (verde, LOW);
      digitalWrite (azul, LOW);
      digitalWrite (rojo, LOW);
    }
    if (valor==1){
      digitalWrite (verde, HIGH);
      digitalWrite (azul, LOW);
      digitalWrite (rojo, LOW);
    }
    if (valor==2){
      digitalWrite (verde, LOW);
      digitalWrite (azul, HIGH);
      digitalWrite (rojo, LOW);
    }
    if (valor==3){
      digitalWrite (verde, LOW);
      digitalWrite (azul, LOW);
      digitalWrite (rojo, HIGH);
    }
  }
  void loopPulsayLed () {
      if (digitalRead(8) == HIGH){
    digitalWrite (7, HIGH);
  }else{
    digitalWrite (7, LOW);
  }
  delay (10);
  }

Moderador:
Por favor, lee las Normas del foro
Si posteas en el foro en inglés usa idioma inglés para expresarte.
Si escribes en español debes usar el foro Arduino en español.
Este mensaje lo envío porque tu hilo fue movido del foro en inglés y por eso tenemos una respuesta anterior en ese idioma.
Tampoco puedes crear otro hilo si no indicas a los moderadores que cierren el hilo anterior.
En ese caso incurres en doble posteo.
Mas cuidado la próxima vez!!
A partir de ahora todos responden en español.

Busca unir dos códigos, se ha explicado muchas veces.
Si alguno de los códigos tiene delay() eso hará conspirar el funcionamiento de los 3.
Debes usar millis() pero el reemplazo no es directo.

La secuencia de unir 2,3 o N códigos es la misma

Todo sin repetir
Primero librerias sin repetir
constantes, variables y objetos sin repetir
Setup() sin repetir Serial.begin o inicialización de LCD, u otros elementos.
loop() todo lo que tengas evitando los delay() y reemplazandolo (sigue los tutoriales) por millis() o el código no tendrá fluidez.

Buenos días
Lo primero que quiero es pedir disculpas a todos porque soy nuevo y me he hecho un poco de lío:
Primero escribí el post en español en el foro internacional, luego escribí el post en inglés pensando que estaba en el foro internacional y resulta que estaba en el español y además la categoría que elegí no era la correcta.
Debido a todos estos errores, si quieren cerrar el hilo lo entiendo.
Mil disculpas a todos de nuevo. Espero estar en el foro en español, que igual me vuelvo a equivocar y estoy en el internacional.

Al final he cambiado el código por este:

#define verde 13
#define azul 12
#define rojo 11
#define potenciometro 5
int buzzerPin = 6;

unsigned long previousNoteTime = 0;
unsigned long previousLEDTime = 0;

void tocarnota(char note, int duration) {
  char notesName[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E', 'F', 'G', 'A', 'B', 's', 'v' };
  int tones[] = { 261, 293, 329, 349, 392, 440, 494, 523, 587, 659, 698, 784, 880, 988, 466 };
  for (int k = 0; k < sizeof(notesName); k++) {
    if (note == notesName[k]) {
      tone(buzzerPin, tones[k], duration);
    }
  }
}

void setup()
{
  pinMode(verde, OUTPUT);
  pinMode(azul, OUTPUT);
  pinMode(rojo, OUTPUT);
  pinMode(potenciometro, INPUT);
  pinMode(8, INPUT);
  pinMode(7, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  analogWrite(buzzerPin, 0);
}

void loop() {
  loopRGByPoten();
  loopPulsayLed();
  loopMusica();
}

void loopMusica() {
  char notes[] = "EEFGGFEDCCDEEDEEFGGFEDCCDEDCDEFECDEFEDCDgEEFGGFEDCCDEDC";
  int duration[]  = {2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,1,1,2,2,2,1,1,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,4,4};
  int tempo = 100;
  unsigned long currentMillis = millis();

  if (currentMillis - previousNoteTime >= (tempo * duration[0])) {
    if (notes[0] != ' ') {
      tocarnota(notes[0], duration[0] * tempo);
    }
    previousNoteTime = currentMillis;
    notes[0] = '\0'; // Mark the note as played
  }
}

void loopRGByPoten() {
  int valorpotenciometro = analogRead(potenciometro);
  int valor = map(valorpotenciometro, 0, 1023, 0, 3);

  if (valor == 0) {
    digitalWrite(verde, LOW);
    digitalWrite(azul, LOW);
    digitalWrite(rojo, LOW);
  }
  else if (valor == 1) {
    digitalWrite(verde, HIGH);
    digitalWrite(azul, LOW);
    digitalWrite(rojo, LOW);
  }
  else if (valor == 2) {
    digitalWrite(verde, LOW);
    digitalWrite(azul, HIGH);
    digitalWrite(rojo, LOW);
  }
  else if (valor == 3) {
    digitalWrite(verde, LOW);
    digitalWrite(azul, LOW);
    digitalWrite(rojo, HIGH);
  }
}

void loopPulsayLed() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousLEDTime >= 10) {
    if (digitalRead(8) == HIGH) {
      digitalWrite(7, HIGH);
    }
    else {
      digitalWrite(7, LOW);
    }
    previousLEDTime = currentMillis;
  }
}

Por si le puede servir a alguien.
Saludos