Advertisement
Guest User

Arduino будильник

a guest
Aug 25th, 2012
552
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.14 KB | None | 0 0
  1. #include <LiquidCrystal.h>
  2.  
  3. #define OCTAVE_OFFSET 0
  4. #define TONE_PIN 8
  5.  
  6. #define NOTE_C4  262
  7. #define NOTE_CS4 277
  8. #define NOTE_D4  294
  9. #define NOTE_DS4 311
  10. #define NOTE_E4  330
  11. #define NOTE_F4  349
  12. #define NOTE_FS4 370
  13. #define NOTE_G4  392
  14. #define NOTE_GS4 415
  15. #define NOTE_A4  440
  16. #define NOTE_AS4 466
  17. #define NOTE_B4  494
  18. #define NOTE_C5  523
  19. #define NOTE_CS5 554
  20. #define NOTE_D5  587
  21. #define NOTE_DS5 622
  22. #define NOTE_E5  659
  23. #define NOTE_F5  698
  24. #define NOTE_FS5 740
  25. #define NOTE_G5  784
  26. #define NOTE_GS5 831
  27. #define NOTE_A5  880
  28. #define NOTE_AS5 932
  29. #define NOTE_B5  988
  30. #define NOTE_C6  1047
  31. #define NOTE_CS6 1109
  32. #define NOTE_D6  1175
  33. #define NOTE_DS6 1245
  34. #define NOTE_E6  1319
  35. #define NOTE_F6  1397
  36. #define NOTE_FS6 1480
  37. #define NOTE_G6  1568
  38. #define NOTE_GS6 1661
  39. #define NOTE_A6  1760
  40. #define NOTE_AS6 1865
  41. #define NOTE_B6  1976
  42. #define NOTE_C7  2093
  43. #define NOTE_CS7 2217
  44. #define NOTE_D7  2349
  45. #define NOTE_DS7 2489
  46. #define NOTE_E7  2637
  47. #define NOTE_F7  2794
  48. #define NOTE_FS7 2960
  49. #define NOTE_G7  3136
  50. #define NOTE_GS7 3322
  51. #define NOTE_A7  3520
  52. #define NOTE_AS7 3729
  53. #define NOTE_B7  3951
  54.  
  55. int notes[] = {
  56.   0,
  57.   NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
  58.   NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
  59.   NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
  60.   NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
  61. };
  62.  
  63. char *song = "MissionImp:d=16,o=6,b=95:32d,32d#,32d,32d#,32d,32d#,32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,a#,g,2d,32p,a#,g,2c#,32p,a#,g,2c,a#5,8c,2p,32p,a#5,g5,2f#,32p,a#5,g5,2f,32p,a#5,g5,2e,d#,8d";
  64.  
  65. // RS, E, DB5, DB6, DB7, DB8
  66. LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
  67.  
  68. int text = 0;
  69. int pos = 0;
  70. int line = 0;
  71.  
  72. void setup()
  73. {
  74.   Serial.begin(9600);
  75.   lcd.begin(16, 2);
  76. }
  77.  
  78. #define isdigit(n) (n >= '0' && n <= '9')
  79. void play_rtttl(char *p)
  80. {
  81.   // Absolutely no error checking in here
  82.  
  83.   byte default_dur = 4;
  84.   byte default_oct = 6;
  85.   int bpm = 63;
  86.   int num;
  87.   long wholenote;
  88.   long duration;
  89.   byte note;
  90.   byte scale;
  91.  
  92.   // format: d=N,o=N,b=NNN:
  93.   // find the start (skip name, etc)
  94.  
  95.   while(*p != ':') p++;    // ignore name
  96.   p++;                     // skip ':'
  97.  
  98.   // get default duration
  99.   if(*p == 'd')
  100.   {
  101.     p++;
  102.     p++;              // skip "d="
  103.     num = 0;
  104.     while(isdigit(*p))
  105.     {
  106.       num = (num * 10) + (*p++ - '0');
  107.     }
  108.     if(num > 0) default_dur = num;
  109.     p++;                   // skip comma
  110.   }
  111.   // get default octave
  112.   if(*p == 'o')
  113.   {
  114.     p++;
  115.     p++;              // skip "o="
  116.     num = *p++ - '0';
  117.     if(num >= 3 && num <=7) default_oct = num;
  118.     p++;                   // skip comma
  119.   }
  120.   // get BPM
  121.   if(*p == 'b')
  122.   {
  123.     p++;
  124.     p++;              // skip "b="
  125.     num = 0;
  126.     while(isdigit(*p))
  127.     {
  128.       num = (num * 10) + (*p++ - '0');
  129.     }
  130.     bpm = num;
  131.     p++;                   // skip colon
  132.   }
  133.  
  134.   // BPM usually expresses the number of quarter notes per minute
  135.   wholenote = (60 * 1000L / bpm) * 4;  // this is the time for whole note (in milliseconds)
  136.  
  137.   // now begin note loop
  138.   while(*p)
  139.   {
  140.     // first, get note duration, if available
  141.     num = 0;
  142.     while(isdigit(*p))
  143.     {
  144.       num = (num * 10) + (*p++ - '0');
  145.     }
  146.  
  147.     if(num) duration = wholenote / num;
  148.     else duration = wholenote / default_dur;  // we will need to check if we are a dotted note after
  149.  
  150.       // now get the note
  151.     note = 0;
  152.  
  153.     switch(*p)
  154.     {
  155.     case 'c':
  156.       note = 1;
  157.       break;
  158.     case 'd':
  159.       note = 3;
  160.       break;
  161.     case 'e':
  162.       note = 5;
  163.       break;
  164.     case 'f':
  165.       note = 6;
  166.       break;
  167.     case 'g':
  168.       note = 8;
  169.       break;
  170.     case 'a':
  171.       note = 10;
  172.       break;
  173.     case 'b':
  174.       note = 12;
  175.       break;
  176.     case 'p':
  177.     default:
  178.       note = 0;
  179.     }
  180.     p++;
  181.  
  182.     // now, get optional '#' sharp
  183.     if(*p == '#')
  184.     {
  185.       note++;
  186.       p++;
  187.     }
  188.  
  189.     // now, get optional '.' dotted note
  190.     if(*p == '.')
  191.     {
  192.       duration += duration/2;
  193.       p++;
  194.     }
  195.  
  196.     // now, get scale
  197.     if(isdigit(*p))
  198.     {
  199.       scale = *p - '0';
  200.       p++;
  201.     }
  202.     else
  203.     {
  204.       scale = default_oct;
  205.     }
  206.  
  207.     scale += OCTAVE_OFFSET;
  208.  
  209.     if(*p == ',')
  210.       p++;       // skip comma for next note (or we may be at the end)
  211.  
  212.     // now play the note
  213.  
  214.     if(note)
  215.     {
  216.       tone(TONE_PIN, notes[(scale - 4) * 12 + note]);
  217.       delay(duration);
  218.       noTone(TONE_PIN);
  219.     }
  220.     else
  221.     {
  222.       delay(duration);
  223.     }
  224.   }
  225. }
  226. void loop(){
  227.   lcd.setCursor(pos, line);
  228.   if (Serial.available() > 0) {
  229.     text = Serial.read();
  230.  
  231.     if (text == 13) {
  232.       pos = 0;
  233.       line++;
  234.     }
  235.     else {
  236.       lcd.print(char(text));
  237.       pos++;
  238.     }  
  239.     lcd.setCursor(pos, line);
  240.  
  241.     if (text == 33) {
  242.       play_rtttl(song);
  243.       while(1);
  244.     }
  245.   }
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement