Stránka 1 z 1

Převod hodnot mezi rozsahy.

Napsal: 03 říj 2018, 10:57
od zbysek
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/).

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
Takže v našem případě bude kód starající se o převod vypadat přibližně takto:

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);
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ě:

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);

Re: Převod hodnot mezi rozsahy.

Napsal: 03 říj 2018, 11:59
od gilhad
S funkci map je (nebo dlouhou dobu byl) problem, ze pro cela cisla nedava presne ty vysledky, ktere by clovek cekal:

http://forum.arduino.cc/index.php?topic=280819.0

Re: Převod hodnot mezi rozsahy.

Napsal: 03 říj 2018, 14:37
od petan
Tenhle prevod v podstate neni nic jinyho, na co by nemela jit pouzit obycejna trojclenka :D

Pripadne pomoci dalsich vypoctu vysledek vhodne "deformovat".

Re: Převod hodnot mezi rozsahy.

Napsal: 04 říj 2018, 14:12
od zbysek
Díky za postřeh. Ten nedostatek map funkce jsem neznal. V tomto případě ale map stačí tak, jak je.

Jasně, že tu trojčlenka stačí, ale proč nepoužít už existující funkci :)