6821| 7
|
闪闪的恐龙 |
上次用BlunoBeetle做控制器,3D打印出恐龙背,恐龙背里面塞了一条3米的WS2812灯带,为了听到“恐龙”的“吼叫”,还加了一个模拟声音传感器。本来就只有这些了,但是后来发现电池直接带灯电流太大,只要几分钟就会导致灯带过热,如果用Beetle带的话,Beetle又太烫受不了,所以我加了个25W DC-DC 降压模块,效果不错。话不多说,上图:照这种亮的东西,拍出来就瞎了我的钛合金狗眼了,见谅! 这个恐龙灯的闪烁是用蓝牙和模拟声音传感器控制。当声音传感器接收到大于一定音量的声(恐龙吼叫)时,灯带开始闪烁,其余的时候有两种选择模式,一种是流水灯的模式,一种是呼吸灯模式。 我用的手机控制软件是借的我们另外一款产品的壳(原谅渣渣的我不会ANDROID编程吧)。两种模式就是用的一个按键(蜂鸣器BUZZER))控制是进入流水灯模式还是呼吸灯模式。 下面就是灯带的颜色控制了,我们的APP上给的是色环,灯带的颜色取的就是我选的位置左右两边一定范围的颜色(颜色范围目前不可调,需在程序里面设置好)。因为我们APP上发出来的给的色环数据颜色是RGB颜色,即给的格式是(R,G,B)。这样不符合我们想取的色环,所以我们要把RGB模式转换为HSV模式(色调(H),饱和度(S),亮度(V))。 现在模拟声音传感器是放在衣领下方,下一步准备在袖子处加个模拟声音传感器,然后用个音频分析模块,这样就能够伸手将声音传感器放在一个音源上面,灯光就能够随着音乐跳动了,哈哈,想想还挺激动的呢! 好,下面我们来聊聊灯带控制吧,这是最重要的。灯带控制我用了一个很牛的库FastLED(库很大,很杂,我目前只看懂了一点点,所以请大牛来精简,要不每次编译这个灯带的库的时候可以去倒杯茶喝了),做一些颜色控制非常简单,能够随时控制什么颜色到什么位置。首先讲下FillLEDsFromPaletteColors这个函数,这是我们想让什么颜色出现在什么位置的函数。NUM_LEDS表示你灯带有多少灯。colorIndex += 5表示你想要几个灯亮一个颜色,此时是(15/5 = )3个灯亮一个颜色。为什么是要除以5呢,因为ColorFromPalette函数中的currentPalette参数是一个16为长度的数组。所以他只能在这个函数中最多同时控制16种颜色。currentBlending是表示你的两种颜色的灯之间是颜色混合渐变的还是突变的,例如我第一个灯是红色,第二个灯是蓝色,第三个灯是绿色,如果是混合模式,这样第一个是红色,第二个灯就是蓝色和红色混合的了,第三个灯就是蓝色和绿色混合的,是渐变的,不会是从红色突然变成了蓝色这样。我的呼吸灯模式是用不混合模式,流水灯用的就是混合模式。 void FillLEDsFromPaletteColors( uint8_t colorIndex, int brightness1) { for ( int i = 0; i < NUM_LEDS; i++) { leds = ColorFromPalette(currentPalette, colorIndex, brightness1, currentBlending); colorIndex += 5; //有几个灯(15/5)亮同一种颜色 } } 下面一个函数是流水灯模式的函数其中startIndex_Stream = startIndex_Stream + 5代表每次我们想让灯带颜色整体往前移 5个灯。ledColor()函数是将读取到的RGB转成HSV,并且将以此各种颜色填进currentPalette[]( = CHSV( H,S,V)这个数组。由于CHSV这个函数的参数最大值是255,而我们RGB转换来的HSV是0-360,所以我们需要将H转换到0-255范围内,用一个简单的MAP函数就能够解决这问题了。最后别忘了FastLED.show()这个让灯带刷新的函数。 void stream() { // Serial.println("stream"); static uint8_t startIndex_Stream = 0; startIndex_Stream = startIndex_Stream + 5; //每次往前走几个灯 ledColor(); currentBlending = BLEND; //灯颜色渐变 FillLEDsFromPaletteColors(startIndex_Stream, 255); FastLED.show(); } 恐龙角的3D模型 DRAGON.zip 程序及库 dragon_leds.zip |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed