Převod hodnot mezi rozsahy.
Napsal: 03 říj 2018, 10:57
Mailem mi přišel dotaz na převod teploty na úhel otočení serva. Odpovím tady, třeba se bude někomu hodit.
Dotaz: Dobrý den, měl bych dotaz, zda jste se někdy nezabývali ovládáním serva v závislosti na naměřené teplotě.
Řekněme, že máme třeba proměnnou float temp;, ve které je uložená teplota.
Tuto teplotu potřebujete přepočítat na rozsah, který je možné poslat do Servo motoru. Většinou mají servomotory rozsah vstupních hodnot 0-180.
Řekněme si, že budeme chtít zobrazit teploty 0 až 30°C. Potom tedy musíme nějak převést rozsah 0-30 na rozsah 0-180.
K tomu slouží funkce map (https://www.arduino.cc/reference/en/lan ... /math/map/).
Krom toho bychom měli před použitím funkce map hodnotu ještě oříznout. Řekli jsme, že teplotu budeme mít v rozmezí 0-30, takže můžeme k oříznutí použít funkci constrain (https://www.arduino.cc/reference/en/lan ... constrain/) následovně:
Dotaz: Dobrý den, měl bych dotaz, zda jste se někdy nezabývali ovládáním serva v závislosti na naměřené teplotě.
Řekněme, že máme třeba proměnnou float temp;, ve které je uložená teplota.
Tuto teplotu potřebujete přepočítat na rozsah, který je možné poslat do Servo motoru. Většinou mají servomotory rozsah vstupních hodnot 0-180.
Řekněme si, že budeme chtít zobrazit teploty 0 až 30°C. Potom tedy musíme nějak převést rozsah 0-30 na rozsah 0-180.
K tomu slouží funkce map (https://www.arduino.cc/reference/en/lan ... /math/map/).
Kód: Vybrat vše
int servoVal = map(value, fromLow, fromHigh, toLow, toHigh);
- value - vstupní hodnota (u nás teplota)
- fromLow - spodní hranice původního rozsahu
- fromHigh - horní hranice původního rozsahu
- toLow - spodní hranice nového rozsahu
- toHigh - horní hranice nového rozsahu
Kód: Vybrat vše
float temp = getTemp(); // tento řádek zastupuje získání teploty ze senzoru
int servoVal = map(temp, fromLow, fromHigh, toLow, toHigh);
servo.write(servoVal);
Kód: Vybrat vše
float temp = getTemp(); // tento řádek zastupuje získání teploty ze senzoru
int iTemp = constrain(temp, 0, 30);
int servoVal = map(iTemp, fromLow, fromHigh, toLow, toHigh);
servo.write(servoVal);