подскажите как правильно создать функцию для вывода данных на дисплей

Тема в разделе "Arduino & Shields", создана пользователем Толик Иванов, 10 сен 2016.

  1. Толик Иванов

    Толик Иванов Administrator Администратор

    ребята , создаю функцию для вывода данных на lcd дисплей.
    void scrindisplay (int k, int l, ... m){
    lcd.setCursor( k, l );
    lcd.print(m);
    }
    вопрос в следующем, какой тип данных должен быть у переменной (m), чтоб я мог на её место передавать, как строчные значения, числовые переменные, так и функции типа time?
    или может есть еще какой способ написать такую функцию.

    в итоге хочу вместо
    lcd.setCursor( );
    lcd.print();
    писать функцию в которую буду передавать координаты начала строки на дисплее, и то что я хочу передать на это место.
    по типу:
    void scrindisplay (0,2 ,time);
    или
    void scrindisplay (0,2 ,"введите значение");
    или
    void scrindisplay (0,2 ,button);
     
  2. Onkel

    Onkel Гуру

    ну это надо смотреть по типу в функции lcd.print(m); - это же не ваша функция, а откуда-то (из какой-то библиотеки), вот там и надо смотреть, каким типом данных можно эту ф-ю нагрузить.
    Или lcd.print() - ваша функция? Непонятно из контекста, если ф-я ваша, то что хотите, то и сделаете.
     
  3. Толик Иванов

    Толик Иванов Administrator Администратор

    я хочу заменить 2 строки на одну,
    вместо двух строчек
    lcd.setCursor( 0, 2 );
    lcd.print(time);
    в скетче создать функцию в которую я бы передавал координаты 0 и 2 и то что я хочу написать, в данном случае time. но в функции мне нужно определить эти переменные например
    void scrindisplay (int k, int l, ... m){
    lcd.setCursor( k, l );
    lcd.print(m);
    }
    так вот мне не понятно какой тип переменной должен быть у m чтоб она хавала и строки и переменные
    или я не правильно делаю функцию?
     
  4. Onkel

    Onkel Гуру

    указатель на string cкорее всего, но все же непонятно - lcd.print () - это уже готовая ф-я или это написанная вами функция? Если первое, то только тот тип, что задан в дефайне этой ф-ии, если второе- то я бы сделал указатель на string
     
  5. Толик Иванов

    Толик Иванов Administrator Администратор

    Это стандартная функция библиотеки liquid Cristal
     
  6. Onkel

    Onkel Гуру

    ну так и смотрите в .h файле этой библиотеки тип аргумента.
     
  7. Толик Иванов

    Толик Иванов Administrator Администратор

    в библиотеке которую я использую в файле h есть следующие строки в которых упоминается uint8_t
    это такой тип? это и есть тот тип который мне нужно указать для моей переменной m?

    class LiquidCrystal : public Print {
    public:
    LiquidCrystal(uint8_t rs, uint8_t enable,
    uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
    uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
    LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
    uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
    uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
    LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
    uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
    LiquidCrystal(uint8_t rs, uint8_t enable,
    uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
     
  8. Толик Иванов

    Толик Иванов Administrator Администратор

    покопавшись нашел что в RTC тип данных time это char*
    таким образом если в обычной практике вывод времени на дисплей осуществляется путем
    lcd.setCursor(7,0 );
    lcd.print(time);
    то создав функцию scrindisplay можем заменить две строки в коде на одну по типу:

    void loop {
    scrindisplay ( 7, 0, time);
    }

    void scrindisplay ( int k, int l,char* m){
    lcd.setCursor(k,l );
    lcd.print(m);
    }
    но как сделать так чтоб переменной m можно было передавать не только тип данных char*, но и int и String?
     
    Последнее редактирование: 10 сен 2016
  9. Onkel

    Onkel Гуру

    ну да, почти как я полагал - указатель на массив char, в принципе это то же, что указатель на строку
    char* это и есть string, почти. int конвертнуть функцией sprint(), вроде есть такая в ардуине.
     
  10. AlexU

    AlexU Гуру

    В языке C -- ни как. В языке C++ можно воспользоваться шаблонами. Но Вы должны понимать, что для каждого типа переменной 'm' на основе шаблона будет создана отдельная функция (со всеми вытекающими затратами flash памяти). Иными словами работу по copy/paste кода функции с заменой типа переменной 'm' берёт на себя компилятор C++.
     
  11. Unixon

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

    1) Написать несколько функций под каждый тип переменной.
    2) Наколхозить вариантный тип на struct и union.
    3) То же самое на шаблонах.
     
    Alex19 нравится это.
  12. Толик Иванов

    Толик Иванов Administrator Администратор

    короче почти как создать свою библиотеку вывода данных. сомнительная оптимизация выйдет
     
  13. Unixon

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

    А вы как хотели? Все равно внутри функции придется по-разному разбираться с разными аргументами.