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

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

  1. vovchik001

    vovchik001 Нерд

    А можно добавить в схему пару светодиодов чтобыгорели пару секунд по нажатию на кнопку?
     
  2. Salk

    Salk Гик

    Можно :) Пару? Они будут выполнять одно действие или разное, что хотите получить в итоге? А если, в эти 2 секунды Вы ещё раз нажмете на кнопку, что должно произойти? Светодиод продолжит гореть снова 2 секунды (по новой) или он должен будет потухнуть сразу? Опишите более детальнее логику работы :) И будем составлять скетч.
     
  3. vovchik001

    vovchik001 Нерд

    Чтобы при нажатии в течении 10 секунд по очереди мигали 2 диода это будет время на прочтение сообщения. Но сообщение должно оставаться на экране. И еще нужно чтобы при включении выводилось первое приветственно сообщение. Что то вроде *приветствую вас агент*
     
  4. Salk

    Salk Гик

    Ухх :) Попытался составить скетч, с нетерпением жду, пока Вы его опробуете. Хотя я не уверен, в его абсолютной правильности.. Не забывайте про размерность экрана, не все символы могут поместиться на нем. Я написал надпись "Привет, Агент" на русском языке. Она появится в самом начале на пол секунды (500 мс), после исчезнет и начнется выполнение цикла (loop), т.е. работа с кнопками, если хотите увеличить время отображения начальной надписи на экране, то просто увеличьте значение delay() в setup. Пока будет отображаться эта надпись (в setup) действия в цикле будут не доступны.
    Ох, надеюсь не перемудрил со скетчем.. :)
    Код (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; // текущее кол-во нажатий
    int LED_BUTT = 5; // первый светодиод
    int LED_BUTT1 = 6; // второй светодиод

    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);
      pinMode(LED_BUTT, OUTPUT);
      pinMode(LED_BUTT1, OUTPUT);
      digitalWrite(LED_BUTT, LOW); // изначально светодиоды не горят
      digitalWrite(LED_BUTT1, LOW);

      // начальное сообщение
      lcd.print("\xa8p\xb8\xb3""e\xbf, A\xb4""e\xbd\xbf !!!"); // текст на экране - "Привет, Агент"
      delay(500); // Время на прочтение начального сообщения
    }

    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, 8);
        lcd.print("TEXT"); // текст на экране №1
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
          {
            digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
            digitalWrite(LED_BUTT1, LOW);
          }
          delay(1000); // через секунду меняем их состояние
          {
            digitalWrite(LED_BUTT, LOW);
            digitalWrite(LED_BUTT1, HIGH);
          }
        }
      }

      if (clicks == 2)
      {
        lcd.setCursor(0, 4); // текст на экране №2
        lcd.print("TEXT2");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
          {
            digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
            digitalWrite(LED_BUTT1, LOW);
          }
          delay(1000); // через секунду меняем их состояние
          {
            digitalWrite(LED_BUTT, LOW);
            digitalWrite(LED_BUTT1, HIGH);
          }
        }
      }

      if (clicks == 3)
      {
        lcd.setCursor(1, 4);
        lcd.print("TEXT3");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
          {
            digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
            digitalWrite(LED_BUTT1, LOW);
          }
          delay(1000); // через секунду меняем их состояние
          {
            digitalWrite(LED_BUTT, LOW);
            digitalWrite(LED_BUTT1, HIGH);
          }
        }
      }

      if (clicks == 4)
      {
        lcd.setCursor(0, 10);
        lcd.print("TEXT4");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
          {
            digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
            digitalWrite(LED_BUTT1, LOW);
          }
          delay(1000); // через секунду меняем их состояние
          {
            digitalWrite(LED_BUTT, LOW);
            digitalWrite(LED_BUTT1, HIGH);
          }
        }
      }

      if (clicks == 5)
      {
        lcd.setCursor(1, 10);
        lcd.print("TEXT5");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
          {
            digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
            digitalWrite(LED_BUTT1, LOW);
          }
          delay(1000); // через секунду меняем их состояние
          {
            digitalWrite(LED_BUTT, LOW);
            digitalWrite(LED_BUTT1, HIGH);
          }
        }
      }
    }
    Светодиоды подключены к 5 и 6 пинам Arduino (Вы также их можете изменить), их лучше всего подключить через резистор на 220-1 кОм. (+) Анодом через резистор к пину Arduino, а (-) катод к gnd.
     
    Последнее редактирование: 2 дек 2014
  5. vovchik001

    vovchik001 Нерд

    сейчас буду пробовать.
     
  6. Salk

    Salk Гик

    Обновите только страницу. Я на ходу редактирую :)
     
  7. vovchik001

    vovchik001 Нерд

    выдает такое
    core.a(main.cpp.o): In function `main':
    /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/main.cpp:43: undefined reference to `loop'
     
  8. Salk

    Salk Гик

    Скопируйте ещё раз все, со всеми скобками. Это важно
     
  9. vovchik001

    vovchik001 Нерд

    теперь пишет привет агент на пару секунду, потом пустой экран и по нажатию на кнопку загорается один диод второй начинает слегка моргать и после этого на нажатия не реагирует. и только если удерживать кнопку 10 секунд примерно меняется сообщение.
     
  10. 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; // текущее кол-во нажатий
    int LED_BUTT = 5; // первый светодиод
    int LED_BUTT1 = 6; // второй светодиод

    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);
      pinMode(LED_BUTT, OUTPUT);
      pinMode(LED_BUTT1, OUTPUT);
      digitalWrite(LED_BUTT, LOW); // изначально светодиоды не горят
      digitalWrite(LED_BUTT1, LOW);

      // начальное сообщение
      lcd.print("\xa8p\xb8\xb3""e\xbf, A\xb4""e\xbd\xbf !!!"); // текст на экране - "Привет, Агент"
      delay(500); // Время на прочтение начального сообщения
    }

    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
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
          {
            digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
            digitalWrite(LED_BUTT1, LOW);

            delay(1000);

            digitalWrite(LED_BUTT, LOW);
            digitalWrite(LED_BUTT1, HIGH);
          }
        }
      }

      if (clicks == 2)
      {
        lcd.setCursor(0, 1); // текст на экране №2
        lcd.print("TEXT2");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
          {
            digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
            digitalWrite(LED_BUTT1, LOW);

            delay(1000); // через секунду меняем их состояние

            digitalWrite(LED_BUTT, LOW);
            digitalWrite(LED_BUTT1, HIGH);
          }
        }
      }

      if (clicks == 3)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT3");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
          {
            digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
            digitalWrite(LED_BUTT1, LOW);

            delay(1000); // через секунду меняем их состояние

            digitalWrite(LED_BUTT, LOW);
            digitalWrite(LED_BUTT1, HIGH);
          }
        }
      }

      if (clicks == 4)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT4");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
          {
            digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
            digitalWrite(LED_BUTT1, LOW);

            delay(1000); // через секунду меняем их состояние

            digitalWrite(LED_BUTT, LOW);
            digitalWrite(LED_BUTT1, HIGH);
          }
        }
      }

      if (clicks == 5)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT5");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
          {
            digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
            digitalWrite(LED_BUTT1, LOW);

            delay(1000); // через секунду меняем их состояние

            digitalWrite(LED_BUTT, LOW);
            digitalWrite(LED_BUTT1, HIGH);
          }
        }
      }
      delay(1000);
    }
    Что-то изменилось?
     
  11. vovchik001

    vovchik001 Нерд

    постоянно горит один из диодов текст меняется только если держать кнопку 10 секунд. диоды ведут себя странно в целом, горит наприме зеленый, раз в несколько секунд гаснет и включается на секунду красный. а пока горит зеленый красный продолжает помаргивать.
     
  12. rav_75

    rav_75 Гик

    Код (Text):
    for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
    зачем if?
    Код (Text):
    for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          if (i < 10) // если меньше 10
          {
            digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
            digitalWrite(LED_BUTT1, LOW);

            delay(1000); // через секунду меняем их состояние

            digitalWrite(LED_BUTT, LOW);
            digitalWrite(LED_BUTT1, HIGH);
          }
        }
    LED_BUTT будет HIGH, через секунду LOW и моментально опять HIGH, аналогично LED_BUTT2

    Кнопка будет считываться только при удержании, потому что ее нажатие никто не ждет, программа бежит по кругу. В момент считывания не нажата - поехали дальше

    if (clicks == 1) я бы поменял на switch - case, хотя тут кому как удобно.
     
  13. vovchik001

    vovchik001 Нерд

    смена текста по нажатой кнопке на прямую привязана к зажиганию второго диода. если в момент моргания диода нажата кнопка то происходит смена текста.
     
  14. rav_75

    rav_75 Гик

    не совсем. Вернее в момент десятого моргания )
     
  15. vovchik001

    vovchik001 Нерд

    господа, с кодом поможете? я пытаюсь понять, но не получается, мало опыта(
     
  16. Salk

    Salk Гик

    Учимся потихоньку, для меня это тоже разминка мозгов :)
    Сейчас что-нибудь да сварганим.
    А что лучше, while ?
    Да, конечно, поможем :)
     
  17. vovchik001

    vovchik001 Нерд

    и если возможно, подскажите что поправить чтобы первое сообщение подержать секунд 5-6...
     
  18. Salk

    Salk Гик

    Это время в мс, 1 сек = 1000 мс; 5 сек. = 5000 мс
     
  19. Salk

    Salk Гик

    Там реализован счетчик, кол-во нажатий хранятся в переменной clicks. Когда в ней значение от 0-5, выполняется вывод на экран. Сюда же я хочу приделать мигания светодиодов, не более 10 секунд.
     
  20. 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; // текущее кол-во нажатий
    int LED_BUTT = 5; // первый светодиод
    int LED_BUTT1 = 6; // второй светодиод

    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);
      pinMode(LED_BUTT, OUTPUT);
      pinMode(LED_BUTT1, OUTPUT);
      digitalWrite(LED_BUTT, LOW); // изначально светодиоды не горят
      digitalWrite(LED_BUTT1, LOW);

      // начальное сообщение
      lcd.print("\xa8p\xb8\xb3""e\xbf, A\xb4""e\xbd\xbf !!!"); // текст на экране - "Привет, Агент"
      delay(500); // Время на прочтение начального сообщения
    }

    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
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
          digitalWrite(LED_BUTT1, LOW);

          delay(1000);

          digitalWrite(LED_BUTT, LOW);
          digitalWrite(LED_BUTT1, HIGH);

          delay(1000);
        }
      }

      if (clicks == 2)
      {
        lcd.setCursor(0, 1); // текст на экране №2
        lcd.print("TEXT2");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
          digitalWrite(LED_BUTT1, LOW);

          delay(1000); // через секунду меняем их состояние

          digitalWrite(LED_BUTT, LOW);
          digitalWrite(LED_BUTT1, HIGH);

          delay(1000);
        }
      }

      if (clicks == 3)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT3");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
          digitalWrite(LED_BUTT1, LOW);

          delay(1000); // через секунду меняем их состояние

          digitalWrite(LED_BUTT, LOW);
          digitalWrite(LED_BUTT1, HIGH);

          delay(1000);
        }
      }

      if (clicks == 4)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT4");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
          digitalWrite(LED_BUTT1, LOW);

          delay(1000); // через секунду меняем их состояние

          digitalWrite(LED_BUTT, LOW);
          digitalWrite(LED_BUTT1, HIGH);
          delay(1000);
        }
      }

      if (clicks == 5)
      {
        lcd.setCursor(0, 1);
        lcd.print("TEXT5");
        for(int i = 0; i < 10; i++) // в течении 10 секунд будут мигать светодиоды
        {
          digitalWrite(LED_BUTT, HIGH); // то, меняем состояние светодиодов
          digitalWrite(LED_BUTT1, LOW);

          delay(1000); // через секунду меняем их состояние

          digitalWrite(LED_BUTT, LOW);
          digitalWrite(LED_BUTT1, HIGH);

          delay(1000);
        }
      }
    delay(200);
    }