Подскажите с инверсией.

Тема в разделе "Arduino & Shields", создана пользователем varvik85, 23 фев 2013.

  1. varvik85

    varvik85 Нерд

    Подскажите как выводиь значения в инверсии, то есть если напряжение будет равно 5 вольт выводить значение равное 0 и так до 0вольт которое будет равно 5 вольтам.




    Код (Text):

     
    // include the library code:
    #include <LiquidCrystal.h>
     
    // initialize the library with the numbers of the interface pins
    LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
     
    // variables for input pin and control LED
      int analogInput = 1;
      float vout = 0.0;
      float vin = 0.0;
      float R1 = 50000.0;   // !! resistance of R1 !!
      float R2 = 4400.0;    // !! resistance of R2 !!
     
    // variable to store the value
      int value = 0;
     
    void setup(){
      // declaration of pin modes
      pinMode(analogInput, INPUT);
     
      // set up the LCD's number of columns and rows:
      lcd.begin(16, 2);
      lcd.print("Vin=");
    }
     
    void loop(){
      // read the value on analog input
      value = analogRead(analogInput);
     
      vout = (value * 5.0) / 1024.0;
      vin = vout / (R2/(R1+R2));
     
      // print result to lcd display
      lcd.setCursor(4, 0);
      lcd.print(vin);
      lcd.print("V");
     
      // sleep...
      delay(500);
    }
     
  2. varvik85

    varvik85 Нерд

    В голову приходит использование постоянного сравнения и перевода в другое значение путем сравнения переменной vin,но это очень муторно прописывать все значения затруднительно,есть простой вариант выводить значения в инверсии?

    Код (Text):

     
    if (vin == 5)
      {
     
      lcd.clear();
      lcd.print(0);
      }
     
     
  3. Unixon

    Unixon Оракул Модератор

    Эмм... а разве выражение "Y = 5 - X" задачу не решает?
     
    varvik85 нравится это.
  4. varvik85

    varvik85 Нерд

    нет не решает,получаются отрицательные числа,мне же нужны противоположные например на входе 5 вольт,а вольтметр показывает 0, на входе 4 вольта а вольтметр показывает 1,на входе 3 вольта а вольтметр показывает 2 ,на входе 2 вольта а вольтметр показывает 3 и так далее.Переменная vin с плавающей точкой,нужны противоположные числа как бы инверсные.И еще вопрос как расширить границы vin так как данный код показывает значения до сотых долей например 54.63 а хотелось бы до десятитысячных 54.6309 ну и так далее
     
  5. Unixon

    Unixon Оракул Модератор

    Ну так вы попробуйте сами сосчитать, хотя бы на бумажке...
     
  6. varvik85

    varvik85 Нерд

    Да действительно))) Спасибо! а как быть с "И еще вопрос как расширить границы vin так как данный код показывает значения до сотых долей например 54.63 а хотелось бы до десятитысячных 54.6309 ну и так далее" ???
     
  7. Dmitriy Kunin

    Dmitriy Kunin Гик

    Про расширение сейчас не скажу.
    А диапазоны преобразуются вот этой фигнёй:
    sensVal = constrain(sensVal, 10, 150);
    sensVal = constrain(sensVal, 150, 10); так тоже работает, если мне память не изменяет, не могу вспомнить в каком из проектов я это пользовал, поэтому без конкретики, только как направление поиска...
    И map() тоже инвертировать умеет.
    Думаю этих двух хватит.
     
    varvik85 нравится это.
  8. varvik85

    varvik85 Нерд

    спасибо!
     
  9. varvik85

    varvik85 Нерд

    По поводу sensVal = constrain(sensVal, 10, 150); - немного не то,ограничивает число значением,но не расширяет,мне нужно чтоб тысячные и десятитысячные отображались,испробовал "Y = 5 - X" и constrain в итоге получилось вот что:

    Код (Text):
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
      int analogInput = 1;
      float vin = 0.0;
      int value = 0;
      void setup(){
      pinMode(analogInput, INPUT);
      lcd.begin(16, 2);
      lcd.print("Vin=");
    }
     
    void loop(){
     
      value = analogRead(analogInput);
      value = constrain(value, 0 , 150000);
      vin = 340 - value;
      lcd.setCursor(4, 0);
      lcd.print(vin);
      lcd.print("V");
      delay(500);
    }
    как теперь расширить значения до тысячных?
    спасибо за помощь!
     
  10. varvik85

    varvik85 Нерд

    аказывается float vin = 0.000000; вот тут можно расширить просто добавив нули после запятой
     
  11. varvik85

    varvik85 Нерд

    но,на жк не всегда отображаются,допустим если я установил vin=0.000 то на жк при значениях меньше 100 отображаются тысячные,а если значение больше 100 до 999 то отображаются сотые,место нуля "десятых" как бы занимает число перед запятой

    пример 52.000 ; 323,00 почему так происходит?
    и почему то после запятой значения не меняются,просто постоянно горят нули..
     
  12. Dmitriy Kunin

    Dmitriy Kunin Гик

    Когда я писал, что это направление поиска я имел в виду, что вопрос инверсии, решаем, но дальше нужно будет понять, как правильно объявлять переменные, а как я это решал, не помню, но решение есть.
    Из того, что я нашёл с инверсией, это управление моторами, а там мне надо было целые числа писать в PWM...
     
  13. varvik85

    varvik85 Нерд

    еще вопрос,немного не по теме ,но может Вы знаете,очень интересна тема на счет 3д принтера на ардуино мега,у Вас нет опыта в построении этого станочка?
     
  14. Megakoteyka

    Megakoteyka Оракул Модератор

    А где Вы об этом узнали, если не секрет?
     
  15. varvik85

    varvik85 Нерд

    методом тыка как говорится) просто забил значения прошил и увидел что нули прибавились но..."но,на жк не всегда отображаются,допустим если я установил vin=0.000 то на жк при значениях меньше 100 отображаются тысячные,а если значение больше 100 до 999 то отображаются сотые,место нуля "десятых" как бы занимает число перед запятой" не знаю почему так
     
  16. pyro

    pyro Гик

    А зачем резирвировать два байта для переменной которая никогда не меняет своего значения
    int analogInput = 1;
    если можно использовать
    #define analogInput 1
     
  17. Megakoteyka

    Megakoteyka Оракул Модератор

    Вообще в языке программирования нет такой фишки. Представление числа на выводе никак не связано со способом задания переменной. И лишний ноль тут ничего не изменит. Мне кажется, просто что-то с чем-то совпадает и дает такой эфект. Нужно в программе разбираться. Кстати, функция print() принимает на вход только целые (согласно референсу). Как Вы float выводили?
     
  18. Megakoteyka

    Megakoteyka Оракул Модератор

    А в случае дефайна значение константы в памяти разве нигде не хранится? ;)
    Те же яйца, только в профиль. Больше вопрос стиля.
    Но дефайнить константы определенно более правильно, нежели хранить их в переменных (которые к тому же могут измениться).
     
  19. Unixon

    Unixon Оракул Модератор

    Еще более правильно вспомнить, наконец, о const .
     
  20. pyro

    pyro Гик

    В данном случае зто номер вывода. По моему правильней дать команду препроцессору
    #define analogInput 1
    подставлять вместо "analogInput" значение "1"