НОВИЧОК нужна помощь с дисплеем

Тема в разделе "Arduino & Shields", создана пользователем vovchik001, 2 дек 2014.

  1. vovchik001

    vovchik001 Нерд

    Друзья, я только вчера купил набор матрешка, но к сожалению имею только гуманитарное образование и не умею практически им пользоваться. Нужна Ваша помощь в реализации идеи. Как подключить дисплей к плате и писать кириллицей я разобрался, с помощью этого сайта. Теперь есть задача, по нажатию кнопки выводить на дисплей одно из заготовленных заранее сообщений, будьте любезны помогите с подключением кнопки и кодом. Заранее благодарен.
     
  2. Salk

    Salk Гик

    Про подключение кнопки, посмотрите здесь:
    http://wiki.amperka.ru/конспект-arduino:кнопка
    Про дисплей:
    http://wiki.amperka.ru/схемы-подключения:подключение-текстового-экрана?s[]=lcd

    По скетчу. Проще всего воспользоваться уже готовым примером из Arduino IDE. "Файл=>Примеры=>02.Digital=>Button (кнопка)
    Там предельно просто.
    Но вот накидал такой скетч:
    Код (Text):
    // Подключаем стандартную библиотеку LiquidCrystal
    #include <LiquidCrystal.h>

    // RS, E, DB4, DB5, DB6, DB7
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);

    // constants won't change. They're used here to
    // set pin numbers:
    const int buttonPin = 2;    // номер пина для кнопки

    // variables will change:
    int buttonState;

    void setup()
    {
      lcd.begin(16, 2);
      pinMode(buttonPin, INPUT);
    }

    void loop(){
      // считываем состояние кнопки и записываем в переменную
      buttonState = digitalRead(buttonPin);

      if (buttonState == HIGH) // если кнопка нажата, то выводим на экран
      {
        lcd.clear();
        lcd.print("Hello world!"); // текст на экране
        // устанавливаем курсор в колонку 0, строку 1. То есть на
        // самом деле это вторая строка, т.к. нумерация начинается с нуля
        lcd.setCursor(0, 1);
        // печатаем вторую строку
        lcd.print("foo bar baz");
      }

      // Это можно удалить, если не хотите чтобы в отжатом состоянии, на экран что-то выводилось
      else // если кнопка отжата, то будет эта надпись
      {
        lcd.print("Button Low");
        lcd.setCursor(0, 1);
        // печатаем вторую строку
        lcd.print("Push button");
      }
    }
    Можете добавить несколько кнопок и назначить их на разные пины Arduino, считывая с них состояния выводить ту или иную надпись на экран.
     
    Последнее редактирование: 2 дек 2014
  3. vovchik001

    vovchik001 Нерд

    мне нужно чтобы при включении выводилось первое сообщение, по нажатию кнопки оно менялось на новое и так далее, 4-5 сообщений потом снова вставал на первое сообщение. и еще вопрос, кнопку надо вешать на указанный пин а второй стороной на gnd?
     
  4. Salk

    Salk Гик

    Тогда что-то вроде такого:
    Код (Text):
    // Подключаем стандартную библиотеку LiquidCrystal
    #include <LiquidCrystal.h>

    // RS, E, DB4, DB5, DB6, DB7
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);

    #define BUTTON_PIN  10 // пин кнопки

    // тут хранится текущее нажатие (от 0 до 5)
    int clicks;
    boolean buttonWasUp = true;

    void setup()
    {
      lcd.begin(16, 2);
      // initialize the LED pin as an output:
      // initialize the pushbutton pin as an input:
       pinMode(BUTTON_PIN, INPUT_PULLUP);

      // начальное сообщение
      lcd.print("Hello world!"); // текст на экране
      // устанавливаем курсор в колонку 0, строку 1. То есть на
      // самом деле это вторая строка, т.к. нумерация начинается с нуля
      lcd.setCursor(0, 1);
      // печатаем вторую строку
      lcd.print("foo bar baz");
    }

    void loop()
    {
      // счетчик нажатий,
      // каждый раз при нажатии к переменной прибавляется + 1, до 5 раз
      if (buttonWasUp && !digitalRead(BUTTON_PIN))
      {
        delay(10);
        if (!digitalRead(BUTTON_PIN))
          clicks = (clicks + 1) % 5;
      }

    // если один раз нажали, то выводим первый текст
      if (clicks == 1)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT"); // текст на экране №1
      }
    // если второй раз нажали, следующий текст, и т.д.
      if (clicks == 2)
      {
        lcd.setCursor(0, 1); // текст на экране №2
        lcd.print("TEXT2");
      }

      if (clicks == 3)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT3");
      }

      if (clicks == 4)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT4");
      }

      if (clicks == 5)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT5");
      }
    }
    Хотя код так себе, дубовый. Может кто лучший вариант предоставит. Но должен работать. :)

    Первый контакт кнопки к любому цифровому пину (0-13) Arduino (не забыть изменить в скетче, номер пина), сюда же "нацепить" подтягивающий резистор на 10 кОм, и его к земле, как на первом рис. из вики.
    Второй контакт кнопки к +5 В. Чтобы когда мы замыкаем кнопку, была логическая "1".
     
    Последнее редактирование: 2 дек 2014
  5. vovchik001

    vovchik001 Нерд

    а как понять нацепить? я эти схемы впервые в жизни вижу( не в тот ВУЗ пошел учиться((( как это должно выглядеть на макетке? там ведь у кнопки 4 контакта.
     
  6. vovchik001

    vovchik001 Нерд

    с подключением разобрался, но вылезло вот такое - пока держишь кнопку сообщения меняются с огромной скоростью, не успеваешь уследить, как добавить однократное срабатывание? и еще проблема в том, что меняется не весь текст а только часть к примеру после назатия кнопки если на экране было написано "всем привет" становится text4привет, как от этого можно избавиться?
     
  7. Salk

    Salk Гик

    Молодцы, что разобрались с подключением. Там на самом деле всего два контакта, просто они запараллелены. В то место где подключается кнопка к Arduino, ещё ставится резистор, который вторым своим выводом идет на GND. Второй вывод кнопки, идет на +5 В.
    Дальше по скетчу. Нужно его отладить. Т.к. я просто набросал можно сказать, каркас.

    Код (Text):
    // Подключаем стандартную библиотеку LiquidCrystal
    #include <LiquidCrystal.h>

    // RS, E, DB4, DB5, DB6, DB7
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);

    #define BUTTON_PIN  10 // пин Arduino подключенный к кнопке

    int buttonState; // состояние кнопки
    int clicks; // текущее кол-во нажатий
    boolean buttonWasUp = true;

    void setup()
    {
      lcd.begin(16, 2);
      // initialize the LED pin as an output:
      // initialize the pushbutton pin as an input:
      pinMode(BUTTON_PIN, INPUT_PULLUP);

      // первое сообщение
      lcd.print("Hello world!"); // текст на экране
      // устанавливаем курсор в колонку 0, строку 1. То есть на
      // самом деле это вторая строка, т.к. нумерация начинается с нуля
      lcd.setCursor(0, 1);
      // печатаем вторую строку
      lcd.print("foo bar baz");
    }

    void loop()
    {
      // счетчик нажатий, до 5 раз, потом снова по кругу, каждый раз значение нажатия записывается в переменную
      if (buttonWasUp && !digitalRead(BUTTON_PIN))
      {
        delay(10);
        if (!digitalRead(BUTTON_PIN))
          clicks = (clicks + 1) % 5;
      }

      buttonState = digitalRead(BUTTON_PIN); // Состояние кнопки

      lcd.clear(); // очистим экран

      if(buttonState == HIGH) // Если кнопка нажата, то выводим текст, в зависимости от кол-ва нажатий кнопки
      {
        if (clicks == 1)
        {
          lcd.setCursor(0, 8);
          lcd.print("TEXT"); // текст на экране №1
        }

        if (clicks == 2)
        {
          lcd.setCursor(0, 4); // текст на экране №2
          lcd.print("TEXT2");
        }

        if (clicks == 3)
        {
          lcd.setCursor(1, 4);
          lcd.print("TEXT3");
        }

        if (clicks == 4)
        {
          lcd.setCursor(0, 10);
          lcd.print("TEXT4");
        }

        if (clicks == 5)
        {
          lcd.setCursor(1, 10);
          lcd.print("TEXT5");
        }
      }
    }
    Попробуйте этот скетч.
     
    Последнее редактирование: 2 дек 2014
  8. vovchik001

    vovchik001 Нерд

    давайте я опишу идею, чтобы было понятно что и зачем. У меня есть ребенок, 7 лет, с тягой к электронике. хочу придумать для него квест с поиском предметов и выполнением заданий, чтобы не отстать от него в знании техники, хочу на ардуинке сделать устройство которое будет по нажатию на кнопку выдавать подсказку или задание, это только на этом этапе собственного обучения) позже планирую докупить rfid модуль и чтобы по окончанию каждого задания ребенок находил "секретную карту" прикладывал ее к устройству и получал следующее. Вы уж простите, что пристаю совсем без опыта к Вам, не знаю куда еще обратиться.
     
  9. Salk

    Salk Гик

    Все нормально, сам относительно не давно начал изучать Arduino. Поэтому работа с Вами это и мне опыт. Так же начинал, с форума. Попробуйте скетч выше, как он себя ведет? У меня нет кнопки, не могу проверить у себя. Тут главное понять идею, дальше уже можно менять скетч, под любые свои нужды. Я закомментировал ключевые действия в скетче, чтобы было проще понять. Обращайтесь, по любому поводу.
     
  10. vovchik001

    vovchik001 Нерд

    попробовал - компилятор ругается на слово button
    если его удалить - компилируется и ведет себя так как будто кнопка все время нажимается очень быстро пишет сообщение, чистит экран и снова пишет, снова чистит....
     
  11. Salk

    Salk Гик

    Скопируйте ещё раз весь код, я редактировал код, в следующий раз не буду, чтобы не возникало путаницы
     
  12. vovchik001

    vovchik001 Нерд

  13. Salk

    Salk Гик

    Резистор с другой стороны подсоединить, т.е. там где красный провод идет к Arduino на 3 пин.
     
  14. vovchik001

    vovchik001 Нерд

    опять бегают все сообщения по кругу не реагируя на кнопку.
     
  15. vovchik001

    vovchik001 Нерд

  16. Salk

    Salk Гик

    Да, так.
     
  17. vovchik001

    vovchik001 Нерд

    ведет себя так же.
     
  18. Salk

    Salk Гик

    Код (Text):
    // Подключаем стандартную библиотеку LiquidCrystal
    #include <LiquidCrystal.h>

    // RS, E, DB4, DB5, DB6, DB7
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);

    #define BUTTON_PIN  10 // пин Arduino подключенный к кнопке

    int clicks; // текущее кол-во нажатий
    boolean buttonWasUp = true;

    void setup()
    {
      lcd.begin(16, 2);
      // initialize the LED pin as an output:
      // initialize the pushbutton pin as an input:
      pinMode(BUTTON_PIN, INPUT_PULLUP);

      // первое сообщение
      lcd.print("Hello world!"); // текст на экране
      // устанавливаем курсор в колонку 0, строку 1. То есть на
      // самом деле это вторая строка, т.к. нумерация начинается с нуля
      lcd.setCursor(0, 1);
      // печатаем вторую строку
      lcd.print("foo bar baz");
      delay(300); // задержка перед циклом, чтобы начальное сообщение успело отобразиться на экране
    }

    void loop()
    {
      // счетчик нажатий, до 5 раз, потом снова по кругу, каждый раз значение нажатия записывается в переменную
      if (buttonWasUp && !digitalRead(BUTTON_PIN))
      {
        delay(10);
        if (!digitalRead(BUTTON_PIN))
          clicks = (clicks + 1) % 5;
      }

      lcd.clear(); // очистим экран
      if (clicks == 1)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT"); // текст на экране №1
      }

      if (clicks == 2)
      {
        lcd.setCursor(0, 1); // текст на экране №2
        lcd.print("TEXT2");
      }

      if (clicks == 3)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT3");
      }

      if (clicks == 4)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT4");
      }

      if (clicks == 5)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT5");
      }
    delay(100);
    }
     
    Щас то хоть меняет? :)
     
    Последнее редактирование: 2 дек 2014
  19. vovchik001

    vovchik001 Нерд

    заработало))) спасибо большое. пойду с детем уроки делать. позже буду крутить дальше. еще раз спасибо большое за помощь! не обессудьте если еще раз потревожу.
     
  20. Salk

    Salk Гик

    Если Вы хотите чтобы при удержании кнопки, что-то менялось на экране, и не быстро, то функцию delay() можно увеличить, до 200 и т.д. это задержка. Не стесняйтесь, обращайтесь, надеюсь что помог :)
     
    Последнее редактирование: 2 дек 2014