LED queda mínimamente encendido

A ver si me podéis echar una mano

En una salida PWM pongo con la instrucción

analogWrite(x,255);

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

Luego pongo:

analogWrite(x,120);

y el LED luce a la mitad de la intensidad

Ahora pongo:

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 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.

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

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

analogWrite(x,0);

Pones

digitalWrite(x, 0);

¿pasa lo mismo? O asi si se apaga por completo el led?

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.

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

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

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.

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: analogWrite() - Arduino Reference

Mira en Notes and Warnings

En español viene igual.

El código:

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.

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

Espero que podáis ayudarme.

S2

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..

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

Voy, es que andaba en la calle y tuve que cortar el mensaje
Mira en el setup tienes esta linea 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 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

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.

@Tauro mira el codigo... no se necesita ser genio para ver que ahi esta la falla. El mismo dijo

cuando hago un chequeo de las luces en el setup() funciona correctamente, pero es llegar al loop()

Entonces calaramente el hardware está bien

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.

Rig, te entendí perfectamente

Y te doy las gracias

Ahora soy yo el que está en el móvil. Cuando este mañana en mi PC explico lo que ha pasado

Lo intentaré arreglar siendomas restrictivo en la comparación

Gracias a todos

Que bien!
De todos modos aquí el ejemplo que prometí:

 const byte x=6;    //pin 6  para prueba
 unsigned long millisAntes;
 unsigned long millisAhora;
 byte estado=0;

 void setup() 

 {
  pinMode(6,OUTPUT);
  analogWrite(x,255);
  delay(2000);
  analogWrite(x,0);      
  millisAntes = millis();
}


void loop() 
{

  millisAhora = millis();

  switch (estado) {   
    case 0:
    if (millisAhora - millisAntes >= 4000UL)
    {
      analogWrite(x,255);
      estado=1;

    }
    break;
    
    case 1:
    if (millisAhora - millisAntes >= 6000UL)
    {
      analogWrite(x,140); 
      estado=2;
    }      
    break;
    
    case 2:
    if (millisAhora - millisAntes >= 8000UL)
    {
      analogWrite(x,255);
      estado=3;

    }
    break;

    case 3:
    if (millisAhora - millisAntes >= 10000UL)
    {       
      analogWrite(x,120);
      estado=4;
    }
    break;

    case 4:
    if (millisAhora - millisAntes >= 12000UL)
    {
      analogWrite(x,0);
      estado=0;
      millisAntes=millis();  
    }
  }

}

Mira que no hice grandes cambios a tu código, solo agregue un condicional múltiple y listo!, pruebalo y mira si lo puedes adaptar a tu código original y si no, espero te sirva para darte una idea de como puedes resolver el fallo que tenias

Perfecto RIG. Funciona.

He simplificado un poco el código porque no necesitaba que fuera cíclico. Ya solo me falta adaptar la solución al programa principal.

Muchas gracias a todos, especialmente a ti RIG.

Te das cuenta, 18turbo, siempre debes mostrar el código (tal como lo dicen las normas del foro) porque no debes asumir que las cosas estan bien, porque de ser así ni siquiera hubieras abierto este hilo no te parece?

Ademas en tu código simplemente desde los 4 segundos todos los if se ejecutan anidadamente. Ejemplo cuando superes los 6 segundos se ejecuta el if de 4 y el de 6 y cuando superes 8 los 3 anteriores y asi hasta 12 segundos.
Asi que no era problema del analogWrite() porque una cosa es ver en el osciloscopio que no es exactamente 0 PWM y en eso estoy de acuerdo contigo y otra que me digas que lo veas en un LED.
Para verlo debes tener un PWM interesante digamos.