Вывод показаний сенсора(серийного монитора) на LCD.

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

  1. Thais

    Thais Нуб

    Здравствуйте, пожалуйста помогите со скетчем.
    Требуется просто для начала вывести показания потенциометра или любого другого сенсора через serial monitor на LCD c кнопками.
    Скетч:

    #include <Wire.h>
    #include <LiquidCrystal.h>

    LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );

    // Нажатые кнопки
    int button;
    const int BUTTON_NONE = 0;
    const int BUTTON_RIGHT = 1;
    const int BUTTON_UP = 2;
    const int BUTTON_DOWN = 3;
    const int BUTTON_LEFT = 4;
    const int BUTTON_SELECT = 5;

    int getPressedButton()
    {
    int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0)
    if (buttonValue < 100) {
    return BUTTON_RIGHT;
    }
    else if (buttonValue < 200) {
    return BUTTON_UP;
    }
    else if (buttonValue < 400){
    return BUTTON_DOWN;
    }
    else if (buttonValue < 600){
    return BUTTON_LEFT;
    }
    else if (buttonValue < 800){
    return BUTTON_SELECT;
    }
    return BUTTON_NONE;
    }

    void setup()
    {
    lcd.begin(16, 2);
    lcd.print("Welcome");
    Serial.begin(9600);
    delay(10);
    }

    void loop()
    {
    int sensorValue = analogRead(A14);
    Serial.println(sensorValue);
    delay(1);
    int a = analogRead(A14);
    button = getPressedButton();
    switch (button)
    {
    case BUTTON_RIGHT: // при нажатии кнопки выводим следующий текст
    lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(0, 0);
    lcd.write(a);
    break;
    case BUTTON_LEFT:
    lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(0, 0);
    lcd.print("BUTTON: LEFT");
    break;
    case BUTTON_UP:
    lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(0, 0);
    lcd.print("BUTTON: UP");
    break;
    case BUTTON_DOWN:
    lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(0, 0);
    lcd.print("BUTTON: DOWN");
    break;
    case BUTTON_SELECT:
    lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(0, 0);
    lcd.print("BUTTON: SELECT");
    break;
    }
    }



    При нажатии например кнопки RIGHT должно выводиться значение потенциометра с A14 , переменная a, но этого не происходит. Подскажите пожалуйста почему?
    Рисунок знакомест на LCD все-таки меняется от положения ручки потенциометра, но численного значения нет.
     
    Последнее редактирование: 5 фев 2016
  2. Sindbad

    Sindbad Гик

  3. Thais

    Thais Нуб

    Все примеры базовые работают абсолютно корректно. А скетч вышеприведенный должен работать?
     
  4. vvr

    vvr Инженерище

    lcd.write(a); замените на print
     
  5. Thais

    Thais Нуб

    Если print(a); , то появляется ошибка 'print' was not declared in this scope
     
  6. Thais

    Thais Нуб

    Ага, вы имели ввиду lcd.print(a)...
    Теперь значение выводится, но оно статичное и не реагирует на динамические изменения показаний серийного монитора. Новые значения принимаются только после перетыкивания кнопок.Как бы сие поправить?
     
  7. Sindbad

    Sindbad Гик

    Никаких волшебных способов отладки нет. Только рутина - упрощать скетч до тех пор пока ошибка не будет локализована. В данном случае LCD подключен правильно, значит что-то не так с подключением кнопок или их обработкой в программе.

    Выводить значения analogRead(0) в порт пробовали? Значения те же что указаны в скетче получаются?

    И если делаете задержку, учтите, delay(10) это задержка на 0,01 сек, т.е. совершенно неразличимая человеком. Задержка в одну секунду - delay(1000)
     
  8. Thais

    Thais Нуб

    Спасибо за содержательный совет! :) С analogRead(0) считываются все показания кнопок данного LCD.Они все повешены на этот аналоговый вход, так что он по сути больше не используется.
    Работает lcd.print(a) , но значение показываются в ДИНАМИКЕ только при ЗАЖАТОЙ правой кнопке. При этом яркость малоразборчива, как будто нужно опять резистор контрастности подкручивать..Хмм.
    При отжатой показывается статичное значение потенциометра. Если переткнуть с левой-на правую например -значение естественно обновляется. Я хочу понять как добиться чтобы оно демонстрировалось в динамике при ОТЖАТОЙ кнопке...Нельзя же например считывать сенсор, постоянно держа кнопку нажатой..
     
  9. Sindbad

    Sindbad Гик

    Так у Вас же именно так программа и написана.

    Изображение тусклое потому, что вы постоянно (много-много раз в секунду) посылаете на экран значение командой lcd.print(a);
    При отжатой кнопке ничего не происходит, потому что
    Код (C++):
    button = getPressedButton();
    выполняется много-много раз в секунду, значение предыдущей нажатой кнопки нигде не сохраняется, поэтому как только все кнопки будут отпущены, переменная button сразу получает значение BUTTON_NONE, вывод на экран при этом прекращается и на экране с нормальной яркостью отображается последнее выведенное значение.
     
  10. Sindbad

    Sindbad Гик

    Вопрос был немного в другом. Пробовали ли Вы выполнить подобный скетч на своей схеме:
    Код (C++):
    void setup() {
    Serial.begin(9600);
    }
    void loop() {
    Serial.println(analogRead(0));
    delay(1000);
    }
     
     
  11. Thais

    Thais Нуб

    Сразу говорю-код не мой, я его только адаптировала под собственные нужды :)
    Ардуинка у меня с неделю, многих функций в коде я еще не понимаю. Курю мануалы.
    Мне просто вычеркнуть эту строку?
     
    Последнее редактирование: 6 фев 2016
  12. Thais

    Thais Нуб

    Попро
    Попробовала по вашей схеме такой скетч примитивный.
    #include <Wire.h>
    #include <LiquidCrystal.h>

    LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );

    void setup() {
    Serial.begin(9600);
    }
    void loop() {
    Serial.println(analogRead(A14));
    delay(1000);
    int a = analogRead(A14);
    lcd.setCursor(0, 0);
    lcd.print(" ");
    lcd.setCursor(0, 0);
    lcd.print(a);
    }

    Тут все получилось :)
    Только при выводе от большего к меньшему, почему-то выводит еще какую-то загадочную двойку(или тройку).Значения получаются вида 1512-151, 0762-это 76..Загадочно.
     
    Последнее редактирование: 6 фев 2016
  13. Sindbad

    Sindbad Гик

    Ни в коем случае ничего не вычеркивать и ничего не дописывать, если не понимаете как и зачем это нужно.
     
  14. Sindbad

    Sindbad Гик

    Не вижу lcd.begin(16, 2); в последнем скетче.

    А лишние цифры - так и должно быть. Функция analogRead() возвращает числа от 0 до 1023. Допустим в какой-то момент на LCD выводится значение 1012, а следующее значение 987. Тогда второе значение затрет первые три символа предыдущего числа, а последний, четвертый, символ останется, поэтому на экране будет 9872.

    заменить lcd.print(" ") на lcd.print(" "), или, для очистки всей строки на lcd.print(" ") (тут шестнадцать пробелов)

    Апдейт. Упс, идущие подряд пробелы не отображаются в сообщении, тогда так:
    заменить
    Код (C++):
    lcd.print(" ")
    на
    Код (C++):
    lcd.print("    ")
    или, для очистки всей строки на
    Код (C++):
    lcd.print("                ")
    (тут шестнадцать пробелов)