//Piano que para tocarlo no hay que tocarlo, con selector de programación. Juan Aguarón de Blas. http://juan.aguarondeblas.es juan.aguaron@gmail.com int altavozPin = 11; //Define el pin del altavoz //Define los pines de los botones int buttonPin1 = 2; int buttonPin2 = 3; int buttonPin3 = 4; int buttonPin4 = 5; int buttonPin5 = 6; //Define los pines de los LDR int ldrState1 = 0; int ldrState2 = 0; int ldrState3 = 0; int ldrState4 = 0; int ldrState5 = 0; //Define los estados actuales de los botones int buttonState1 = LOW; int buttonState2 = LOW; int buttonState3 = LOW; int buttonState4 = LOW; int buttonState5 = LOW; //Último estado de los botones int lastButtonState1 = LOW; int lastButtonState2 = LOW; int lastButtonState3 = LOW; int lastButtonState4 = LOW; int lastButtonState5 = LOW; int ldrSeleccionado = 0; //El LDR/Nota seleccionado //Umbrales límite. Hay dos porque yo tengo dos tipos diferentes de LDRs int treshold1 = 200; int treshold2 = 500; //Valor de la PWM de cada nota int nota1 = 30; int nota2 = 80; int nota3 = 130; int nota4 = 180; int nota5 = 230; int potPin = 5; //Define el pin del potenciómetro float pot = 0; //lectura analógica del potenciómetro float valorPot = 0; //factor de conversión de las notas extraído de la lectura del potenciómetro int serialCheck = 1; //Guarda el estado de actividad del Serial int escrito = 1; //Utilizado para no sobrecargar el Serial en cada bucle void setup() { pinMode(altavozPin, OUTPUT); //Define el pin del altavoz como salida //Botones como entradas pinMode(buttonPin1, INPUT); pinMode(buttonPin2, INPUT); pinMode(buttonPin3, INPUT); pinMode(buttonPin4, INPUT); pinMode(buttonPin5, INPUT); pinMode(potPin, INPUT); //Potenciómetro como entrada //LEDs como salidas pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); Serial.begin(9600); //Comienza la comunicación via Serial } void loop(){ ldrState1 = analogRead(0); //Asigna a las variables ldrState su correspondiente lectura del sensor ldrState2 = analogRead(1); ldrState3 = analogRead(2); ldrState4 = analogRead(3); ldrState5 = analogRead(4); pot = analogRead(potPin); //Asigna a pot la lectura del potenciómetro valorPot = pot / 325; //Mediante experimentación, he descubierto que este es el número más adecuado para aplicar la tasa de aumento o reducción maestra buttonState1 = digitalRead(buttonPin1); //Asigna a los buttonState los estados de su respectivo botón buttonState2 = digitalRead(buttonPin2); buttonState3 = digitalRead(buttonPin3); buttonState4 = digitalRead(buttonPin4); buttonState5 = digitalRead(buttonPin5); if (buttonState1 != lastButtonState1 && buttonState1 == HIGH){ //En caso de que el botón haya sido soltado una vez, y que esté siendo pulsado, ldrSeleccionado = ldrSeleccionado + 1; //cambia el ldr/nota al que se aplicará el cambio ldrSeleccionado = ldrSeleccionado % 5; //y se reduce a 0, 1, 2, 3 ó 4 switch (ldrSeleccionado){ //Dependiendo del número seleccionado, ilumina un led determinado case 0: digitalWrite(13, HIGH); digitalWrite(12, LOW); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); break; case 1: digitalWrite(13, LOW); digitalWrite(12, HIGH); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); break; case 2: digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(10, HIGH); digitalWrite(9, LOW); digitalWrite(8, LOW); break; case 3: digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(10, LOW); digitalWrite(9, HIGH); digitalWrite(8, LOW); break; case 4: digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, HIGH); break; } } lastButtonState1 = buttonState1; //Asigna el estado del botón a lastButtonState if (buttonState2 != lastButtonState2 && buttonState2 == HIGH){ //Igual que en el if anterior, pero aquí se disminuye switch (ldrSeleccionado){ //en 5 el tono del ldr/nota seleccionada mediante el primer botón case 0: //y se reduce a números entre 0 y 255 nota1 = nota1 - 5; nota1 = nota1 % 255; break; case 1: nota2 = nota2 - 5; nota2 = nota2 % 255; break; case 2: nota3 = nota3 - 5; nota3 = nota3 % 255; break; case 3: nota4 = nota4 - 5; nota4 = nota4 % 255; break; case 4: nota4 = nota5 - 5; nota4 = nota5 % 255; break; } } lastButtonState2 = buttonState2; if (buttonState3 != lastButtonState3 && buttonState3 == HIGH){ //Igual que en el if anterior, pero aumenta en 5 el tono seleccionado switch (ldrSeleccionado){ case 0: nota1 = nota1 + 5; nota1 = nota1 % 255; break; case 1: nota2 = nota2 + 5; nota2 = nota2 % 255; break; case 2: nota3 = nota3 + 5; nota3 = nota3 % 255; break; case 3: nota4 = nota4 + 5; nota4 = nota4 % 255; break; case 4: nota4 = nota4 + 5; nota4 = nota4 % 255; break; } } lastButtonState3 = buttonState3; if (buttonState4 != lastButtonState4 && buttonState4 == HIGH){ //Multiplica todas las notas por valorPot; selector maestro nota1 = nota1 * valorPot; nota2 = nota2 * valorPot; nota3 = nota3 * valorPot; nota4 = nota4 * valorPot; nota5 = nota5 * valorPot; } lastButtonState4 = buttonState4; if (buttonState5 != lastButtonState5 && buttonState5 == HIGH){ //Resetea las notas a sus valores iniciales nota1 = 30; nota2 = 80; nota3 = 130; nota4 = 180; nota5 = 230; } if (ldrState1 < treshold1){ //comprueba si la lectura del LDR está por debajo del umbral. ldrState1 = 1; //Si es así, asigna 1 a ldrState. En caso contrario, le asigna un 0. } else{ ldrState1 = 0; } if (ldrState2 < treshold1){ //ídem ldrState2 = 1; } else{ ldrState2 = 0; } if (ldrState3 < treshold1){ //ídem ldrState3 = 1; } else{ ldrState3 = 0; } if (ldrState4 < treshold1){ //ídem ldrState4 = 1; } else{ ldrState4 = 0; } if (ldrState5 < treshold2){ //ídem ldrState5 = 1; } else{ ldrState5 = 0; } //Nota 1 if (ldrState1 == 1){ //Si ldrState es 1, escribe la nota correspondiente en el altavoz, analogWrite(altavozPin, nota1); //y comunica al Serial información diversa: pulsaciones, valores... if (serialCheck == 1){ Serial.print(" | 1: "); Serial.print(ldrState1); Serial.print(" - "); Serial.print(nota1); Serial.print(" | 2: "); Serial.print(ldrState2); Serial.print(" - "); Serial.print(nota2); Serial.print(" | 3: "); Serial.print(ldrState3); Serial.print(" - "); Serial.print(nota3); Serial.print(" | 4: "); Serial.print(ldrState4); Serial.print(" - "); Serial.print(nota4); Serial.print(" | 5: "); Serial.print(ldrState5); Serial.print(" - "); Serial.print(nota5); Serial.print(" | "); Serial.println(valorPot); escrito = 0; } } //Nota 2 if (ldrState2 == 1){ //Ídem analogWrite(altavozPin, nota2); Serial.print(" | 1: "); Serial.print(ldrState1); Serial.print(" - "); Serial.print(nota1); Serial.print(" | 2: "); Serial.print(ldrState2); Serial.print(" - "); Serial.print(nota2); Serial.print(" | 3: "); Serial.print(ldrState3); Serial.print(" - "); Serial.print(nota3); Serial.print(" | 4: "); Serial.print(ldrState4); Serial.print(" - "); Serial.print(nota4); Serial.print(" | 5: "); Serial.print(ldrState5); Serial.print(" - "); Serial.print(nota5); Serial.print(" | "); Serial.println(valorPot); escrito = 0; } //Nota 3 if (ldrState3 == 1){ //Ídem analogWrite(altavozPin, nota3); Serial.print(" | 1: "); Serial.print(ldrState1); Serial.print(" - "); Serial.print(nota1); Serial.print(" | 2: "); Serial.print(ldrState2); Serial.print(" - "); Serial.print(nota2); Serial.print(" | 3: "); Serial.print(ldrState3); Serial.print(" - "); Serial.print(nota3); Serial.print(" | 4: "); Serial.print(ldrState4); Serial.print(" - "); Serial.print(nota4); Serial.print(" | 5: "); Serial.print(ldrState5); Serial.print(" - "); Serial.print(nota5); Serial.print(" | "); Serial.println(valorPot); escrito = 0; } //Nota 4 if (ldrState4 == 1){ //Ídem analogWrite(altavozPin, nota4); Serial.print(" | 1: "); Serial.print(ldrState1); Serial.print(" - "); Serial.print(nota1); Serial.print(" | 2: "); Serial.print(ldrState2); Serial.print(" - "); Serial.print(nota2); Serial.print(" | 3: "); Serial.print(ldrState3); Serial.print(" - "); Serial.print(nota3); Serial.print(" | 4: "); Serial.print(ldrState4); Serial.print(" - "); Serial.print(nota4); Serial.print(" | 5: "); Serial.print(ldrState5); Serial.print(" - "); Serial.print(nota5); Serial.print(" | "); Serial.println(valorPot); escrito = 0; } //Nota 5 if (ldrState5 == 1){ //Ídem analogWrite(altavozPin, nota5); Serial.print(" | 1: "); Serial.print(ldrState1); Serial.print(" - "); Serial.print(nota1); Serial.print(" | 2: "); Serial.print(ldrState2); Serial.print(" - "); Serial.print(nota2); Serial.print(" | 3: "); Serial.print(ldrState3); Serial.print(" - "); Serial.print(nota3); Serial.print(" | 4: "); Serial.print(ldrState4); Serial.print(" - "); Serial.print(nota4); Serial.print(" | 5: "); Serial.print(ldrState5); Serial.print(" - "); Serial.print(nota5); Serial.print(" | "); Serial.println(valorPot); escrito = 0; } if (ldrState1 == 0 && ldrState2 == 0 && ldrState3 == 0 && ldrState4 == 0 && ldrState5 == 0){ //Si no está "pulsado" ningún LDR, no envía información al altavoz. analogWrite(altavozPin, 0); if (escrito == 0);{ Serial.print(" | 1: "); Serial.print(ldrState1); Serial.print(" - "); Serial.print(nota1); Serial.print(" | 2: "); Serial.print(ldrState2); Serial.print(" - "); Serial.print(nota2); Serial.print(" | 3: "); Serial.print(ldrState3); Serial.print(" - "); Serial.print(nota3); Serial.print(" | 4: "); Serial.print(ldrState4); Serial.print(" - "); Serial.print(nota4); Serial.print(" | 5: "); Serial.print(ldrState5); Serial.print(" - "); Serial.print(nota5); Serial.print(" | "); Serial.print(pot); Serial.print(" - "); Serial.println(valorPot); escrito = 1; } } }