Problemas con millis()

Buenas, estoy intentando que en una secuencia de 7 diodos, cada uno se encienda detras del otro durante un segundo quedando los demas apagados, lo hice con delay y funciona bien, ahora bien, quiero empezar a trabajar con la funcion millis() y consegui apagar y encender un solo diodo, luego intente hacerlo con dos, invirtiendo el resultado de uno con ! y ahora tengo este reto, el codigo que utilizo es:

unsigned long memoria = 0; 
const long segundo = 1000;     
int d=1;
void setup()
{
  pinMode(1,OUTPUT);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  
 
}

void loop()
{
unsigned long tiempo = millis();
digitalWrite(d,HIGH);
    if (tiempo - memoria >= segundo) 
       {
  		memoria = tiempo; 
        digitalWrite(d,LOW);
        d=d++;
     		 if(d==8){d=1;}
   			
		} 


}

pero lo único que hace es encender el diodo del pin 1, solo eso....

¿que hago mal?

gracias

Al parecer al compilador no le gusta esto:

d = d++;

Nunca se me ha ocurrido hacer ese tipo de asignación a la misma variable, ya que se supone que al hacer el ++ directamente estamos incrementando dicha variable.
Cambia esa linea por:

d++;

Se puede poner la incrementación directamente en la condición si se usa un preincremento.

unsigned long memoria = 0; 
const long segundo = 1000;     
int d = 1;

void setup()
{
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop()
{
  unsigned long tiempo = millis();
  digitalWrite(d, HIGH);

  if (tiempo - memoria >= segundo) 
  {
    memoria = tiempo; 
    digitalWrite(d, LOW);
    if (++d >= 8) { d = 1; }
  }
}

:warning: Tenga en cuenta que d = 7 es posible, pero no ha configurado este pin como OUTPUT.


Sería mejor iniciar el estado HIGH en el setup y hacer el cambio de estado del LED dentro del if.

unsigned long memoria = 0; 
const unsigned long segundo = 1000;     
int d = 1;

void setup()
{
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  digitalWrite(d, HIGH);
}

void loop()
{
  unsigned long tiempo = millis();

  if (tiempo - memoria >= segundo) 
  {
    memoria = tiempo;
    digitalWrite(d, LOW);
    if (++d == 8) { d = 1; }
    digitalWrite(d, HIGH);
  }
}

Aquí no es un problema, pero si utiliza Serial, el pin 1 podría causarle problemas.

Buenas, muchisimas gracias a los dos, probe el codigo y va muy bien, de echo aprendi varias cosas, como por ejemplo poner el high en el setup...

"Tenga en cuenta que d = 7 es posible, pero no ha configurado este pin como OUTPUT."

es verdad, se me fue, lo corregí en el codigo

otra cosa, ¿donde se hace el incremento de d? ¿if (++d == 8)... esto ya hace el incremento automáticamente? yo pensaba que primero se hace el incremento y después se pregunta sobre el incremento ¿me explico?

si tenéis algún libro que aconsejarme para hacer practicas seria genial, gracias

En C++, con un ejemplo como este:

if (++d == 8) { d = 1; }

++d es un pre-incremento. La variable d se incrementa primero en 1, y luego este nuevo valor se compara con 8.

Así que si d vale 7 al inicio, ++d la hace pasar a 8, luego la condición if (8 == 8) es verdadera, y el bloque se ejecuta. Dentro, d se vuelve a poner en 1.

Con d++, el comportamiento es diferente:

if (d++ == 8) { d = 1; }

aquí, la comparación se hace primero con el valor antiguo de d, y el incremento ocurre después. Así que si d vale 7, la expresión d++ vale 7 para la comparación, y luego d pasa a 8 después. La prueba falla, y el bloque no se ejecuta.

La diferencia clave es que ++d modifica el valor antes de la comparación, mientras que d++ usa el valor antiguo para la comparación y lo incrementa después.

De manera más general, en C++, la diferencia entre ++d y d++ es el momento en el que se aplica el incremento y el valor que se utiliza en la expresión.

++d es el pre-incremento. La variable se incrementa primero, y luego se utiliza el valor resultante. En una condición como if (++d), d se incrementa inmediatamente, y luego la condición evalúa este nuevo valor. Si d vale 5, pasa a 6 y if (6) se evalúa como verdadero porque un valor distinto de cero es verdadero.

d++ es el post-incremento. El valor actual se utiliza en la expresión, y luego la variable se incrementa después. En if (d++), si d vale 5, la condición evalúa 5, que es verdadero, y luego d pasa a 6 después de la evaluación.

muchísimas gracias por la explicación, eso tampoco lo sabia