Intel物联网开发者专区
直播中

dvd1478

11年用户 586经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表 嵌入式技术 制造/封装 模拟技术 连接器 EMC/EMI设计 光电显示 存储技术 EDA/IC设计 处理器/DSP 接口/总线/驱动 控制/MCU RF/无线
私信 关注
[经验]

【Intel Edison试用体验】项目一音乐彩灯

本帖最后由 dvd1478 于 2016-8-3 11:29 编辑

随手做的一个练习,红蓝绿三个LED灯,随着音乐的变化而发生变化。
音乐是由蜂鸣器产生的,响声的长度决定着音调
timeHigh = period / 2 = 1 / (2 * toneFrequency)


* 音的表示方法是         1  2  3  4  5   6  7
* 音的名称(也就是音名) C  D  E  F  G   A  B
* 音的唱名(也就是唱法) DO RE MI FA SOL LA SI
*
* note  frequency       period      timeHigh
* c          261 Hz          3830         1915
* d          294 Hz          3400        1700
* e          329 Hz          3038        1519
* f          349 Hz          2864         1432
* g          392 Hz          2550        1275
* a          440 Hz          2272        1136
* b          493 Hz          2028        1014
* C          523 Hz          1912        956


Edison 采用arduino的编译器进行下载

代码如下:
  1. /* Melody
  2. * (cleft) 2005 D. Cuartielles for K3
  3. *
  4. * This example uses a piezo speaker to play melodies.  It sends
  5. * a square wave of the appropriate frequency to the piezo, generating
  6. * the corresponding tone.
  7. *
  8. * The calculation of the tones is made following the mathematical
  9. * operation:
  10. *
  11. *       timeHigh = period / 2 = 1 / (2 * toneFrequency)
  12. *
  13. * where the different tones are described as in the table:
  14. *
  15. * 音的表示方法是         1  2  3  4  5   6  7
  16. * 音的名称(也就是音名) C  D  E  F  G   A  B
  17. * 音的唱名(也就是唱法) DO RE MI FA SOL LA SI
  18. *
  19. * note  frequency         period  timeHigh
  20. * c          261 Hz          3830  1915
  21. * d          294 Hz          3400  1700
  22. * e          329 Hz          3038  1519
  23. * f          349 Hz          2864  1432
  24. * g          392 Hz          2550  1275
  25. * a          440 Hz          2272  1136
  26. * b          493 Hz          2028  1014
  27. * C          523 Hz          1912  956
  28. *
  29. * http://www.arduino.cc/en/Tutorial/Melody
  30. */

  31. int speakerPin = 2;                  // Grove Buzzer connect to D3


  32. int length = 15; // the number of notes // 音调的数目
  33. char notes[] = "ccggaagffeeddc "; // a space represents a rest // 字符最后的空格代表乐曲间的休息
  34. int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
  35. int tempo = 300;
  36. /* 拍子的时长,
  37. 音乐里的牌子是更具乐曲要求而定的。如果说乐曲寻求规定的速度是每分60拍的话,那么没拍占用的时间就是60分之一,
  38. 也就是一秒,半拍为二分之一秒。若规定速度为每分钟120拍的话,那么灭一排站的时间是半秒,半拍十四分之一秒。
  39. 以此类推,这是拍值。当各种牌制定下来以后,各种拍之也就与牌子连在一起。比如,2/4拍,是以四分音符为一拍,每小节有两拍
  40. http://blog.sina.com.cn/s/blog_5ef4d679010172do.html
  41. */

  42. const int pinLedRed    = 3;
  43. const int pinLedGreen  = 4;
  44. const int pinLedBlue   = 5;

  45. void selectRGB(int i)
  46. {
  47.     switch (i)
  48.     {
  49.     case 0:
  50.       digitalWrite(pinLedRed,HIGH);//红色LED亮
  51.       digitalWrite(pinLedGreen,LOW);
  52.       digitalWrite(pinLedBlue,LOW);
  53.       break;
  54.     case 1:
  55.       digitalWrite(pinLedRed,HIGH);//红、绿色LED亮
  56.       digitalWrite(pinLedGreen,HIGH);
  57.       digitalWrite(pinLedBlue,LOW);
  58.       break;
  59.     case 2:
  60.       digitalWrite(pinLedRed,LOW);//绿色LED亮
  61.       digitalWrite(pinLedGreen,HIGH);
  62.       digitalWrite(pinLedBlue,LOW);
  63.       break;
  64.     case 3:
  65.       digitalWrite(pinLedRed,LOW);//绿、蓝色LED亮
  66.       digitalWrite(pinLedGreen,HIGH);
  67.       digitalWrite(pinLedBlue,HIGH);
  68.       break;
  69.     case 4:
  70.       digitalWrite(pinLedRed,LOW);//蓝色LED亮
  71.       digitalWrite(pinLedGreen,LOW);
  72.       digitalWrite(pinLedBlue,HIGH);
  73.       break;
  74.     case 5:
  75.       digitalWrite(pinLedRed,HIGH);//红、蓝色LED亮
  76.       digitalWrite(pinLedGreen,LOW);
  77.       digitalWrite(pinLedBlue,HIGH);
  78.       break;
  79.     case 6:
  80.       digitalWrite(pinLedRed,HIGH);//红、绿、蓝色LED亮
  81.       digitalWrite(pinLedGreen,HIGH);
  82.       digitalWrite(pinLedBlue,HIGH);
  83.       break;
  84.    default:
  85.       digitalWrite(pinLedRed,LOW);//全灭
  86.       digitalWrite(pinLedGreen,LOW);
  87.       digitalWrite(pinLedBlue,LOW);
  88.       break;
  89.    }
  90. }


  91. void playTone(int tone, int duration) {
  92.     for (long i = 0; i < duration * 1000L; i += tone * 2) {
  93.         digitalWrite(speakerPin, HIGH);
  94.         //digitalWrite(pinLed, HIGH);
  95.         delayMicroseconds(tone);
  96.         digitalWrite(speakerPin, LOW);
  97.         //digitalWrite(pinLed, LOW);
  98.         delayMicroseconds(tone);
  99.     }
  100. }

  101. void playNote(char note, int duration) {
  102.     char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  103.     int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

  104.     // play the tone corresponding to the note name
  105.     for (int i = 0; i < 8; i++) {
  106.       // 按音调名演奏音调
  107.         if (names[i] == note) {
  108.             playTone(tones[i], duration);
  109.             selectRGB(i);
  110.         }
  111.     }
  112. }

  113. void setup()
  114. {
  115.     pinMode(speakerPin, OUTPUT);

  116.     // Configure the LED's pin for output signals.
  117.     pinMode(pinLedRed, OUTPUT);
  118.     pinMode(pinLedGreen, OUTPUT);
  119.     pinMode(pinLedBlue, OUTPUT);
  120. }

  121. void loop()
  122. {
  123.     for (int i = 0; i < length; i++)
  124.     {
  125.         if (notes[i] == ' ')
  126.         {
  127.             delay(beats[i] * tempo); // rest
  128.         }
  129.         else
  130.         {
  131.             playNote(notes[i], beats[i] * tempo);
  132.         }

  133.         // pause between notes
  134.         delay(tempo / 2);
  135.     }
  136. }



回帖(1)

birdinskydzfsy

2016-8-11 17:32:49
求效果图呢
举报

更多回帖

发帖
×
20
完善资料,
赚取积分