Sí, es correcto declarar variables así:
int Var1, Var2, Var3;
... pero es poco recomendable, a no ser que estés seguro de que se van a inicializar posteriormente, antes de ser "usadas". Aunque es probable que la RAM del Arduino se inicialice con ceros al arrancar (o que el "subsistema" de Arduino lo haga). Pero también es probable que no.
Aún así, el que inicialmente toda la RAM esté a cero, sólo nos evitaría que las variables globales y estáticas se "inicializaran con basura". Pero las variables locales de una función no tienen porqué inicializase a cero si no se le especifica y el compilador no está configurado para "limpiar" la memoria cuando la reserva para una variable. Puede haber quedado valores "basura" en la memoria de pila, de anteriores llamadas a otras funciones, y "meternos" valores "inesperados" o erróneos en nuestra variable sin inicializar.
Lo mejor es no dejar cosas al azar. Así que recomiendo inicializar, al menos con un valor conocido, al definir.
¿"Al menos con un valor conocido"? Sí, no necesariamente se ha de inicializar con el valor que realmente queremos, sino que le ponemos un valor "provisional" para posteriormente asignarle el valor que realmente nos interesa. De lo que se trata es que si nos "olvidamos" de poner el valor "bueno" al menos tiene un valor "conocido".
Por ello recomiendo:
int Var1 = 0, Var2 = 0, Var3 = 0;
Por ejemplo, las variables MilisPrevias, en lugar de declararlas e inicializarlas con el valor de millis(), las podemos declarar e inicializar a cero, para posteriormente "inicializarlas" con millis() en el setup().
// Declaramos las variables e inicializamos con un valor "conocido"
unsigned long MillisPrevias1 = 0, MillisPrevias2 = 0, MillisPrevias3 = 0, MillisPrevias4 = 0, MillisPrevias5 = 0;
setup() {
// Inicialización "práctica" de las variables con el valor de millis();
MillisPrevias1 = MillisPrevias2 = MillisPrevias3 = MillisPrevias4 = MillisPrevias5 = millis();
}
Sí, se pueden "concatenar" un igual tras de otro. Esto hace que la función millis() se llame una sola vez y el valor devuelto se le asigne a las cinco variables. A todas el mismo valor.
Por eso mismo, porque la operación de asignación = suele devolver el valor asignado y los if() se cumplen cuando el valor de la expresión a evaluar es distinto a cero, es por lo que la condición...
if(x = 3) {
... se cumple siempre.
Mientras que la condición...
if(x = 0) {
... no se cumple nunca.
El usar un =, simple igual, en lugar de un ==, doble igual, a la hora de comparar, es un fallo típico que causa que el programa no se comporte como deseamos.
Veamos si sabrían decir qué muestra en el monitor serie este programa:
int x = 3;
void setup () {
Serial.begin(9600);
Serial.println(x);
Serial.println(x = 4);
Serial.println(x == 4);
Serial.println(x);
}
void loop() {
}