Převod hodnot mezi rozsahy.

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18
Reputation: 0

Převod hodnot mezi rozsahy.

Příspěvek od zbysek » 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/).

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

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Převod hodnot mezi rozsahy.

Příspěvek od gilhad » 03 říj 2018, 11:59

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

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Převod hodnot mezi rozsahy.

Příspěvek od petan » 03 říj 2018, 14:37

Tenhle prevod v podstate neni nic jinyho, na co by nemela jit pouzit obycejna trojclenka :D

Pripadne pomoci dalsich vypoctu vysledek vhodne "deformovat".

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18
Reputation: 0

Re: Převod hodnot mezi rozsahy.

Příspěvek od zbysek » 04 říj 2018, 14:12

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

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 18 hostů