Citesc câteva exemple de cod și utilizează această metodă de mapare a datelor de la senzorii IR:
sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255);
Ce rost are utilizarea constrain
aici dacă adj_1
obține deja o valoare 0-255 din map
funcție?
Comentarii
Răspuns
De la site-ul oficial Arduino :
[Funcția hartă] nu constrânge valorile în interval, deoarece valorile în afara intervalului sunt uneori intenționate și utile. Funcția constrain () poate fi utilizată înainte sau după această funcție, dacă se doresc limite la intervale.
EDIT: Exemplu.
Puteți încerca acest lucru singur cu acest cod:
int val = 20; val = map(val, 0, 10, 0, 100);
Deși ați setat limita superioară a intervalului valorii la 10, ați trecut un o valoare mai mare decât aceasta și funcția o va mapa liniar în consecință, rezultând o ieșire de 200.
Răspuns
Un avertisment ar să fie atunci când cartografiați o intrare care variază de la 0 la 1023, deoarece Arduino este incapabil să citească în afara acestui interval, nu ar fi nevoie să vă constrângeți. Puteți verifica acest lucru executând fiecare iterație de la 0 la 1023 și afișând valoarea mapată corespunzătoare. :
for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); }
Cu siguranță, dacă citirea senzorului dvs. oferă un interval mai mic de la 0 la 1023, atunci funcția constrain () este cu siguranță necesară, conform LoganBlade „s exemplu. În caz contrar, nu este necesar, dar poate să cadă în tărâmul celor mai bune practici.
Singurul sughiț al acestei logici ar fi dacă mapezi la valori zecimale (ceea ce nu are mult sens din moment ce funcția va returna oricum un tip lung), caz în care tipărirea internă a Arduino va rotunji maparea cu cea mai mică valoare. Exemplu:
map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61
Din nou, de dragul celor mai bune practici și al potențialului timp pierdut încercând să găsim o eroare de mapare, folosirea constrain () este mai bună decât omiterea acesteia .
Comentarii
- Unii senzori generează un număr mare atunci când sunt în afara domeniului lor normal de funcționare sau dacă altceva este oprit. STM VLS30X poate emite brusc 8190 după ce a măsurat, de exemplu, 487 (mm). Prin urmare, constrângerea ar trebui să fie o necesitate. Vedeți, de asemenea, o soluție la eroarea de mapare, prea mulți utilizatori fac jetmore.org/john/blog/2011/09/…
s1_min
șis1_max
garantat sau limitele așteptate ale citirii brute?map()
nu constrânge ieșirea.