Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.38 KB | None | 0 0
  1. #include <util/delay.h>
  2. #include <LiquidCrystal.h>
  3.  
  4. LiquidCrystal lcd(12, NULL, 11, 9,8,7,6);
  5.  
  6. const int speakerPin = 4;
  7. volatile int mod = 0; // 0 - stop, 1 - play
  8. volatile int track = 0; // numarul piesei
  9. volatile int n;
  10.  
  11. const int length[8] = {73,69,71,29,51,77,64,63}; // numarul de note din fiecare piesa
  12. const char * notes[8] = {"ggagsed deggsgg ggagsed deggsgg DCbCDbCbabCabagabgagsgasgsesgeseddeggsgg ", \
  13. "ddaagfedcdefga ddaagfedcdefga avgavCDagfdefgfgavaagfedfedgfgavCDagfed" , \
  14. "cfffgagavCavafggfcfffgagavCavafggffaCDCvagfgavCcfagfccfffgagavCavafggf " , \
  15. "faagfvvagaCCbCaDCvagfeagffef ", \
  16. "aavCagfgagdgavCaggfgagff vavCDDaaCagfecavCagfgagff ", \
  17. "cffefaagCCCvagacffefaagCffeedcCCCfvaagCCCfvaagDDDCvavgavCffgaDDDCvavgavCffgf "
  18. "ggdgadbabCbaggsesgabsedd DCbCbabgasedggsgagdbbabCbabCbagsgCbagg ", \
  19. "egbbbaCbagabgegasedeaaeesgsedgabbbaCbag DD bb baCdagabgegasede "} ;
  20. const int beats[8][77] = { { 2,2,1,1,1,1,4,2,2,2,2,2,2,4,2,2,2,2,1,1,1,1,4,2,2,2,2,2,2,4,2,2,3,1,1,1,1,1,3,1,1,1,1,1,3,1,1,1,1,1,3,1,1,1,1,1,3,1,1,1,1,1,3,1,2,2,2,2,2,2,4,2,2 }, \
  21. { 2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,4,2,2,2,2,2,2,4,1,1,2,4,2,2,2,2,2,2,2,2,2,2,8 } , \
  22. { 2,2,2,2,2,1,1,1,1,2,2,2,1,1,2,2,6,2,2,2,2,2,1,1,1,1,2,2,2,1,1,2,2,6,1,1,3,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,4,4,2,2,2,2,1,1,1,1,2,2,2,1,1,2,2,6,2 } , \
  23. { 2,3,1,2,2,2,2,2,2,2,2,2,2,6,2,3,1,2,2,2,2,2,2,2,2,2,2,6,2 }, \
  24. { 2,3,1,2,2,4,4,3,1,2,2,8,3,1,2,2,3,1,4,2,2,3,1,6,2,3,1,2,2,2,2,2,2,2,2,2,2,6,2,2,2,2,2,4,4,2,2,3,1,8,8}, \
  25. { 2,2,3,1,2,2,2,2,2,2,3,1,2,2,4,2,2,3,1,2,2,2,2,2,2,3,1,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,1,1,3,1,2,2,4,3,1,2,2,2,2,4,2,1,1,3,1,2,2,4,8}, \ { 2,4,2,2,4,4,2,2,2,2,4,2,2,4,2,2,2,2,2,2,4,3,1,6,2,4,2,2,4,4,2,2,2,2,3,1,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,4,3,1,6,8 }, \
  26. { 2,2,2,2,2,2,2,2,2,6,2,2,2,2,2,2,2,2,2,6,2,2,2,2,2,4,2,2,6,2,2,2,2,2,2,2,2,2,4,2,2,4,2,2,4,2,2,2,2,2,2,6,2,2,2,2,2,2,2,2,2,8,8 }};
  27. const int tempo[8] = {150,150,150,150,150,150}; //,150,150};
  28. const char * piesa[8] = {"Ding Dong Merrily on High ", \
  29. "God Rest Ye Merry Gentlemen ", \
  30. "O Little Town of Bethlehem ", \
  31. "While Shephards Watched ", \
  32. "In The Bleak Midwinter ", \
  33. "Hark the Herald ", \
  34. "O come all Ye Faithful ", \
  35. "O Come O Come Emmanuel " };
  36.  
  37. void playTone(int tone, int duration) {
  38. for (long i = 0; i < duration * 1000L; i += tone * 2) {
  39. digitalWrite(speakerPin, HIGH);
  40. delayMicroseconds(tone);
  41. digitalWrite(speakerPin, LOW);
  42. delayMicroseconds(tone);
  43. }
  44. }
  45.  
  46. void playNote(char note, int duration) {
  47.  
  48. const char names[] = { 'c', 'd', 'e', 'f', 's', 'g', 'a', 'v', 'b', 'C', 'D', 'E' }; // note
  49. const int tones[] = { 1915, 1700, 1519, 1432, 1352, 1275, 1136, 1073, 1014, 956, 852, 758 }; // frecvente
  50.  
  51. for (int i = 0; i < 12; i++) {
  52. if (names[i] == note) playTone(tones[i], duration);
  53. }
  54. }
  55.  
  56. void setup() {
  57. pinMode(speakerPin, OUTPUT);
  58. lcd.begin(16, 2);
  59. lcd.noCursor();
  60. //activare int0 si int1
  61. EIMSK |= (1 << INT0);
  62. EIMSK |= (1 << INT1);
  63. // sei();
  64. }
  65.  
  66. void loop()
  67. {
  68. if (mod==0)
  69. {
  70. lcd.setCursor(0,0);
  71. lcd.print("Stop");
  72. lcd.setCursor(5,0);
  73. lcd.print("Piesa ");
  74. lcd.print(track+1);
  75. lcd.setCursor(0,1);
  76. lcd.print(" ");
  77. }
  78. else
  79. {
  80. for (n = 0; n < length[track]; n++)
  81. {
  82. if (mod==0) break;
  83. lcd.setCursor(0,0);
  84. lcd.print("Play");
  85. lcd.setCursor(5,0);
  86. lcd.print("Piesa ");
  87. lcd.print(track+1);
  88. lcd.setCursor(0,1);
  89. for (int j=n; j<(n+30); j++) lcd.print(piesa[track][j % 30]);
  90. if (notes[track][n] == ' ') delay(beats[track][n] * tempo[track]); // pauză
  91. else playNote(notes[track][n], beats[track][n] * tempo[track]);
  92. }
  93. // pauza intre note
  94. delay(tempo[track] / 2);
  95. }
  96. }
  97.  
  98. ISR(INT0_vect) {
  99. mod=!mod;
  100. _delay_ms(400);
  101. }
  102.  
  103. ISR(INT1_vect) {
  104. track++;
  105. track = (track % 8);
  106. n = 0; // resetez la prima nota din melodie
  107. _delay_ms(400);
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement