源代码 发表于 2016-6-13 21:50:02

雷雨季节|造一朵可充电的Mini闪电云

号外!号外!还记得当年那朵被困在家中的闪电云吗?设计师Richard Clarkson设计的这个外形萌萌又超逼真的东西让无数屌丝、女神和欧巴动心的云灯The Cloud,经过漫长的等待某天它终于登上众筹网站了,而当小编打开网页看到它的众筹售价为两万多人民币时,当场就哭晕在麦田里。。看来注定与我们普通百姓无缘,按照以往小编爱动手的尿性是绝对不会就这样轻易的狗带,所以励志自己要亲手造一个!!

在造闪电云之前,我们不妨再重温一下这段视频。{:5_162:}
https://v.youku.com/v_show/id_XNzM1NzA0NTg4.html

       小编一直想先造一个mini版闪电云,可以充电后任意挂在自己想挂的地方,这样妈妈就不用担心我的闪电云要一直连着一根电源线啦,光想想就觉得很酸爽,哈哈~~~            此外!还要要求它能有电闪雷鸣的效果,最值得一提的一个功能是:当有人从闪电云下面经过时,如果你够幸运你将会遇到七彩云,否则就遇到雷电交加非常有娱乐性,当然你可以通过调整代码里的参数控制七彩云出现的概率。

下面是小编本次制作的可充电Mini闪电云视频~~https://v.youku.com/v_show/id_XMTYwNzE5NDQwNA==.html
说的这么牛逼好像真的一样,那么问题来了!需要准备哪些材料?你快说啊!!


炫彩 WS2812 LED灯带 洞洞板
DFPlayer Mini 播放器模块
热熔胶枪及胶棒
小喇叭 棉花
高电平继电器导线若干
人体热释电红外传感器美纹胶带
5V升压模块 发光二极管
Arduino Pro mini 塑料饮料瓶一个
自锁开关 舵机拐臂
220欧姆电阻
电源充电接头
彩色排针
1000mA锂电池
16v330uF电容
16G内存卡
Mini闪电云电路连接图


制作步骤第一步 硬件部分制作【首先看电路连接图,按照我画好的电路连接各硬件。】
1、将充电接口、自锁开关、电池接口、发光二极管、电阻按照电路图焊接好电池及开关电路板。


2、将3.7v升5v升压模块并联焊接到开关电池板上。


3、用洞洞板、彩色排针、电容焊接一块传感器链接扩展板,并将Arduino mini板上的D6、D9、D13数字引脚分别用黄线与扩展板黄色排针焊接相连,VCC脚和GND脚也分别用红色和黑色导线与扩展板正负极相连焊接。


4、再将升压模块输出端正负极与扩展板正负极焊接相连,整个控制部分就链接好了,接下来主要连接传感器和执行部分。




5、把WS2812灯带每个8个LED为一段,分别用剪刀剪4段,然后再用导线焊接起来。


6、用继电器的目的主要是在热释电传感器检测有人靠近时,继电器触头闭合给DFPlayer Mini模块通电工作,同时模拟长按开关将ADKEY1脚与负极短接重复播放第一首,实际测试比用串口控制好用。将继电器与DFPlayer Mini 播放器模块用杜邦线按照下图连接好,剩余的两根杜邦线分别插在扩张板的正极和负极排针上,插入已经下载好雷声音频文件的内存卡。








7、将热释电人体传感器插在扩展板的D9引脚上,WS2812灯带插在扩展板的D6引脚上。


8、将继电器插在扩展板上的D13引脚上,链接好DFPlayer Mini 模块,连好电路后,检查各硬件是否正常。


第二步 上传代码至Arduino板
#include <Adafruit_NeoPixel.h>
      

    #define PIXEL_PIN    6//灯条链接引脚
    #define SENSOR_PIN   9//传感器链接引脚
    #define SPEAKER_PIN13//继电器模块的引脚

    #define PIXEL_COUNT 32//灯珠的个数

    Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

    int randomNumber;






    void setup() {
      pinMode(SPEAKER_PIN, OUTPUT);
      digitalWrite(SPEAKER_PIN, LOW);
      strip.begin();
      strip.show();

      pinMode(SENSOR_PIN, INPUT);
      randomSeed(analogRead(0));
      
      Serial.begin(9600);

    }

    void loop() {
      
      
      if( digitalRead(SENSOR_PIN) == HIGH){
      digitalWrite(SPEAKER_PIN, HIGH);
      randomNumber = random(300);
      Serial.println(randomNumber % 67);
      thunder_strike(randomNumber % 67);
   
      delay(3000);
      digitalWrite(SPEAKER_PIN, LOW);

      }else{

      if(millis() % 100000 == 0){
          for(int i=20; i<100; i++){
            colorWipe(strip.Color(i,i-20,0),0);
            
          }
          for(int i=100; i>20; i--){
            colorWipe(strip.Color(i,i-20,0),0);
            
          }
          colorWipe(strip.Color(0,0,0),0);
         
          delay(3000);
         
      }

      }
            
      

         
      
    }


    void thunder_strike( int type) {
      if(type < 20){
         
            colorWipe_short(0, PIXEL_COUNT, strip.Color(73, 147, 255), 3);
            colorWipe(strip.Color(0, 0, 0), 0);
            delay(500);
            colorWipe_short(0, PIXEL_COUNT, strip.Color(73, 147, 255), 3);
            delay(20);
            colorWipe(strip.Color(0, 0, 0), 0);
            delay(500);

      }else if(type < 40){
         
            colorWipe(strip.Color(104, 94, 94), 3);
            colorWipe(strip.Color(0,0,0), 0);
            delay(500);
            colorWipe(strip.Color(104, 94, 94), 3);
            delay(20);
            colorWipe(strip.Color(0,0,0), 0);
            delay(500);
      }else if(type < 60){   
            colorWipe(strip.Color(181, 165, 95), 3);
            delay(1000);
            colorWipe(strip.Color(0,0,0), 0);
            delay(100);
            colorWipe(strip.Color(181, 165, 95), 3);
            delay(500);
            colorWipe(strip.Color(0,0,0), 0);
            delay(500);
      }else{
            rainbowCycle(5);
            colorWipe(strip.Color(0,0,0), 0);
      }
    }


    void colorWipe_short(uint16_t be, uint16_t en, uint32_t c, uint8_t wait){
      for (uint16_t i = be; i < en; i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
      }

    }

    // Fill the dots one after the other with a color
    void colorWipe(uint32_t c, uint8_t wait) {
      for (uint16_t i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
      }
    }

    void rainbow(uint8_t wait) {
      uint16_t i, j;

      for (j = 0; j < 256; j++) {
      for (i = 0; i < strip.numPixels(); i++) {
          strip.setPixelColor(i, Wheel((i + j) & 255));
      }
      strip.show();
      delay(wait);
      }
    }

    // Slightly different, this makes the rainbow equally distributed throughout
    void rainbowCycle(uint8_t wait) {
      uint16_t i, j;

      for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
      for (i = 0; i < strip.numPixels(); i++) {
          strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
      }
      strip.show();
      delay(wait);
      }
    }

   void theaterChase(uint32_t c, uint8_t wait) {
      for (int j = 0; j < 10; j++) { //do 10 cycles of chasing
      for (int q = 0; q < 3; q++) {
          for (int i = 0; i < strip.numPixels(); i = i + 3) {
            strip.setPixelColor(i + q, c);//turn every third pixel on
          }
          strip.show();

          delay(wait);

          for (int i = 0; i < strip.numPixels(); i = i + 3) {
            strip.setPixelColor(i + q, 0);      //turn every third pixel off
          }
      }
      }
    }

    //Theatre-style crawling lights with rainbow effect
    void theaterChaseRainbow(uint8_t wait) {
      for (int j = 0; j < 256; j++) {   // cycle all 256 colors in the wheel
      for (int q = 0; q < 3; q++) {
          for (int i = 0; i < strip.numPixels(); i = i + 3) {
            strip.setPixelColor(i + q, Wheel( (i + j) % 255)); //turn every third pixel on
          }
          strip.show();

          delay(wait);

          for (int i = 0; i < strip.numPixels(); i = i + 3) {
            strip.setPixelColor(i + q, 0);      //turn every third pixel off
          }
      }
      }
    }

    // Input a value 0 to 255 to get a color value.
    // The colours are a transition r - g - b - back to r.
    uint32_t Wheel(byte WheelPos) {
      WheelPos = 255 - WheelPos;
      if (WheelPos < 85) {
      return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
      }
      if (WheelPos < 170) {
      WheelPos -= 85;
      return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
      }
      WheelPos -= 170;
      return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
    }第三步 闪电云的外观制作与硬件安装
1、用美工刀将一个饮料瓶裁剪出安装扬声器和人体热释电传感器的孔,舵机拐臂的挂绳孔。另外瓶盖上同样裁剪出安装开关、充电接口,指示灯的孔。

2、将控制开关和充电电池电路板安装在瓶上,并用热熔胶固定。




3、把舵机拐臂安装到挂身孔并用热熔胶固定,再将人体热释电传感器、DFPlayer Mini 模块、继电器模块依次放入挤入少量热熔胶固定,所有传感器导线往瓶口掏出。


4、分别将热释电传感器、继电器、灯带、DFPlayer Mini 模块导线插入扩展板后,将Arduino板与扩展板装入瓶内。

5、安装小喇叭后用热熔胶密封,瓶内放入少量棉花可以起到吸音棉的作用。


6、拆一个灯罩并用电钻打孔后安装在瓶子底部,用热熔胶粘合,至于为什么要用着这个罩子,一是起到小喇叭发声腔作用,二是起到支撑闪电云塑形棉花作用。




7、为了防止棉花粘合时热熔胶的高温造成瓶子变形,用美纹纸胶带将瓶子包裹起来,将LED灯带分别水平粘连在瓶身的四个方向。




8、剪两根吸管制作闪电云尾部支架,同样用美纹胶带包裹隔热,用热熔胶固定。




9、最后用热熔胶把棉花一团团沾满瓶子的表面,由于重力的影响棉花尽量向顶上多粘连一些,底部粘连的太多后期会因重力的影响而脱落,棉花保持大块粘接不要撕碎,全部粘合好再塑形。


   那么到这里闪电云就基本上做好了,这次小编先制作个Mini版的练练手,后面再计划制作个大的,你说虐不虐?虐不虐?对了,如果你要下载雷声特效音乐可以到这个网站下载,代码上传需要用到Adafruit_NeoPixel.h库文件。好了~就这样吧!



罗某 发表于 2017-3-27 19:14:30

大神你好,能不能问一下您这个电源充电接头    在哪买的啊,我在淘宝找了很久都没找到啊。能不能给个链接啥的啊。

芝麻达人 发表于 2016-6-24 19:05:01

lz 我比较小白,接好了 但是不会写入程序了

罗某 发表于 2017-5-12 17:25:06

T2sun 发表于 2017-5-12 17:00
我就是按文章中的步骤来的,没有问题啊。我把IF里面的high 设为Low 没人时候的功能也是正常的 ...

我现在换了个红外传感器行了,应该是我那个人体释热传感器坏了,就是昨天灯带我开始接通还亮,就是一打开开关就亮,我人离开传感器了反而灭了,不按照传感器感应来,我以为是电压不够,结果最后烧掉了(我也不知道到底是不是烧掉了,反正一直不亮了,又去某宝淘了几米)。还有就是贴主做那个背景音乐名字你知不知道啊,我感觉那首不错啊。

hnyzcj 发表于 2016-6-13 22:29:24

先顶,后看。

源代码 发表于 2016-6-14 00:17:25

hnyzcj 发表于 2016-6-13 22:29
先顶,后看。

好啊,我还拍了个视频,已上传。

hnyzcj 发表于 2016-6-14 06:27:20

源代码 发表于 2016-6-14 00:17
好啊,我还拍了个视频,已上传。

dsweiliang 发表于 2016-6-14 08:17:59

好顶赞,效果在自然一点就更更好啦,值得深度优化一下

源代码 发表于 2016-6-14 09:41:38

dsweiliang 发表于 2016-6-14 08:17
好顶赞,效果在自然一点就更更好啦,值得深度优化一下

嗯,效果后面在调试下哈哈~

源代码 发表于 2016-6-14 09:42:29

hnyzcj 发表于 2016-6-14 06:27


太亮了反而拍出来不好。:'(

luna 发表于 2016-6-14 15:24:23

电路连线图好赞!!{:5_161:}

源代码 发表于 2016-6-14 15:54:55

luna 发表于 2016-6-14 15:24
电路连线图好赞!!

主要请教了一位美女后才画的这么好~{:5_168:}

hnyzcj 发表于 2016-6-14 17:48:23

源代码 发表于 2016-6-14 09:42
太亮了反而拍出来不好。

后面我也给我女儿弄个

源代码 发表于 2016-6-14 18:44:24

hnyzcj 发表于 2016-6-14 17:48
后面我也给我女儿弄个

好有爱的父亲,棒棒哒~{:5_129:}

Ash 发表于 2016-6-15 10:12:00

电路连线图好赞!学得好快! 嘻嘻 {:5_195:}

源代码 发表于 2016-6-15 10:52:48

Ash 发表于 2016-6-15 10:12
电路连线图好赞!学得好快! 嘻嘻

请教一位美女,当然学的快了哈哈哈~

Ash 发表于 2016-6-15 10:58:05

源代码 发表于 2016-6-15 10:52
请教一位美女,当然学的快了哈哈哈~

{:5_148:} 哈哈哈哈哈 话说你棉花用热熔胶粘的啊?

源代码 发表于 2016-6-15 11:06:39

Ash 发表于 2016-6-15 10:58
哈哈哈哈哈 话说你棉花用热熔胶粘的啊?

是啊全部用热熔胶粘的,就应该搭配一点双面胶,{:5_147:}

Phoebe 发表于 2016-6-16 11:31:07

哇,这个云好像鸡腿{:5_165:}

源代码 发表于 2016-6-16 14:10:28

Phoebe 发表于 2016-6-16 11:31
哇,这个云好像鸡腿

切实像鸡腿{:5_161:}

heinau 发表于 2016-6-20 09:53:11

哇,这个云好像鸡腿{:5_151:}

源代码 发表于 2016-6-20 10:20:35

heinau 发表于 2016-6-20 09:53
哇,这个云好像鸡腿

切实像。。。。{:5_192:}

Ash 发表于 2016-6-22 10:48:45

哇,这个云好像鸡腿 {:5_151:}

芝麻达人 发表于 2016-6-22 13:51:12

lz 棉花x宝买的吗
页: [1] 2 3 4 5
查看完整版本: 雷雨季节|造一朵可充电的Mini闪电云