Na wat experimenten met een microfoon kan ik alleen maar zeggen dat ook hiervoor een versterkertje nodig is.
Ik heb zelfs een Mic met versterkertje geprobeerd maar die was niet gevoelig genoeg.
Al met al zitten we dus vast met:
- een kleine signaal verschuiving (van -1V...1V -> 1.5V...3.5V) en
- een signaal versterking (van 1.5V...3.5V naar 0V tot 5V).
En dan hebben we nog niet het probleem opgelost dat de audio uitgeschakeld wordt op de computer. Een Y-splitter kan daarbij handig zijn, maar of dat zo goed gaat werken weet ik dus niet.
Ik heb ook wat meer getest met alleen voltage verschuiven, en in combinatie met het vuur effect ziet er dat best leuk uit. Ik kan alleen niet de muziek horen.
De sketch is op het vuur effect gebaseerd uit het artikeltje "LEDStrip effecten voor NeoPixel en FastLED".
Verder is de schakeling niet moeilijk - ik heb twee willekeurige weerstanden gepakt (4.7 KOhm - geel violet rood, zie ook de weerstand kleuren calculator), en een 4.7 micro farad elektrolytische condensator.
De LEDStrip wordt aangesloten zoals in het artikel is beschreven.
Voor de Audio-In heb ik pin A0, +5V en GND gebruikt - zie bijgesloten tekening. De tekening is dus een aanvulling op de aangesloten LEDStrip. Deze schakeling zou het voltage van -1V...1V naar 1.5V...3.5V moeten opkrikken.
Het vuur gedraagt zich nu een beetje naar de muziek - maar ja, ik kan de muziek niet horen dus ik gok het maar.
Als je in de Arduino IDE de seriële monitor aanzet dan zie je de berekende waarden.
#include "FastLED.h"
#include <math.h>
#define NUM_LEDS 60
#define AVG 511
#define FACTOR 3
#define AUDIO_LEFT A0
#define NO_SOUND 16
float ValueLeft;
CRGB leds[NUM_LEDS];
#define PIN 6 // for LED strip
void setup()
{
FastLED.addLeds<WS2812, PIN, GRB>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
Serial.begin(9600);
pinMode(A0, INPUT);
setAll(0,0,0);
}
void loop() {
ValueLeft = round(log10(max(1, 1+ abs(analogRead(AUDIO_LEFT) -AVG))) * (NUM_LEDS/FACTOR));
if(isinf(ValueLeft)) { ValueLeft=NUM_LEDS; }
else if(isnan(ValueLeft)) { ValueLeft=0; }
else if(ValueLeft<NO_SOUND) { ValueLeft=0; }
else if(ValueLeft>NUM_LEDS) { ValueLeft=NUM_LEDS; }
Serial.println(ValueLeft);
Fire(30+ValueLeft,ValueLeft*4,10);
}
void Fire(int Cooling, int Sparking, int SpeedDelay) {
static byte heat[NUM_LEDS];
int cooldown;
// Step 1. Cool down every cell a little
for( int i = 0; i < NUM_LEDS; i++) {
cooldown = random(0, ((Cooling * 10) / NUM_LEDS) + 2);
if(cooldown>heat) {
heat=0;
} else {
heat=heat-cooldown;
}
}
// Step 2. Heat from each cell drifts 'up' and diffuses a little
for( int k= NUM_LEDS - 1; k >= 2; k--) {
heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3;
}
// Step 3. Randomly ignite new 'sparks' near the bottom
if( random(255) < Sparking ) {
int y = random(7);
heat[y] = heat[y] + random(160,255);
//heat[y] = random(160,255);
}
// Step 4. Convert heat to LED colors
for( int j = 0; j < NUM_LEDS; j++) {
setPixelHeatColor(j, heat[j] );
}
showStrip();
delay(SpeedDelay);
}
void setPixelHeatColor (int Pixel, byte temperature) {
// Scale 'heat' down from 0-255 to 0-191
byte t192 = round((temperature/255.0)*191);
// calculate ramp up from
byte heatramp = t192 & 0x3F; // 0..63
heatramp <<= 2; // scale up to 0..252
// figure out which third of the spectrum we're in:
if( t192 > 0x80) { // hottest
setPixel(Pixel, 255, 255, heatramp);
} else if( t192 > 0x40 ) { // middle
setPixel(Pixel, 255, heatramp, 0);
} else { // coolest
setPixel(Pixel, heatramp, 0, 0);
}
}
// REPLACE TO HERE
void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
FastLED.show();
#endif
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
// NeoPixel
strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
// FastLED
leds[Pixel].r = red;
leds[Pixel].g = green;
leds[Pixel].b = blue;
#endif
}
void setAll(byte red, byte green, byte blue) {
for(int i = 0; i < NUM_LEDS; i++ ) {
setPixel(i, red, green, blue);
}
showStrip();
}