#include <Adafruit_NeoPixel.h>
#define LEFT_AUDIO A0
#define RIGHT_AUDIO A1
#define PEAK_FALL 4
#define NUM_LEDS 100
#define MAX_LEDS_LEFT 30
#define MAX_LEDS_RIGHT 30
#define LED_LEFT_OUT 3
#define LED_RIGHT_OUT 5
#define BRIGHTNESS 255
#define SENSITIVE_PIN A6
#define BRIGHTNESS_PIN A3
#define PEAK_DELAY_PIN A2
#define MUSIC_PIN 12
#define STANDBY_PIN 10
#define MAX_NUM_CHARS 16
char cmd[MAX_NUM_CHARS];
bool cmd_complete = false;
bool stats = 0;
uint32_t count_leds = 1;
uint32_t count_leds_r = 1;
Adafruit_NeoPixel strip_l = Adafruit_NeoPixel(NUM_LEDS, LED_LEFT_OUT, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip_r = Adafruit_NeoPixel(NUM_LEDS, LED_RIGHT_OUT, NEO_GRB + NEO_KHZ800);
const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz)
int maximum = 110;
int peak_l;
int peak_r;
int dotCount_l;
int dotCount_r;
unsigned int sample_l;
unsigned int sample_r;
unsigned int bright;
unsigned int sensitive;
unsigned int peak_delay;
byte num = 1;
byte nums = 1;
unsigned int jeda;
unsigned int jedastandby;
unsigned int lamajeda = 3;
unsigned long jedaWaktu = 0;
bool mode_check_led = 0;
bool mode_standby = 0;
bool mode_music = 0;
int32_t idled_l = 0;
int32_t idled_r = 0;
bool stats_led = 1;
unsigned long stbywaktu = 0;
unsigned long waktu_led = 0;
unsigned long waktu_audio = 0;
byte r = 255;
byte g = 0;
byte b = 0;
void setup()
{
Serial.begin(9600);
Serial.println("MZF_NEO_PIXEL_MUSIC_REACTION_ver.1.0");
Serial.println("by MANDOZAF");
// printUsage();
strip_l.begin();
strip_l.setBrightness(BRIGHTNESS);
strip_r.begin();
strip_r.setBrightness(BRIGHTNESS);
strip_l.show();
strip_r.show();
strip_l.clear();
strip_r.clear();
pinMode(LEFT_AUDIO, INPUT);
pinMode(RIGHT_AUDIO, INPUT);
pinMode(SENSITIVE_PIN, INPUT);
pinMode(BRIGHTNESS_PIN, INPUT);
pinMode(MUSIC_PIN, INPUT);
pinMode(STANDBY_PIN, INPUT);
}
void loop() {
// readserial(); // read serial comm
// if (cmd_complete) {
// process_command();
// }
if ( millis() - stbywaktu >= 1000) {
jeda++;
stbywaktu = millis();
}
if (jeda > lamajeda) {
jeda = 0;
num = random(1, 4);
Serial.print("Mode VU = "); Serial.println(num);
}
animasi();
}
void animasi() {
switch (num) {
case 1:
test_VU_1() ;
break;
case 2:
test_VU_2() ;
break;
case 3:
test_VU_3() ;
break;
case 4:
test_VU_4() ;
break;
}
}
void audio_tes() {
if (millis() - waktu_audio > 25)
{ jedaWaktu++;
if (jedaWaktu < 50) {
idled_l = random(5, 25);
idled_r = random(5, 25);
} else {
idled_l = -1;
idled_r = -1;
}
waktu_audio = millis() ;
}
if (jedaWaktu > 70) {
jedaWaktu = 0;
}
}
uint32_t Wheel(byte WheelPos) {
if (WheelPos < 85) {
return strip_l.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
return strip_r.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if (WheelPos < 170) {
WheelPos -= 85;
return strip_l.Color(255 - WheelPos * 3, 0, WheelPos * 3);
return strip_r.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return strip_l.Color(0, WheelPos * 3, 255 - WheelPos * 3);
return strip_r.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}
void test_VU_1() {
audio_tes();
for (int i = 0; i < idled_l; i++)
{
strip_l.setPixelColor(i, Wheel(map(i, 0, MAX_LEDS_LEFT - 1, 200, 400)));
}
for (int i = MAX_LEDS_LEFT ; i > idled_l; i--)
{
strip_l.setPixelColor(i, 0, 0, 0);
}
strip_l.show();
if (idled_l > peak_l) peak_l = idled_l;
if (peak_l > 1 && peak_l <= MAX_LEDS_LEFT - 1)
strip_l.setPixelColor(peak_l, 255, 255, 255);
strip_l.show();
if (++dotCount_l >= PEAK_FALL) { //fall rate
if (peak_l > 0) peak_l--;
dotCount_l = 0;
}
//right
for (int i = 0; i < idled_r; i++)
{
strip_r.setPixelColor(i, Wheel(map(i, 0, MAX_LEDS_LEFT - 1, 200, 400)));
}
for (int i = MAX_LEDS_LEFT ; i > idled_r; i--)
{
strip_r.setPixelColor(i, 0, 0, 0);
}
strip_r.show();
if (idled_r > peak_r) peak_r = idled_r;
if (peak_r > 1 && peak_r <= MAX_LEDS_RIGHT - 1)
strip_r.setPixelColor(peak_r, 255, 255, 255);
// strip_r.setPixelColor(peak_r, Wheel(map(peak_r, 0, MAX_LEDS_LEFT - 1, 200, 400)));
strip_r.show();
if (++dotCount_r >= PEAK_FALL) { //fall rate
if (peak_r > 0) peak_r--;
dotCount_r = 0;
}
}
void test_VU_2() {
audio_tes();
for (int i = 0; i < idled_l; i++)
{
strip_l.setPixelColor(MAX_LEDS_LEFT - 1 - i, Wheel(map(i, MAX_LEDS_LEFT - 1, 0, 400, 200)));
}
for (int i = MAX_LEDS_LEFT - 1 ; i > idled_l; i--)
{
strip_l.setPixelColor(MAX_LEDS_LEFT - 1 - i, 0, 0, 0);
}
strip_l.show();
if (idled_l > peak_l) peak_l = idled_l;
if (peak_l > 1 && peak_l <= MAX_LEDS_LEFT - 1)
strip_l.setPixelColor(MAX_LEDS_LEFT - 1 - peak_l, 255, 255, 255);
strip_l.show();
if (++dotCount_l >= PEAK_FALL) { //fall rate
if (peak_l > 0) peak_l--;
dotCount_l = 0;
}
//right
for (int i = 0; i < idled_r; i++)
{
strip_r.setPixelColor(MAX_LEDS_RIGHT - 1 - i, Wheel(map(i, MAX_LEDS_RIGHT - 1, 0, 400, 200)));
}
for (int i = MAX_LEDS_RIGHT - 1 ; i > idled_r; i--)
{
strip_r.setPixelColor(MAX_LEDS_RIGHT - 1 - i, 0, 0, 0);
}
strip_r.show();
if (idled_r > peak_r) peak_r = idled_r;
if (peak_r > 1 && peak_r <= MAX_LEDS_RIGHT - 1)
strip_r.setPixelColor(MAX_LEDS_RIGHT - 1 - peak_r, 255, 255, 255);
strip_r.show();
if (++dotCount_r >= PEAK_FALL) { //fall rate
if (peak_r > 0) peak_r--;
dotCount_r = 0;
}
}
void test_VU_3() {
audio_tes();
idled_l = idled_l / 2 - 1;
for (int i = 0; i < idled_l; i++)
{
strip_l.setPixelColor(i + ( MAX_LEDS_LEFT / 2), Wheel(map(i, 0, MAX_LEDS_LEFT - 1, 200, 400)));
strip_l.setPixelColor(( MAX_LEDS_LEFT / 2) - i, Wheel(map(i, 0, MAX_LEDS_LEFT - 1, 200, 400)));
}
for (int i = MAX_LEDS_LEFT ; i > idled_l; i--)
{
strip_l.setPixelColor(i + ( MAX_LEDS_LEFT / 2), 0, 0, 0);
strip_l.setPixelColor(( MAX_LEDS_LEFT / 2) - i, 0, 0, 0);
}
strip_l.show();
if (idled_l > peak_l) peak_l = idled_l;
if (peak_l > 1 && peak_l <= MAX_LEDS_LEFT / 2 - 1) {
strip_l.setPixelColor(peak_l + ( MAX_LEDS_LEFT / 2), 255, 255, 255);
strip_l.setPixelColor(( MAX_LEDS_LEFT / 2) - peak_l, 255, 255, 255);
} else if (peak_l == 0) {
strip_l.setPixelColor(peak_l, 0, 0, 0);
}
strip_l.show();
if (++dotCount_l >= PEAK_FALL) { //fall rate
if (peak_l > 0) peak_l--;
dotCount_l = 0;
}
//right
idled_r = idled_r / 2 - 1;
for (int i = 0; i < idled_r; i++)
{
strip_r.setPixelColor(i + ( MAX_LEDS_RIGHT / 2), Wheel(map(i, 0, MAX_LEDS_RIGHT - 1, 200, 400)));
strip_r.setPixelColor(( MAX_LEDS_RIGHT / 2) - i, Wheel(map(i, 0, MAX_LEDS_RIGHT - 1, 200, 400)));
}
for (int i = MAX_LEDS_RIGHT ; i > idled_r; i--)
{
strip_r.setPixelColor(i + ( MAX_LEDS_RIGHT / 2), 0, 0, 0);
strip_r.setPixelColor(( MAX_LEDS_RIGHT / 2) - i, 0, 0, 0);
}
strip_r.show();
if (idled_r > peak_r) peak_r = idled_r;
if (peak_r > 1 && peak_r <= MAX_LEDS_RIGHT / 2 - 1) {
strip_r.setPixelColor(peak_r + ( MAX_LEDS_RIGHT / 2), 255, 255, 255);
strip_r.setPixelColor(( MAX_LEDS_RIGHT / 2) - peak_r, 255, 255, 255);
} else if (peak_r == 0) {
strip_r.setPixelColor(peak_r, 0, 0, 0);
}
strip_r.show();
if (++dotCount_r >= PEAK_FALL) { //fall rate
if (peak_r > 0) peak_r--;
dotCount_r = 0;
}
}
void test_VU_4() {
audio_tes();
if ( idled_l > 15) {
for (int i = 0; i < MAX_LEDS_LEFT; i++)
{
strip_l.setPixelColor(i, Wheel(map(i, 0, MAX_LEDS_LEFT - 1, 200, 400)));
}
strip_l.show();
} else {
for (int i = 0; i < MAX_LEDS_LEFT ; i++)
{
strip_l.setPixelColor(i, 0, 0, 0);
}
strip_l.show();
}
//right
if ( idled_r > 15) {
for (int i = 0; i < MAX_LEDS_RIGHT; i++)
{
strip_r.setPixelColor(i, Wheel(map(i, 0, MAX_LEDS_RIGHT - 1, 200, 400)));
}
strip_r.show();
} else {
for (int i = 0; i < MAX_LEDS_RIGHT ; i++)
{
strip_r.setPixelColor(i, 0, 0, 0);
}
strip_r.show();
}
}
void setled_l(int32_t idled_l, bool x) {
if (x == 0) {
strip_l.setPixelColor(idled_l, 0, 0, 0);
strip_l.show();
} else {
strip_l.setPixelColor(idled_l, r, g, b);
strip_l.show();
}
}
/*
Prints a usage menu.
*/
const char usageText[] PROGMEM = R"=====(
MUSIC REACTION AUDIO STEREO
command:
q <n> : count led LEFT <n>
] : increase led LEFT
[ : decrease led LEFT
e <n> : count led RIGHT <n>
= : increase led RIGHT
- : decrease led RIGHT
a : back to mode (total led count)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
)=====";
void printUsage() {
Serial.println((const __FlashStringHelper *)usageText);
}
uint32_t Wheel(byte WheelPos, float opacity) {
if (WheelPos < 85) {
return strip_l.Color((WheelPos * 3) * opacity, (255 - WheelPos * 3) * opacity, 0);
return strip_r.Color((WheelPos * 3) * opacity, (255 - WheelPos * 3) * opacity, 0);
}
else if (WheelPos < 170) {
WheelPos -= 85;
return strip_l.Color((255 - WheelPos * 3) * opacity, 0, (WheelPos * 3) * opacity);
return strip_r.Color((255 - WheelPos * 3) * opacity, 0, (WheelPos * 3) * opacity);
}
else {
WheelPos -= 170;
return strip_l.Color(0, (WheelPos * 3) * opacity, (255 - WheelPos * 3) * opacity);
return strip_r.Color(0, (WheelPos * 3) * opacity, (255 - WheelPos * 3) * opacity);
}
}