SOLUCIONADO Luces Ritmicas para Tira de Led

Saludos.

Estoy intentando poner unas luces ritmicas en casa para los crios y tengo un esquemita que mas o menos me funciona porque si subo el volumen, sube la intensidad de la luz al ritmo de la musica, pero si bajo el volumen a 0 los leds siguen parpadeando y no se porque.

Aver si me podeis orientar un poco Os pego el esquema y codigo …gracias.

int Valor;
int led;

void setup() { pinMode(11,OUTPUT); }

void loop() {
 Valor = analogRead(A0)*2;
 if (Valor > 6) { analogWrite(11, Valor); }
 else { analogWrite(11, 0); }
 delay(40);
}

No se ve tu imagen, tal vez sea porque esta "attachada", por favor, lee las normas del foro y pega la imagen como se dice allí.

Saludos!

:grin:

No hace falta ver la imagen para entender que tu error está en el código. El umbral que fijaste es bajo. 6 para algo multiplicado por 2 implica que con 3 ya estamos en el limite y aun te quedan 1023 -3 o sea todo el rango de medición de sonido. Ponlo en 400 y modifica esto asi

void loop() {
 Valor = map(analogRead(A0), 0, 1023, 0, 255);

 if (Valor > 30) {  // todo lo que supere el umbral de 30 mostrará brillo 
      analogWrite(11, Valor); 
    }
    else { 
      analogWrite(11, 0); 
    }
 delay(40);
}

Una pregunta surbyte, este código hace que los led enciendan con el ritmo de la música siempre y cuando la intensidad supere el valor 30 pero el led va a encender a su máxima intensidad o según la intensidad indicada por la variable valor? algo así como una pwm definida por le ritmo de la música?

Lo que me deja en duda, es cómo la entrada analógica manejará voltajes negativos... ::)

INC_VK: pero si bajo el volumen a 0 los leds siguen parpadeando y no se porque.

Valor = analogRead(A0)*2;

Resulta que el ADC del microcontrolador es tan sensible que puede detectar voltajes desde los 4 milivoltios.

El llamado "volumen a 0" no es absoluto, existe un muy muy muy ligero "ruido blanco" de fondo; apenas se alcanza a oír, mas es detectable para la entrada analógica (analogRead quizá devuelva valores entre 5 y 11 solo por este ruido de fondo). Entonces digamos que analogRead leyó 5, entonces Valor = 5 * 2; y como 10 > 6, analogWrite(11, 10) enciende ligeramente los LEDs.

En conclusión: tu código así como está en el primer post, es sensible al "ruido blanco" de fondo. El que propone surbyte es funcional, y evita que se "dispare" por este tipo de ruido.

Olvidé responder esto:

carlosjq10: este código hace que los led enciendan con el ritmo de la música siempre y cuando la intensidad supere el valor 30 pero el led va a encender a su máxima intensidad o según la intensidad indicada por la variable valor? algo así como una pwm definida por le ritmo de la música?

Crea un "umbral de intensidad", el cuál dice que no encienda los LEDs si el valor por aplicar en PWM está por debajo de 30; caso contrario, que aplique PWM.

Según ese código, para que se aplique PWM, la entrada analógica debe recibir más de 0.58v

carlosjq10: Una pregunta surbyte, este código hace que los led enciendan con el ritmo de la música siempre y cuando la intensidad supere el valor 30 pero el led va a encender a su máxima intensidad o según la intensidad indicada por la variable valor? algo así como una pwm definida por le ritmo de la música?

El led encenderá a 255-30, o sea parte de un brillo minimo que yo supongo sea el ruido de fondo del lugar. Como quien consulta usa analogWrite supuse que pretender cambiar brillo asi que es un compromiso entre lo que puedo y no puedo lograr. también podria cambiar y definir una variable UMBRAL por ejemplo algo asi

#define UMBRAL 30 // sigamos con el ejemplo pero luego en el map hago esto
Valor = map(analogRead(A0), 0, 1023, UMBRAL, 255);

total quien me prohibe hacerlo y decirle que UMBRAL es 0 en brillo y 1023 es 255. Nadie!!! Asi estaría mucho mejor.

Saludos a todos. Lo primero pedir disculpas porque creía que tenia un problema de hardware y como bien dijo surbyte el error estaba en el codigo y en el "ruido de fondo". Probando el codigo, y para eliminar el ruido, y dejando el Umbral idoneo en mi caso, el codigo quedaria asi,

float Valor;

void setup() { pinMode(11,OUTPUT); }

void loop() {
 Valor = map(analogRead(A0), 20, 1023, 20, 255);
 if (Valor > 20) { analogWrite(11, Valor); }
 else { analogWrite(11, 0); }
 delay(30);
}

Funciona Gracias por echarme una mano :)

Entonces agrega SOLUCIONADO a tu titulo para cerrar el hilo.