开启左侧

音乐喷泉 - 陈宗燕 潘长林

[复制链接]
发表于 2017-8-23 23:57:08 | 显示全部楼层 |阅读模式
音乐喷泉 - 陈宗燕 潘长林
创意来源:
       某一次在广场上见到大人和小孩在喷泉上跑来跑去,玩得特别刺激一经过喷泉的区域水就会自动出来,没有经过喷泉水就停止往上喷于是,我们想做一个小型的音乐喷泉,它可以随音乐的旋律,周围环境声音的分贝值,人与喷泉的距离的远近而改变水柱的高低。

作品简介:
       该作品是由Arduino Uno主控板,Arduino乌诺扩展板,功放模块,LED,扬声器,水泵,分贝模块,超声波模块,L293D驱动芯片,降压模块等来实现音乐喷泉的各个功能。
其中的的阿尔杜伊诺的主控板通过分贝模块采集周围环境声音分贝值的改变量控制喷泉水柱的高低;功放模块可以实现通过与手机,电脑等的音频接口连接播放音乐进而改变喷泉的水柱高低;超声波模块可以实现喷泉的水柱随人的距离远近的改变而改变的功能。

作品用途:
       可用于欣赏,自动迎接客人:客人一来,音乐泉 分贝模块扑抓到声音,就会自动喷出水柱;可用于变魔术:通过控制手与音乐喷泉的距离来改变水柱的高低(类似浮尘子);可以当成一个音响:通过与手机,电脑等接口连接,进而播放音乐,观看水柱来放松心情;可以用来装饰,音乐喷泉下的小抽屉可用来收纳ü盘等小物品。

作品图片:
图片 1.png

图片 2.png

图片 3.png

程序源代码:
  1. //*****************
  2. //音乐喷泉(广西师范大学:陈宗燕 潘长林)
  3. //*****************
  4. int modelPin1 = A0, modelPin2 = A1; //音乐模式(0 1,1 0)、分贝模式(0 0)、超声波模式(1 1)切换模拟输入引脚
  5. int decibelPin = A2;               //分贝模块模拟输入引脚
  6. int trigPin = A3, echoPin = A4;   //超声波trigle引脚,超声波echo引脚
  7. int musicPin = A5;                //音乐模式模拟输入引脚
  8. int motorENA = 3;                  //5,电机驱动引脚
  9. int motorSpeed[] = {60, 70, 80, 85, 90, 95, 100, 110, 120, 180}; // 水泵电机输出电压数组
  10. int ledPins[] = {2, 4, 5, 6, 7, 8, 9, 10, 11, 12}; // LED输出引脚编号数组
  11. int pinCount = 10;                // 引脚个数(应和LED引脚编号数组相同)
  12. int workValue;                     //LED、水泵电机输出if值
  13. int distanceValue;                 //超声波测距距离

  14. void work();
  15. void distance();
  16. void ledBegin();
  17. void workLed();

  18. void setup() {
  19.   Serial.begin(9600);
  20.   pinMode(modelPin1, INPUT);       //音乐模式、分贝模式、超声波模式切换模拟输入
  21.   pinMode(modelPin2, INPUT);
  22.   pinMode(decibelPin, INPUT);      //分贝模块
  23.   pinMode(motorENA, OUTPUT);       //水泵电机
  24.   pinMode(trigPin, OUTPUT);        //超声波
  25.   pinMode(echoPin, INPUT);         //超声波
  26.   for (int thisPin = 0; thisPin <= pinCount; thisPin++)
  27.   {
  28.     pinMode(ledPins[thisPin], OUTPUT);//LED
  29.   }
  30.   ledBegin();//引用开机LED灯光效果
  31. }

  32. void loop() {
  33.   int modelValue1 = digitalRead(modelPin1); //音乐模式、分贝模式、超声波模式切换模拟输入数值
  34.   int modelValue2 = digitalRead(modelPin2);
  35.   Serial.print(" modelValue1= ");
  36.   Serial.print(modelValue1);
  37.   Serial.print(" modelValue2= ");
  38.   Serial.println(modelValue2);

  39.   if ((modelValue1 == 0) && (modelValue2 == 0)) {        //分贝模式(0 0)
  40.     workValue = map(analogRead(decibelPin), 0, 680, 0, 1023);
  41.     work();
  42.     Serial.print("decibelValue=");
  43.     Serial.println(workValue);
  44.   }

  45.   else if ((modelValue1 == 1) && (modelValue2 == 0))  //超声波模式(1 1)
  46.   {
  47.     distance();//超声波测距
  48.     Serial.print("distanceValue=");
  49.     Serial.println(distanceValue);
  50.     workValue = map(distanceValue, 13, 35, 0, 1023);
  51.     if (distanceValue <= 50)
  52.     {
  53.       work();
  54.     }
  55.     else
  56.     { analogWrite(motorENA, 0);
  57.       for (int thisPin = 0; thisPin <= pinCount; thisPin++)
  58.       {
  59.         digitalWrite(ledPins[thisPin], LOW);
  60.       }
  61.     }
  62.   }
  63.   else     //音乐模式(0 1)或(1 0)
  64.   { int  musicValue = analogRead(musicPin);
  65.     workValue = map(musicValue, 40, 400, 0, 1023);
  66.     Serial.print("musicValue=");
  67.     Serial.println(musicValue);
  68.     work();
  69.   }
  70. }

  71. //=================
  72. //LED、水泵电机运行
  73. //=================
  74. void work() {
  75.   if ( (workValue >= 0) && (workValue <= 100))
  76.   { for (int thisPin = 0; thisPin < 1; thisPin++)
  77.     { analogWrite(motorENA, motorSpeed[0]);
  78.       digitalWrite(ledPins[thisPin], HIGH);
  79.     }
  80.     for (int thisPin = 1; thisPin < pinCount; thisPin++)
  81.     {
  82.       digitalWrite(ledPins[thisPin], LOW);
  83.     }
  84.   }

  85.   else if ((workValue > 100) && (workValue <= 200))
  86.   { for (int thisPin = 0; thisPin < 2; thisPin++)
  87.     { analogWrite(motorENA, motorSpeed[1]);
  88.       digitalWrite(ledPins[thisPin], HIGH);
  89.     }
  90.     for (int thisPin = 2; thisPin < pinCount; thisPin++)
  91.     {
  92.       digitalWrite(ledPins[thisPin], LOW);
  93.     }
  94.   }

  95.   else if ( (workValue > 200) && (workValue <= 300))
  96.   { for (int thisPin = 0; thisPin < 3; thisPin++)
  97.     { analogWrite(motorENA, motorSpeed[2]);
  98.       digitalWrite(ledPins[thisPin], HIGH);
  99.     }
  100.     for (int thisPin = 3; thisPin < pinCount; thisPin++) {
  101.       digitalWrite(ledPins[thisPin], LOW);
  102.     }
  103.   }

  104.   else if ( (workValue > 300) && (workValue <= 400))
  105.   { for (int thisPin = 0; thisPin < 4; thisPin++)
  106.     { analogWrite(motorENA, motorSpeed[3]);
  107.       digitalWrite(ledPins[thisPin], HIGH);
  108.     }
  109.     for (int thisPin = 4; thisPin < pinCount; thisPin++) {
  110.       digitalWrite(ledPins[thisPin], LOW);
  111.     }
  112.   }

  113.   else if ( (workValue > 400) && (workValue <= 500))
  114.   { for (int thisPin = 0; thisPin < 5; thisPin++)
  115.     { analogWrite(motorENA, motorSpeed[4]);
  116.       digitalWrite(ledPins[thisPin], HIGH);
  117.     }
  118.     for (int thisPin = 5; thisPin < pinCount; thisPin++) {
  119.       digitalWrite(ledPins[thisPin], LOW);
  120.     }
  121.   }

  122.   else if ( (workValue > 500) && (workValue <= 600))
  123.   { for (int thisPin = 0; thisPin < 6; thisPin++)
  124.     { analogWrite(motorENA, motorSpeed[5]);
  125.       digitalWrite(ledPins[thisPin], HIGH);
  126.     }
  127.     for (int thisPin = 6; thisPin < pinCount; thisPin++) {
  128.       digitalWrite(ledPins[thisPin], LOW);
  129.     }
  130.   }

  131.   else if ( (workValue > 600) && (workValue <= 700))
  132.   { for (int thisPin = 0; thisPin < 7; thisPin++)
  133.     { analogWrite(motorENA, motorSpeed[6]);
  134.       digitalWrite(ledPins[thisPin], HIGH);
  135.     }
  136.     for (int thisPin = 7; thisPin < pinCount; thisPin++) {
  137.       digitalWrite(ledPins[thisPin], LOW);
  138.     }
  139.   }

  140.   else if ( (workValue > 700) && (workValue <= 800))
  141.   { for (int thisPin = 0; thisPin < 8; thisPin++)
  142.     { analogWrite(motorENA, motorSpeed[7]);
  143.       digitalWrite(ledPins[thisPin], HIGH);
  144.     }
  145.     for (int thisPin = 8; thisPin < pinCount; thisPin++) {
  146.       digitalWrite(ledPins[thisPin], LOW);
  147.     }
  148.   }

  149.   else if ((workValue > 800) && (workValue <= 900))
  150.   { for (int thisPin = 0; thisPin < 9; thisPin++)
  151.     { analogWrite(motorENA, motorSpeed[8]);
  152.       digitalWrite(ledPins[thisPin], HIGH);
  153.     }
  154.     for (int thisPin = 9; thisPin < pinCount; thisPin++) {
  155.       digitalWrite(ledPins[thisPin], LOW);
  156.     }
  157.   }

  158.   else if (workValue > 900) //&& (workValue <= 1023))
  159.   { for ( int thisPin = 0; thisPin < pinCount; thisPin++)
  160.     { analogWrite(motorENA, motorSpeed[9]);
  161.       digitalWrite(ledPins[thisPin], HIGH);
  162.     }
  163.   }
  164.   else
  165.   { for (int thisPin = 0; thisPin <= pinCount; thisPin++)
  166.     { analogWrite(motorENA, 0);
  167.       digitalWrite(ledPins[thisPin], LOW);
  168.     }
  169.   }
  170.   delay(50);
  171. }

  172. //=================
  173. //超声波测距
  174. //=================
  175. void distance()
  176. {
  177.   digitalWrite(trigPin, LOW);
  178.   delayMicroseconds(2);
  179.   digitalWrite(trigPin, HIGH);
  180.   delayMicroseconds(10);
  181.   digitalWrite(trigPin, LOW);
  182.   distanceValue = pulseIn(echoPin, HIGH) / 58;
  183. }

  184. //=================
  185. //开机LED灯光效果
  186. //=================
  187. void ledBegin() {
  188.   int timer = 100;
  189.   for (int thisPin = 0; thisPin < pinCount; thisPin++) { // 从第零个到最后一个
  190.     digitalWrite(ledPins[thisPin], HIGH);  // 给引脚输出高电平:
  191.     delay(timer);
  192.     digitalWrite(ledPins[thisPin], LOW);  // 将引脚输出低电平:
  193.   }
  194.   for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) {// 从最后一个到第零个
  195.     digitalWrite(ledPins[thisPin], HIGH);
  196.     delay(timer);
  197.     digitalWrite(ledPins[thisPin], LOW);
  198.   }
  199. }
复制代码

程序源文件:
music_fountain_panzhanglin_chenzongyan_.ino (6.6 KB, 下载次数: 0)
回复

使用道具 举报

发表于 2017-8-29 17:20:48 | 显示全部楼层
可惜没图片
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩课程推荐

关于我们

帮助中心

商务合作

点击这里给我发消息

关注微信公众号

Copyright © 2016-2017 i创学院 - 上海享渔教育科技有限公司 Powered by Discuz!     ( 沪ICP备16033954号-1 )