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