Sto leggendo un codice di esempio e usano questo metodo per mappare i dati dai sensori IR:
sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255);
Qual è lo scopo di utilizzare constrain
qui se adj_1
sta già ottenendo un valore 0-255 da map
funzione?
Commenti
Risposta
Da il sito ufficiale di Arduino :
[La funzione map] non vincola i valori entro lintervallo, perché a volte i valori fuori intervallo sono intesi e utili. La funzione constrain () può essere utilizzata prima o dopo questa funzione, se si desiderano limiti agli intervalli.
EDIT: Esempio.
Puoi provare questo da solo con questo codice:
int val = 20; val = map(val, 0, 10, 0, 100);
Sebbene tu abbia impostato il limite superiore dellintervallo di valori su 10, hai passato un valore superiore a quello e la funzione lo mapperà linearmente di conseguenza, risultando in un output di 200.
Risposta
Un avvertimento sarebbe essere durante la mappatura di un ingresso che va da 0 a 1023, poiché Arduino non è in grado di leggere al di fuori di questo intervallo non ci sarebbe bisogno di vincoli. Puoi verificarlo eseguendo ogni iterazione da 0 a 1023 e restituendo il valore mappato corrispondente :
for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); }
Certamente, se la lettura del tuo sensore offre un intervallo inferiore da 0 a 1023, allora la funzione constrain () è decisamente richiesta, come per LoganBlade “s esempio. Altrimenti, non è necessario, ma potrebbe comunque rientrare nel regno delle migliori pratiche.
Lunico inconveniente a questa logica sarebbe se stai mappando i valori decimali (cosa che non ha molto senso poiché il la funzione restituirà comunque un tipo lungo), nel qual caso il typecasting interno di Arduino arrotonderà per difetto la mappatura del valore più basso. Esempio:
map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61
Ancora una volta, per motivi di best practice e il potenziale tempo sprecato cercando di trovare un bug di mappatura, è meglio usare constrain () che saltarlo .
Commenti
- Alcuni sensori emettono numeri alti quando sono fuori dal normale raggio di azione o se qualcosaltro è spento. LSTM VLS30X può emettere improvvisamente 8190 dopo aver misurato 487 (mm), ad esempio. Pertanto, il vincolo dovrebbe essere un must. Vedi anche una soluzione allerrore di mappatura troppi utenti rendono jetmore.org/john/blog/2011/09/…
s1_min
es1_max
i limiti garantiti o previsti della lettura grezza?map()
non limita il suo output.