Sicuramente == va bene per verificare un'uguaglianza; a volte, però, in particolare se verifichi i millisecondi trascorsi, usando solo == può sfuggire inosservato l'istante in cui il valore coincide con quello previsto: in tal caso, pur essendo trascorso il tempo previsto, la condizione non è mai soddisfatta. Ad esempio, se il ciclo viene periodicamente interrotto da un sensore a ultrasuoni o da un pulseIn in attesa, le letture di millis()-t0 potrebbero essere:
988
991
992
995
996
999
1002
1003
1005
Se mettiamo un
if(millis()-t0==1000) {...}
tale condizione non sarà mai soddisfatta. Scrivendo, invece:
if(millis()-t0>=1000) {...}
la condizione sarà soddisfatta con la lettura 1002: con due millisecondi di ritardo, ma sarà soddisfatta.
Questo è un discorso di carattere generale, che va applicato nei casi in cui i valori cambiano abbastanza rapidamente ed è possibile che la lettura soddisfacente venga saltata. Altre volte, invece, bisogna assolutamente usare ==, perché la condizione deve essere soddisfatta solo se i due valori sono veramente uguali.
Nota: con variabili di tipo float (che, anche per questo, vanno usate solo se è assolutamente indispensabile) non bisogna usare ==, perché molto probabilmente la condizione non verrà mai soddisfatta! Ad esempio, se leggi una temperatura in Fahrenheit, la converti in Celsius e la elabori ulteriormente ottenendo un float irrazionale, poi vai a scrivere if(temperatura==20.0) {...} tale condizione non sarà mai soddisfatta, perché temperatura potrà valere 19,99768 o 20,00001 ma ben difficilmente 20,00000.