Преобразовать не линейные значения с аналогового порта

Тема в разделе "Микроконтроллеры AVR", создана пользователем tpalpha, 16 янв 2020.

  1. tpalpha

    tpalpha Нуб

    Помогите, ткните направьте, подскажите.
    Потенциометр управляет клапаном воды, мне нужно, чтобы на экран выводилась скорость в мл/с потока воды.
    Клапан управляется по ШИМ.
    Калибровку проведу в ручную, т.е. замерю значение АЦП и пропущу воду через клапан в мерник.
    Как сделать, чтоб в скетче при повороте ручки потенциометра на экран выводилась не АЦП, а скорость потока воды?
     
  2. Yuriy.pv

    Yuriy.pv Нерд

    Вам нужно начать с правильной формулировки вопроса. Какой клапан? Два состояния, поворотный? То что вы пропустите воду в мерник ничего не даст, прохождение еще зависит от давления. Ну а потом уже переводить ацп в поток.
     
  3. DetSimen

    DetSimen Guest

    купи себе вот такой щёччик за 200р и не знай горя.
    https://aliexpress.ru/item/32833618985.html
    у него определенное кол-во импульсов на литар
     
  4. parovoZZ

    parovoZZ Гуру

    Составить калибровочную таблицу и по ней находить искомое значение по показаниям с АЦП. С АЦП достаточно снимать 8 бит.

    Только я не понял - АЦП с чего сигнал снимает?
     
  5. DetSimen

    DetSimen Guest

    У мня такой в теплице стоит, как даччик включения насоса. Если импульсы поступают - насос включен. Заадно, можно и литры щитать.
    Но, если надо понадежнее, такие же есть латунные, с рабочим давлением побольше.
     
  6. b707

    b707 Гуру

    Когда будешь делать калибровку - оформи ее в виде таблички, где в одной колонке - значения АЦП. в другой - расход воды.
    Потом в скетче берешь значение АЦП. находишь строчку таблицы с таким значением и выводишь расход из второй колонки...
     
  7. DetSimen

    DetSimen Guest

  8. tpalpha

    tpalpha Нуб

    Спасибо всем за советы.
    Сигнал с переменного резистора.
    Вы предлагаете работу с массивом, если я правильно Вас понял.
    Я уже про это думал, ранее с массивами не работал, запись в массив понятна
    на примере:
    const short analogPin[][2] PROGMEM = {
    { OV( 23), 300 },
    { OV( 25), 295 },
    { OV( 27), 290 },
    { OV( 28), 285 },
    { OV( 31), 280 },
    };
    а вот как вывести все это не нашел. Есть поверхностные темы, где указанно как можно вывести определенное значение строки и столбца с массива. А тут у меня ступор(
     
  9. tpalpha

    tpalpha Нуб

    Спасибо, но тут вопрос не в готовом изделии, а в совершенствовании себя в программировании, всегда приятно сделать, что то из минимума).
     
  10. tpalpha

    tpalpha Нуб

    Про калибровку написал, чтоб наоборот меньше вопросов было.
    клапан такой: https://aliexpress.ru/item/4000038745567.html?spm=a2g0s.9042311.0.0.3e8033edWbxxKe
     
  11. DetSimen

    DetSimen Guest

    А, ну флаг тебе в руки. Я думал, ты чо полезное делаешь, а так-то, канешна, чо, совершенствуйся.
     
  12. tpalpha

    tpalpha Нуб

    Дак я полезное и делаю, это все физичиски у меня на макетке есть.
    И если так рассуждать зачем думать головой и что то изобретать, когда можно вообще выложить кучу бабла и тебе все сделают.
    И спасибо я вроде Вам сказал за совет, просто не мой вариант данный счетчик, т.к. в дальнейшем клапан будет работать с агрессивными жидкостями. Не уверен, что счетчик из пластмассы выдержит.
     
    Последнее редактирование: 16 янв 2020
  13. parovoZZ

    parovoZZ Гуру

    Я же пишу - с АЦП снимаешь 8 бит. Всего 255 значений (да и это много - в такой системе точность будет хуже некуда). С такой же размерностью создаешь и массив. Получается, что значение с АЦП будет являться индексом массива. В противном случае надо будет извлекать из массива либо ближайшее значение, либо делать интерполяцию.
     
  14. b707

    b707 Гуру

    и что в них поверхностного?
    Что там обьянять то, вывод ячейки вашего массива с индексами х и у будет analogPin[x][y]
     
  15. tpalpha

    tpalpha Нуб

    т.е. прям с х и у и писать?
    для меня не понятно, как программа понимает что х это строка, у столбец?
    наверно их надо как то объявить? (ни где про это не пишут)
     
    Последнее редактирование: 16 янв 2020
  16. parovoZZ

    parovoZZ Гуру

    а программе это зачем? Для нее это даже не двумерный массив (это уровень абстракции языка Си), а конкретный адрес ячейки со значением. Адрес ячейки вычисляет компилятор на этапе компиляции программы. Вот и вся любовь.
     
  17. tpalpha

    tpalpha Нуб

    или я уже запутался или....
    я правильно понял?
    //объявляем переменную к примеру:
    int analogPin = analogRead(0);
    void setup() {
    //указываем массив
    const short analogPin[][2] PROGMEM = {
    { 1, 10 },
    { 2, 30 },
    ......
    { 255, 500 }
    };
    }
    void loop()
    {
    analogPin[x] = analogPin[y]; // вот тут у меня затуп???
    display.print(analogPin[y]); //выводим на дисплее
    display.display(); // фактически отобразить текст на экране.
    analogWrite(klapan, analogPin); // открываем клапан
     
  18. DetSimen

    DetSimen Guest

    Тоись, книшки читать это не наш метод? Надо тупить на форуме...
     
    b707, issaom и parovoZZ нравится это.
  19. parovoZZ

    parovoZZ Гуру

    это называется

    ??? Зачем индекс элемента массива заправлять в элемент массива???
     
    issaom нравится это.
  20. b707

    b707 Гуру

    уважаемый, у меня тоже затуп от ваших вопросов. Что вы вообще пытаетесь сделать?
     
    issaom и parovoZZ нравится это.