Переменная int в процентах

Тема в разделе "Arduino & Shields", создана пользователем Freezly, 24 апр 2016.

  1. Freezly

    Freezly Нуб

    Задача: вывести показание фоторезистора на экран в процентах
    Проблема: Напрямую analogRead выводит корректное число, но если перевести в проценты на выходе всегда будет 0.
    Скетч:
    void setup()
    {
    Serial.begin(9600);
    }

    void loop()
    {
    int X = analogRead(A0) / 900 * 100;
    Serial.print(X);
    delay(500);
    }

    Заранее спасибо.
     
  2. noevile

    noevile Гик

    хммммм .. может надо иногда заглядывать в примеры, которые встроены в Arduino IDE !? .. там есть пример считывания аналогового значения и вывода его в сериал .. немного переделать его для вывода процентов и вуаля .. скетч готов .. как вы считаете нормальная меня идея посетила? :))

    void setup() {
    // initialize serial communication at 9600 bits per second:
    Serial.begin(9600);
    }

    // the loop routine runs over and over again forever:
    void loop() {
    // read the input on analog pin 0:
    int sensorValue = analogRead(A0);
    // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
    float voltage = sensorValue * (5.0 / 1023.0);
    // print out the value you read:
    Serial.println(voltage);
    }
     
  3. Freezly

    Freezly Нуб

    Вы не уловили сути проблемы. Сфокусирую внимание на непонятном мне моменте:
    почему при выражении:
    int X = 750 / 900 * 100;
    X = 0?
    Скетч:
    void setup()
    {
    Serial.begin(9600);
    }

    void loop()
    {
    int X = 750 / 900 * 100;
    Serial.print(X);
    delay(500);
    }
     
  4. noevile

    noevile Гик

    а что тут не понятного? int целочисленное .. float дробное .. вот вы и пытаетесь присвоить дробь, переменной которая понимает только целые числа

    суть как раз проста как три копейки .. надо сначала разобраться с типами данных .. какие бывают .. что умеют .. вот вам ресурс для этого http://arduino.ru/Reference .. читайте набирайтесь опыта .. практикуйтесь .. всё просто
     
  5. Tomasina

    Tomasina Сушитель лампочек Модератор

    int X = map(analogRead(A0), 0, 1023, 0, 100);

    750 поделить на 900 будет 0 целых. Ноль помножить на 100 будет 0.
    Никакой ошибки в вычислениях тут нет.
     
    Последнее редактирование: 24 апр 2016
    noevile нравится это.
  6. noevile

    noevile Гик

    кстати да .. хороший пример как затолкать один диапазон пропорционально в другой
     
  7. Freezly

    Freezly Нуб

    Отличный рабочий вариант, спасибо.

    Так если int отображает только целые числа, то ответом на выражение
    int X = 750 / 900 * 100 будет 83?
    Если использовать float, который в свою очередь говорит о плавающей запятой, то ответ получатся 0,00
     
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    Потому что ты компилятору явно указал, что надо использовать целочисленные умножение и деление и присвоить целочисленный результат переменной с плавающей точкой. Что он тупо и сделал ;)
    Код (C++):
    float X = (float)(750 / 900) * 100.0;
    float X = 750.0 / 900.0 * 100.0;
     
    Последнее редактирование: 24 апр 2016
    noevile нравится это.
  9. Freezly

    Freezly Нуб

    Результат: 0.00
     
  10. noevile

    noevile Гик

    на вот как говорится с пылу с жару только что опробованный скетч

    void setup() {
    // initialize serial communication at 9600 bits per second:
    Serial.begin(9600);
    }

    // the loop routine runs over and over again forever:
    void loop() {
    // read the input on analog pin 0:
    int sensorValue = analogRead(A1);
    // print out the value you read:
    float x = 700.0/900.0*100.0;
    float y = sensorValue/900.0*100.0;
    Serial.println(x);
    Serial.println(y);
    Serial.println(sensorValue);
    delay(500); // delay in between reads for stability
    }
     
  11. noevile

    noevile Гик

    свой только аналоговый вход подставь .. а то я А1 использовал .. а у тебя А0
     
  12. Freezly

    Freezly Нуб

    Ребят, вы бы так и сказали, что в выражении следует писать дробные представления чисел:

    int X = 750 / 900 * 100 - НЕ ВЕРНО
    int X = 750,0 / 900.0 * 100.0 - ВЕРНО и X обрел свои 83....
     
  13. noevile

    noevile Гик

    и то и другое выражение верно .. ошибок там нет .. потому что ошибка в голове .. так как голова не понимает то, чего просит от контроллера!!!!

    в первом выражении голова говорит контроллеру раздели мне 750 на 900 .. контроллер кивнул .. разделил .. и получил целочисленный результат 0 .. дальше голова говорит умножь мне то что получилось на 100 .. контроллер кивнул как те двое из ларца одинаковы с лица и умножил 0 на 100 .. и получил целочисленный ноль .. суть сей басни такова что голова не разделяет целочисленные и дробные для контроллера .. думает что контроллер умный и сам догадается .. а контроллер собака серая не хочет догадываться и делает всё так, как в него заложили разработчики

    во втором выражение всё тоже самое с оговоркой что контроллер уже выполняет теже действия , но только с уже дробными числами .. но вот тут загадка .. если числа дробные то куда делась дробная часть числа???? .. наверно потому что голова сказала контроллеру затолкай ка мне дробное число в целочисленную переменную .. контроллер кивнул и затолкал только целочисленную часть числа выкинув к чертям дробную часть числа

    мораль сей басни такова: сначала надо понять что такое контроллер .. понять как он работает .. как думает .. чем живёт .. а уже потом писать что верно , а что нет
     
    Motrosoff нравится это.