hola gente, tengo un problema estaba probando encender 5 led de a uno por vez con el comando for() para ahorrar codigo, hasta ahi funcionaba bien, ahora quise sacar el comando delay() y usar millis() pero no me doy cuenta donde esta el error, o que me saltee ya que prenden y apagan todo juntos.
int ledPin;
int estadoled=LOW;
long previusMillis=0;
long interval=100;
void setup()
{
for (ledPin=8; ledPin<=12;ledPin++)
pinMode(ledPin, OUTPUT);
}
void loop()
{
unsigned long currentMillis=millis();
if (currentMillis - previusMillis > interval)
{
previusMillis= currentMillis;
for (ledPin=8; ledPin<=12;ledPin++)
if (estadoled == LOW)
estadoled = HIGH;
else
estadoled = LOW;
for (ledPin=8; ledPin<=12;ledPin++)
digitalWrite(ledPin, estadoled);
}
Me olvide de preguntar se puede isar millis() con el comando for(), o ya arranque mal mezclando
No ves el error?
Dentro del for la variable estadoLed toma uno u otro valor y luego haces esto
for (ledPin=8; ledPin<=12;ledPin++)
digitalWrite(ledPin, estadoled);
o sea.. no importa que estado tomoo 1 o 0, tu barres los leds desde 8 a 11.
No estas variando nada.
Yo, la verdad es que no le veo error... si lo que quieres es encender y apagar cada 100 ms todos los led a la vez.
millis() no es ningún comando: es una función que devuelve los milisegundos que han pasado desde el arranque de la placa. Nada más.
Échale un ojo a estos dos códigos, y busca la diferencia.
El primero es equivalente al tuyo: enciende y apaga los 5 leds (conectados en este caso a las salidas 2 a 6) a la vez, cada 1000 msg.
El segundo, cada 200 msg, va cambiando el estado de un led. Va encendiendo todos uno a uno, y luego apagando.
El millis() se usa sólo para controlar cada cuánto tiempo entras al bloque de código.
#define pinIni 2
#define interval 1000
byte ledPin;
byte estadoled=0;
unsigned long tref=0;
void setup(){
for (ledPin=0; ledPin<5;ledPin++){
pinMode(ledPin+pinIni, OUTPUT);
}
}
void loop(){
if ((millis()-tref) > interval){
tref=millis();
estadoled=not estadoled;
for (ledPin=0; ledPin<5;ledPin++){
digitalWrite(ledPin+pinIni, estadoled);
}
}
}
#define pinIni 2
#define interval 200
byte ledPin;
byte estadoled[5]={0, 0, 0, 0, 0};
unsigned long tref=0;
void setup(){
for (ledPin=0; ledPin<5;ledPin++){
pinMode(ledPin+pinIni, OUTPUT);
}
}
void loop(){
if ((millis()-tref) > interval){
tref=millis();
ledPin++; if(ledPin>4){ledPin=0;}
estadoled[ledPin]=not estadoled[ledPin];
digitalWrite(ledPin+pinIni, estadoled[ledPin]);
}
}
Gracias chema_zgz, funciona a bien, yo soy novato, asi que dije arranquemos por lo facil, despues de probar con codigo prestado y poca modificacion preobe servos, gps, sensores etc. y empeze como todos creo con el blink, y regalaba delay para todos lados, hasta que vi el comentario de surbyte de que arduino no es multiproceso, pero se puede arreglar con millis() entonces prendemos led con millis y quise hacer la secuencia y ahora que veo tu loop no tiene nada que ver con el mio, la verdad todo es distinto, debere sentarme a practicar y comprender ese tipo de codigo mas elaborado pero a la vez mas funcional.Muchas gracias por su tiempo, tengo 50 y arduino es mi cable a tierra, cuando vuelvo de trabajar
hola gente, tengo un problema estaba probando encender 5 led de a uno por vez
Como que no ves el error chema? El código que puso antes Adrian_E prende y apaga todos los leds.
No se suponía que hiciera eso con cada segundo. Se suponía que prendiera de a 1 o incorporar de a 1.
Eso fue lo que señalé.
surbyte:
Como que no ves el error chema? El código que puso antes Adrian_E prende y apaga todos los leds.
No se suponía que hiciera eso con cada segundo. Se suponía que prendiera de a 1 o incorporar de a 1.
Eso fue lo que señalé.
Sí, desde luego, disculpa. Quizá no me expresé bien o le quisé dar una "entonación" que no se aprecia.
Lo que quisé decir es lo mismo que tú comentabas: que el código estaba bien (salvando errores sintácticos varios) para apagar y encender todos los led a la vez. Aunque estaba claro que no para hacer efectos de intermitencia individual.
Ahh ninguna duda de ello. Pero bueno tu le diste el enfoque que el pretendía asi que de todos modos buen intento de Adrian_E.
En lo personal Adrian_E debes aprender a ENTENDER porque no funciona un código.
Yo hago esto (y creo que todos hacemos lo mismo), simplemente pongo impresiones al monitor serie de los resultados parciales. Eso me ayuda a entender si la rutina esta funcionando como yo pensé o no.
Luego cuando descubres que lo estas haciendo mal, es todo un ejercicio descubrir cómo resolver el problema.
Lo mejor para aprender es resistirse a pedir AYUDA, y romperse la cabeza intentándolo.
Solo cuando estas contra la pared porque se te acaba el tiempo para entregar un proyecto o trabajo, sales a solicitarla, pero porque agotaste todo lo que tu creías poder hacer.
Es mi mejor consejo para que vayas mejorándote con cada código.
Gracias por el consejo surbyte, voy a probar lo del monitor serie
surbyte:
Yo hago esto (y creo que todos hacemos lo mismo), simplemente pongo impresiones al monitor serie de los resultados parciales. Eso me ayuda a entender si la rutina esta funcionando como yo pensé o no.
Al principio me chirriaba que en todos los programas hubiese un Serial.begin, y estuvieran plagados de Serial.print, aun cuando los proyectos se diseñan para funcionar independientes de un ordenador.
Ahora lo comprendo, y sin esa ayuda de seguimiento, me sería imposible avanzar cuando los "sketches" empiezan a crecer.