Código persiana y millis

Te dije que no podía funcionar mal, pero claro funciona mal y por qué?

Porque asi definiste los periodos

unsigned long tiempoAnterior = 0;  
int periodo = 40000;                    // <== MAL DEFINIDO
byte temp = 0; 
unsigned long tiempoAnterior2 = 0;  
int periodo2 = 40000;                 // <== MAL DEFINIDO

Deben ser siempre unsigned long para periodo y periodo2.

Había otro leve error que era mas importante que este.. este lo arrastrabas de tu código y luego del switch debemos poner la variable persina = 0 para evitar que repita la secuencia.
En el caso de /arribatodo volvia a cargar millis() en la variable tiempoAnterior

Persiana.ino (6.91 KB)