Как преобразовать показания в проценты в ардуино

Я использую этот пример, как использовать фоторезистор для определения значения свет, который получает датчик, но я хочу преобразовать показания резистора в проценты, но я не могу использовать функцию map() из Arduino docs, но я могу реализовать нечто подобное

поэтому я создал эту простую функцию

float photo_resistor(int pinNum)
{
    float reading = analogRead(pinNum);
    if (reading == 54)
    {
     return 0.0;
    }
    return (reading - 54)/(100/920);

}

как и в документах, я хочу использовать диапазон вывода от 0 до 100, и минимальное значение, которое я получил, равно 54, а максимальное - 974

return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
// это становится (x - 54)*(100 - 0) / (974 - 54) + 0;
// (х-54)/(100/920);

но это не выводит значение по шкале от 0 до 100

, 👍1

Обсуждение

ваш вопрос касается арифметики, а не Arduino, @jsotola

подумайте о корзине, которая может вместить максимум 20 яблок... в корзине 6 яблок... насколько заполнена корзина, выраженная в процентах?, @jsotola


1 ответ


Лучший ответ:

4

Вы писали:

return (reading - 54)/(100/920);

В C++ 100/920 равен нулю. Это потому, что, когда оба операнда целые числа, оператор деления выполняет целочисленное деление. Вы можете преодолеть эту проблему, убедившись, что хотя бы один из операндов является числом с плавающей запятой. Например, 100.0/920 примерно равно 0,1087.

Однако у вас отсталое деление. Вы, вероятно, имели в виду

return (reading - 54) * (100.0/920);
,

Я бы использовал return max(0.0, min(100.0, (reading-54.0))*(100.0/920))); -- это гарантирует, что никакие значения за пределами диапазона 0.0 .. 100.0 никогда не возвращаются, даже когда используется другой фоторезистор с немного другими допусками., @orithena