Go Down

Topic: LED queda mínimamente encendido (Read 1 time) previous topic - next topic

18turbo

A ver si me podéis echar una mano

En una salida PWM pongo con la instrucción
Code: [Select]
analogWrite(x,255);

el LED a la máxima intensidad (con su resistencia claro).

Luego pongo:
Code: [Select]
analogWrite(x,120);
y el LED luce a la mitad de la intensidad

Ahora pongo:
Code: [Select]
analogWrite(x,0);
y el LED ilumina muy poco cuando no debería iluminarse nada.

Esto se debe, según la documentación, a que
Code: [Select]
millis(); que estoy usando comparte el mismo temporizador que las salidas PWM.

TODO ESTO ESTÁ MUY BIEN DOCUMENTADO, pero no he encontrado nada de cómo solucionarlo (si es que se puede).

¿Se os ocurre algo? ¿Me podéis ayudar?



Si habéis llegado hasta aquí, gracias por leerme.

tauro0221

Hi,
Trata usando la instruccion digitalWrite(Pin, LOW).

RIG

Vaya, a mi no me ha pasado eso, incluso ayer estuve probando un codigo con pwm y en 0 se apaga completamente el led
Y que pasa si en lugar de
Code: [Select]
analogWrite(x,0);
Pones
Code: [Select]
digitalWrite(x, 0);
  ¿pasa lo mismo?  O asi si se apaga por completo el led?

18turbo

Gracias a los dos por contestar.

Pues con digitalWrite ya lo probé, y no funciona. Simplemente no lo apaga.

Tengo que decir que cuando hago un chequeo de las luces en el setup() funciona correctamente, pero es llegar al loop() y como tengo la programación hecha con millis() pues cuando intento apagar el LED se queda mínimamente encendido (y, claro, no es o que quiero).

Lo he probado en dos salidas PWM y en las dos se comporta igual.

tauro0221

Hi,
Trata de hacer un pinMode(pin,INPUT)

RIG

Bien, creo que el problema no es de hardware si no de software, me gustaria ver el codigo


surbyte

Pero estas hablando en el aire, sin ver tu código mas alla de lo que explicas, nada puede asegurar que el programa hace lo que tu dices porque si asi fueran no habría robot que se detenga, ni led que se apague.
Asi que veamos tu código, corroberemos que hace lo que dices y seguimos conversando.

18turbo

A ver Surbyte. A mí no se me ocurre preguntar si en la documentación no pusiera que lo que me pasa con mi código, sucede. Como dije, viene en la documentación de Arduino.

¿Queréis el código?

Vale, pero lo he tenido que extractar, cambiar variables y limpiar porque no puedo enseñarlo. Pero no me digas que lo que explico os lo tenéis que creer porque no veis el código. Es así porque lo dice la documentación de Arduino. Y a mí me pasa.

No me lo invento: https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/

Mira en Notes and Warnings


En español viene igual.

El código:

Code: [Select]

void setup()
  {

pinMode(x,OUTPUT);
  pinMode(y,OUTPUT);

// Check Control

  analogWrite(x,255);
  analogWrite(y,255);

delay(2000);

  analogWrite(x,0);     
  analogWrite(y,0);

millisAntes = millis();
 


void loop()
  {


millisAhora = millis();

if (millisAhora - millisAntes > 4000)
  {
    analogWrite(x,255);
    analogWrite(y,255);
  }
if (millisAhora - millisAntes > 6000)
  {
    analogWrite(x,140);
    analogWrite(y,140);
  }     
if (millisAhora - millisAntes > 8000)
  {
    analogWrite(x,255);
    analogWrite(y,255);
  }
if (millisAhora - millisAntes > 10000)
  {       
    analogWrite(x,120);
    analogWrite(y,120);
  }
if (millisAhora - millisAntes > 12000)
  {
   
    analogWrite(x,0);
    analogWrite(y,0);
  }

}


En ambos LEDs pasa igual, y según explica la documentación es por usar millis()

Espero que ahora podáis ayudarme o si supiera el porqué pasa quizás pueda solucionarlo, aunque sea vía hardware.

Saludos a todos y gracias.

18turbo

Por cierto, si queréis fotos, también tengo, incluso puestos, puedo hacer un vídeo.

Espero que podáis ayudarme.

S2

RIG

Tranquilo amigo, se pide el código porqué uno no es adivino, y se ocupa la mayor información posible para resolver el problema, no creas que se pide el codigo para plagiarlo.
Y para que veas que es cierto, tu problema es el codigo lo estás haciendo mal, por eso el led tiene ese efecto de quedar un poco encendido

Tu mismo estas provocando ese efecto con un mal codigo..

18turbo

Pero amigo RIG, no me digas que está mal, dime qué está mal.

RIG

Voy, es que andaba en la calle y tuve que cortar el mensaje
Mira en el setup tienes esta linea
Code: [Select]
millisAntes=millis()
Bien en ese momento asignas el valor de millis a milisAntes despues el programa salta al loop y cuando la resta de millis menos antes es mayor a 4 segundos enciendes Y y X a 255pwm bien despues lo bajas lo vuelves a subir y despues lo apagas, bueno en teoria es lo que quieres lograr, pero el porque no se apaga el led es porque nunca cambias el valor de millisAntes, por lo tanto se cumplen todas las condiciones.
A ver si me explico mejor,  en los primeros 4 segundos se cumple la primer condicion
Code: [Select]
millis-millisAnterior>4000 y asi se queda, despues de otros 2 segundos se cumple la segunda condicion y asi se queda y asi hasta llegar al ultimo if,  despues de eso todas las condiciones son verdaderas por lo cual todas se ejecutaran cada ciclo del loop, eso quiere decir que lo enciendes y lo apagas tan rápido que se produce ese efecto de quedar un poco encendido
Bueno estoy escribiendo del movil y es un poco lioso, deja me acerco a una pc y te paso un ejemplo

tauro0221

Hi,
Aqui es sencillo probar si es el programa de el  haciendo un pequeno sketch sin usar delays y mira ver si el led se queda prendido o se apaga por completo. Asi elimina que no es problema de hardware y si del software.

RIG

@Tauro mira el codigo... no se necesita ser genio para ver que ahi esta la falla. El mismo dijo
Quote
cuando hago un chequeo de las luces en el setup() funciona correctamente, pero es llegar al loop()
Entonces calaramente el hardware está bien

tauro0221

Hi,
Cuando yo tengo un  problemas  cunado estoy desarollando un projecto y cuando ya tengo casi todo implementado y surge un problema como el que el tiene imediatamente hago un sketch que solamente usa en lo que estoy teniendo problema. Esto me va a decir imediatamente que el problema es hardware o es la programacion como le paso  a rig.

Go Up