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);
}