Advertisement
ahorsewithnoname

Arduino (Leds + Buzzer)

May 2nd, 2021
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.44 KB | None | 0 0
  1. //Se incluyen las librerías necesarias
  2. #include <Servo.h>
  3.  
  4. //Se define la frecuencia a las que suena cada nota
  5.  
  6. #define NOTE_B0  31
  7. #define NOTE_C1  33
  8. #define NOTE_CS1 35
  9. #define NOTE_D1  37
  10. #define NOTE_DS1 39
  11. #define NOTE_E1  41
  12. #define NOTE_F1  44
  13. #define NOTE_FS1 46
  14. #define NOTE_G1  49
  15. #define NOTE_GS1 52
  16. #define NOTE_A1  55
  17. #define NOTE_AS1 58
  18. #define NOTE_B1  62
  19. #define NOTE_C2  65
  20. #define NOTE_CS2 69
  21. #define NOTE_D2  73
  22. #define NOTE_DS2 78
  23. #define NOTE_E2  82
  24. #define NOTE_F2  87
  25. #define NOTE_FS2 93
  26. #define NOTE_G2  98
  27. #define NOTE_GS2 104
  28. #define NOTE_A2  110
  29. #define NOTE_AS2 117
  30. #define NOTE_B2  123
  31. #define NOTE_C3  131
  32. #define NOTE_CS3 139
  33. #define NOTE_D3  147
  34. #define NOTE_DS3 156
  35. #define NOTE_E3  165
  36. #define NOTE_F3  175
  37. #define NOTE_FS3 185
  38. #define NOTE_G3  196
  39. #define NOTE_GS3 208
  40. #define NOTE_A3  220
  41. #define NOTE_AS3 233
  42. #define NOTE_B3  247
  43. #define NOTE_C4  262
  44. #define NOTE_CS4 277
  45. #define NOTE_D4  294
  46. #define NOTE_DS4 311
  47. #define NOTE_E4  330
  48. #define NOTE_F4  349
  49. #define NOTE_FS4 370
  50. #define NOTE_G4  392
  51. #define NOTE_GS4 415
  52. #define NOTE_A4  440
  53. #define NOTE_AS4 466
  54. #define NOTE_B4  494
  55. #define NOTE_C5  523
  56. #define NOTE_CS5 554
  57. #define NOTE_D5  587
  58. #define NOTE_DS5 622
  59. #define NOTE_E5  659
  60. #define NOTE_F5  698
  61. #define NOTE_FS5 740
  62. #define NOTE_G5  784
  63. #define NOTE_GS5 831
  64. #define NOTE_A5  880
  65. #define NOTE_AS5 932
  66. #define NOTE_B5  988
  67. #define NOTE_C6  1047
  68. #define NOTE_CS6 1109
  69. #define NOTE_D6  1175
  70. #define NOTE_DS6 1245
  71. #define NOTE_E6  1319
  72. #define NOTE_F6  1397
  73. #define NOTE_FS6 1480
  74. #define NOTE_G6  1568
  75. #define NOTE_GS6 1661
  76. #define NOTE_A6  1760
  77. #define NOTE_AS6 1865
  78. #define NOTE_B6  1976
  79. #define NOTE_C7  2093
  80. #define NOTE_CS7 2217
  81. #define NOTE_D7  2349
  82. #define NOTE_DS7 2489
  83. #define NOTE_E7  2637
  84. #define NOTE_F7  2794
  85. #define NOTE_FS7 2960
  86. #define NOTE_G7  3136
  87. #define NOTE_GS7 3322
  88. #define NOTE_A7  3520
  89. #define NOTE_AS7 3729
  90. #define NOTE_B7  3951
  91. #define NOTE_C8  4186
  92. #define NOTE_CS8 4435
  93. #define NOTE_D8  4699
  94. #define NOTE_DS8 4978
  95. #define REST      0
  96.  
  97. Servo myservo;
  98.  
  99. //El tempo de la canción y el pin al que está conectado el buzzer:
  100. int tempo = 144;
  101. int buzzer = 11;
  102.  
  103. //Ponemos los pines que usaremos para los leds en un array, de forma que podamos elegir uno aleatorio a la hora de hacer sonar la música
  104. //También añadimos una variable para escoger un número aleatorio y una que guarde el anterior, de forma que no se repitan.
  105. int pinled[] = {10,8,5,3,2};
  106. int randomnumber, prevrand;
  107.  
  108. //En este array va la melodía, aparece cada nota junto a su duración, de forma que puedes hacerlo de la canción que tú quieras.
  109. //La canción escogida ha sido el tema de Hedwig de Harry Potter
  110. //Otras canciones y cómo hacer esto en https://github.com/robsoncouto/arduino-songs
  111. int melody[] = {
  112.   REST, 2, NOTE_D4, 4, NOTE_G4, -4, NOTE_AS4, 8, NOTE_A4, 4,
  113.   NOTE_G4, 2, NOTE_D5, 4,
  114.   NOTE_C5, -2,
  115.   NOTE_A4, -2,
  116.   NOTE_G4, -4, NOTE_AS4, 8, NOTE_A4, 4,
  117.   NOTE_F4, 2, NOTE_GS4, 4,
  118.   NOTE_D4, -1,
  119.   NOTE_D4, 4,
  120.  
  121.   NOTE_G4, -4, NOTE_AS4, 8, NOTE_A4, 4, //10
  122.   NOTE_G4, 2, NOTE_D5, 4,
  123.   NOTE_F5, 2, NOTE_E5, 4,
  124.   NOTE_DS5, 2, NOTE_B4, 4,
  125.   NOTE_DS5, -4, NOTE_D5, 8, NOTE_CS5, 4,
  126.   NOTE_CS4, 2, NOTE_B4, 4,
  127.   NOTE_G4, -1,
  128.   NOTE_AS4, 4,
  129.      
  130.   NOTE_D5, 2, NOTE_AS4, 4,//18
  131.   NOTE_D5, 2, NOTE_AS4, 4,
  132.   NOTE_DS5, 2, NOTE_D5, 4,
  133.   NOTE_CS5, 2, NOTE_A4, 4,
  134.   NOTE_AS4, -4, NOTE_D5, 8, NOTE_CS5, 4,
  135.   NOTE_CS4, 2, NOTE_D4, 4,
  136.   NOTE_D5, -1,
  137.   REST,4, NOTE_AS4,4,  
  138.  
  139.   NOTE_D5, 2, NOTE_AS4, 4,//26
  140.   NOTE_D5, 2, NOTE_AS4, 4,
  141.   NOTE_F5, 2, NOTE_E5, 4,
  142.   NOTE_DS5, 2, NOTE_B4, 4,
  143.   NOTE_DS5, -4, NOTE_D5, 8, NOTE_CS5, 4,
  144.   NOTE_CS4, 2, NOTE_AS4, 4,
  145.   NOTE_G4, -1,
  146.  
  147. };
  148.  
  149. //Calcula el número de notas, y después la duración de una:
  150. int notes = sizeof(melody) / sizeof(melody[0]) / 2;
  151. int wholenote = (60000 * 4) / tempo;
  152. int divider = 0, noteDuration = 0;
  153.  
  154. //Variables usadas a lo largo del programa y pines de los leds
  155. int valor = 0;
  156. int proceso = 1;
  157. bool alreadydid = false;
  158. int pos = 20;
  159. int counter = 0;
  160.  
  161. //Estas, por ejemplo, son para el comparador de tiempos
  162. unsigned long previousMillis = 0;
  163. unsigned long previousMilli = 0;
  164.  
  165. int signo = 1;
  166. int lg = 10;
  167. int ly = 8;
  168. int lr = 5;
  169. int bg = 3;
  170. int br = 2;
  171.  
  172. void setup() {
  173.   //Pone todos los pines en el modo correcto y una configuración inicial para los leds
  174.   Serial.begin(9600);
  175.   myservo.attach(6);
  176.   myservo.write(0);
  177.   pinMode(lg,OUTPUT);
  178.   pinMode(ly,OUTPUT);
  179.   pinMode(lr,OUTPUT);
  180.   pinMode(bg,OUTPUT);
  181.   pinMode(br,OUTPUT);
  182.   pinMode(9,INPUT);
  183.   digitalWrite(lr,HIGH);
  184.   digitalWrite(ly,LOW);
  185.   digitalWrite(lg,LOW);
  186.   digitalWrite(bg,HIGH);
  187.   digitalWrite(br,LOW);
  188. }
  189.  
  190. void loop() {
  191.   unsigned long currentMillis = millis();
  192.   valor = digitalRead(9);
  193.  
  194.   //Si el botón está pulsado:
  195.   if(valor == HIGH){
  196.     //Cambia el signo del proceso (para poder diferenciar entre semáforo rojo y semáforo verde)
  197.     signo *= -1;
  198.     Serial.println(proceso);
  199.     counter++;
  200.     Serial.println(counter);
  201.     previousMillis = currentMillis;
  202.     alreadydid = false;
  203.  
  204.     //Detecta si se mantiene pulsado el botón para poner un modo u otro, y emite un sonido cuando se superan las marcas que indican que se ha llegado el siguiente modo
  205.     if(counter < 9) proceso = 1 * signo;
  206.     if(counter == 9) tone(buzzer, 294, 500);    
  207.     if(counter >= 9 && counter < 18) proceso = 3 * signo;
  208.     if(counter == 18) tone(buzzer, 294, 500);
  209.     if(counter >= 18 && counter < 27)proceso = 4 * signo;
  210.     if(counter >= 27) proceso = 2 * signo;
  211.   }
  212.  
  213.   //Si el botón deja de pulsarse el contador vuelve a 0 para que no cambie de modo de forma inesperada
  214.   if(valor == LOW) counter = 0;
  215.  
  216.   //Si el proceso es 1 o -1 actúa normal, como un semáforo, realizando la secuencia correspondiente.
  217.   if(proceso == -1 && alreadydid == false){
  218.     if (currentMillis - previousMillis >= 750 && currentMillis - previousMillis < 950) {
  219.       digitalWrite(lg,LOW);
  220.     }
  221.     if (currentMillis - previousMillis >= 950 && currentMillis - previousMillis < 1950) {
  222.       digitalWrite(ly,HIGH);
  223.     }
  224.     if (currentMillis - previousMillis >= 1950) {
  225.       previousMillis = currentMillis;
  226.       digitalWrite(lr,HIGH);
  227.       digitalWrite(ly,LOW);
  228.       digitalWrite(bg,HIGH);
  229.       digitalWrite(br,LOW);
  230.       alreadydid = true;
  231.       myservo.write(100);
  232.     }
  233.   }
  234.  
  235.   if(proceso == 1 && alreadydid == false){
  236.     if (currentMillis - previousMillis >= 750 && currentMillis - previousMillis < 950) {
  237.       digitalWrite(ly,HIGH);
  238.     }
  239.     if (currentMillis - previousMillis >= 950 && currentMillis - previousMillis < 1950) {
  240.       digitalWrite(lr,LOW);
  241.     }
  242.     if (currentMillis - previousMillis >= 1950) {
  243.       digitalWrite(lg,HIGH);
  244.       digitalWrite(ly,LOW);
  245.       digitalWrite(bg,LOW);
  246.       digitalWrite(br,HIGH);
  247.       alreadydid = true;
  248.       previousMillis = currentMillis;
  249.       myservo.write(0);
  250.     }
  251.   }
  252.  
  253.   //Si el proceso es 2 (o -2, en los procesos por encima del 1 el signo es indiferente, puesto que al dar un toque al botón vuelve al modo semáforo) toca la melodía:
  254.   if(proceso == 2 || proceso == -2 && alreadydid == false){
  255.     //Apaga los leds
  256.     digitalWrite(lg,LOW);
  257.     digitalWrite(lr,LOW);
  258.     digitalWrite(ly,LOW);
  259.     digitalWrite(bg,LOW);
  260.     digitalWrite(br,LOW);
  261.    
  262.     for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2) {
  263.       do{
  264.         randomnumber = int(random(0,5));
  265.       }while(randomnumber == prevrand);
  266.    
  267.       divider = melody[thisNote + 1];
  268.       if (divider > 0) {
  269.         noteDuration = (wholenote) / divider;
  270.       } else if (divider < 0) {
  271.         noteDuration = (wholenote) / abs(divider);
  272.         noteDuration *= 1.5;
  273.       }
  274.       prevrand = randomnumber;
  275.       tone(buzzer, melody[thisNote], noteDuration * 0.9);
  276.       if(melody[thisNote] != 0)digitalWrite(pinled[randomnumber],HIGH);
  277.       delay(noteDuration);
  278.       digitalWrite(pinled[randomnumber],LOW);
  279.       noTone(buzzer);
  280.     }
  281.     alreadydid = true;
  282.   }
  283.  
  284.   //Procesos por encima del 2: combinaciones de movimientos de leds
  285.   if(proceso == 3 || proceso == -3){
  286.     if (currentMillis - previousMillis >= 250 && currentMillis - previousMillis < 500) {
  287.       digitalWrite(lg,HIGH);
  288.       digitalWrite(br,HIGH);
  289.     }
  290.     if (currentMillis - previousMillis >= 500 && currentMillis - previousMillis < 750) {
  291.       digitalWrite(ly,HIGH);
  292.       digitalWrite(bg,HIGH);
  293.     }
  294.     if (currentMillis - previousMillis >= 750 && currentMillis - previousMillis < 1000) {
  295.       digitalWrite(lr,HIGH);
  296.     }
  297.     if (currentMillis - previousMillis >= 1000 && currentMillis - previousMillis < 1250) {
  298.       digitalWrite(lr,LOW);
  299.     }
  300.     if (currentMillis - previousMillis >= 1250 && currentMillis - previousMillis < 1500) {
  301.       digitalWrite(ly,LOW);
  302.       digitalWrite(bg,LOW);
  303.     }
  304.     if (currentMillis - previousMillis >= 1500) {
  305.       digitalWrite(lg,LOW);
  306.       digitalWrite(br,LOW);
  307.       previousMillis = currentMillis;
  308.     }
  309.   }
  310.  
  311.   if(proceso == 4 || proceso == -4){
  312.     if (currentMillis - previousMillis >= 250 && currentMillis - previousMillis < 500) {
  313.       digitalWrite(lg,HIGH);
  314.     }
  315.     if (currentMillis - previousMillis >= 500 && currentMillis - previousMillis < 750) {
  316.       digitalWrite(ly,HIGH);
  317.     }
  318.     if (currentMillis - previousMillis >= 750 && currentMillis - previousMillis < 1000) {
  319.       digitalWrite(lr,HIGH);
  320.     }
  321.     if (currentMillis - previousMillis >= 1000 && currentMillis - previousMillis < 1250) {
  322.       digitalWrite(bg,HIGH);
  323.     }
  324.     if (currentMillis - previousMillis >= 1250 && currentMillis - previousMillis < 1500) {
  325.       digitalWrite(br,HIGH);
  326.     }
  327.     if (currentMillis - previousMillis >= 1500 && currentMillis - previousMillis < 1750) {
  328.       digitalWrite(br,LOW);
  329.     }
  330.     if (currentMillis - previousMillis >= 1750 && currentMillis - previousMillis < 2000) {
  331.       digitalWrite(bg,LOW);
  332.     }
  333.     if (currentMillis - previousMillis >= 2000 && currentMillis - previousMillis < 2250) {
  334.       digitalWrite(lr,LOW);
  335.     }
  336.     if (currentMillis - previousMillis >= 2250 && currentMillis - previousMillis < 2500) {
  337.       digitalWrite(ly,LOW);
  338.     }
  339.     if (currentMillis - previousMillis >= 2500) {
  340.       digitalWrite(lg,LOW);
  341.       previousMillis = currentMillis;
  342.     }
  343.   }
  344.  
  345.   //Un delay necesario para que "counter" no aumente desproporcionadamente, el botón mide cerca de 5 veces por segundo (por eso en ocasiones al darle al botón no reacciona, es cuestión de coordinación).
  346.   delay(180);
  347. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement