Warum wird die Einschränkungsfunktion nach der Kartenfunktion verwendet?

Ich lese einen Beispielcode und sie verwenden diese Methode zum Zuordnen von Daten von IR-Sensoren:

 sensor1 = analogRead(0); adj_1 = map(sensor1, s1_min, s1_max, 0, 255); adj_1 = constrain(adj_1, 0, 255); 

Wozu wird constrain hier verwendet, wenn adj_1 bereits einen Wert von 0-255 von der map Funktion?

Kommentare

  • Sind s1_min und s1_max die garantierten oder die erwarteten Grenzen des Rohwerts? map() schränkt die Ausgabe nicht ein.
  • @EdgarBonet Was meinst du damit, dass ' die Ausgabe nicht einschränkt? Wird ' nicht ein Wert von 0-255 zurückgegeben?
  • Nicht unbedingt, es ist nur eine lineare Zuordnung.
  • Entschuldigung, was bedeutet das? Mittelwert?
  • Eine lineare Funktion .

Antwort

Von der offiziellen Arduino-Site :

[Die Kartenfunktion] beschränkt die Werte nicht auf den Bereich, da Werte außerhalb des Bereichs manchmal beabsichtigt und nützlich sind. Die Funktion constrain () kann entweder vor oder nach dieser Funktion verwendet werden, wenn Grenzen für die Bereiche gewünscht werden.

BEARBEITEN: Beispiel.

Sie können dies selbst mit folgendem Code versuchen:

int val = 20; val = map(val, 0, 10, 0, 100); 

Obwohl Sie die Obergrenze des Wertebereichs auf 10 gesetzt haben, haben Sie eine übergeben Ein höherer Wert als dieser und die Funktion ordnen ihn dementsprechend linear zu, was zu einer Ausgabe von 200 führt.

Antwort

Eine Einschränkung wäre Wenn Sie eine Eingabe im Bereich von 0 bis 1023 zuordnen, müssen Sie keine Einschränkungen vornehmen, da der Arduino nicht in der Lage ist, außerhalb dieses Bereichs zu lesen. Sie können dies überprüfen, indem Sie jede Iteration von 0 bis 1023 durchlaufen und den entsprechenden zugeordneten Wert ausgeben :

for (int i = 0; i < 1024; i++){ Serial.print(i); Serial.print(","); Serial.println(map(i, 0, 1023, 0, 255)); } 

Wenn Ihr Sensorwert einen Bereich von weniger als 0 bis 1023 bietet, ist die Funktion constrain () gemäß LoganBlade definitiv erforderlich Beispiel. Andernfalls wird es nicht benötigt, kann aber dennoch in den Bereich der Best Practice fallen.

Der einzige Nachteil dieser Logik wäre, wenn Sie Dezimalwerten zuordnen (was seit dem nicht viel Sinn macht Die Funktion gibt ohnehin einen langen Typ zurück. In diesem Fall rundet die interne Typumwandlung des Arduino Ihre Zuordnung mit dem niedrigsten Wert ab. Beispiel:

map(0, 0, 1023, 8.9, 61.9)); >> 0 becomes 8 map(1023, 0, 1023, 8.9, 61.9)); >> 1023 becomes 61 

Aus Gründen der Best Practice und der potenziellen Zeitverschwendung beim Versuch, einen Zuordnungsfehler zu finden, ist die Verwendung von constrain () besser als das Überspringen .

Kommentare

  • Einige Sensoren geben hohe Zahlen aus, wenn sie sich außerhalb ihres normalen Betriebsbereichs befinden oder wenn etwas anderes ausgeschaltet ist. Der STM VLS30X kann plötzlich 8190 ausgeben, nachdem er beispielsweise 487 (mm) gemessen hat. Daher sollte Einschränkung ein Muss sein. Siehe auch eine Lösung für den Zuordnungsfehler. Zu viele Benutzer machen jetmore.org/john/blog/2011/09/…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.