Как сопоставить целые значения и округлить их до десятков/тысяч?
Я сопоставляю потенциометр от 0–1023 до 1000–120 000 (от 1 секунды до 2 минут) для таймера, например:
maxDelay = map (pot2, 0, 1023, 1000, 120000);
Обе переменные являются целыми числами. Теперь я хотел бы преобразовать/округлить значения до 10 секунд (счет тысяч), поэтому, если у меня есть что-то от 1001-5000, это будет округлено до 1000 (1 секунда), а если у меня есть 5001-10000, это будет округляется до 10000 (10 секунд), затем 20 секунд, 30 секунд и т. д., пока не достигнет 120 секунд. Я знаю, что мог бы придумать несколько утверждений «если», но я пытаюсь найти правильный способ выполнения этих математических вычислений. Спасибо.
@Chu, 👍0
1 ответ
Лучший ответ:
▲ 1
Я еще не компилировал его, но что-то вроде этого должно работать:
#include <Math.h>
int converter(int x)
{
if(x <= 5000)
return 1000;
else
return (int)(round(x / 10000.0) * 10000.0);
}
,
@Filip Franik
Смотрите также:
- Как свести аналоговый ввод всего к трем случаям?
- создание анализатора гармоник мощности, который будет измерять амплитуды основной и кратных ей частот (например, 50 Гц, 100 Гц, 150 Гц, 200 Гц,...)
- Отображение значений с аналогового входа дает неожиданные значения?
- Математика на аналоговом считывании неверный результат
- Отправка значения с одного Arduino на другой
- Использование аналогового входа для чтения кнопки
- Как работать с аналоговыми контактами в цикле?
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
Я не уверен, что это то, что я ищу... например, если значение (x) равно 2500, деление на 1000 равно 2,5... ожидаемый результат - 1000. Как это будет происходить? округлить значения?, @Chu
В чудесном мире, если целые числа, делящие
2500
на1000
, дают нам2
. Кажется, я неправильно понял ваш вопрос. Вы хотите, чтобы система показывала только значения 1,10,20,30... Верно?, @Filip Franikверно, но мне все равно нужно, чтобы оно было 1000, если оно меньше 5000... но в этом случае я могу просто использовать ЕСЛИ. Но если число превышает 5000, например 8000, в результате должно получиться 10000... (округляет от 8 до 10 и т. д.). От 17000 до 20000..., @Chu
Да, 1, 10, 20, 30... и всё., @Chu
Замечательно! теперь выглядит хорошо, я попробую и дам вам знать. Спасибо., @Chu
Извините, это все еще не работает для округления 17000 до 20000, подождите минутку., @Filip Franik
да, я заметил, что он всегда округляет числа в меньшую сторону... это не то, чего я ожидал, но все в порядке, он должен выполнять свою работу. Хотя, если вы хотите улучшить ответ, я тоже ценю. Спасибо! :), @Chu
К сожалению, вместо использования свойств целого числа мне пришлось использовать метод round. Это не так элегантно (для корректной работы требуется приведение к двойному значению, а затем обратно к целочисленному), но этот подход должен делать именно то, что вы хотите., @Filip Franik
Просто примечание на будущее (если кто-то ищет подобное решение): на Arduino Due это должно работать нормально, но на платах Atmega я использовал беззнаковое длинное число вместо целого числа, поскольку эти значения превышают 32 767., @Chu