Меню на LCD Keypad Shield

Тема в разделе "Глядите, что я сделал", создана пользователем Wot?, 13 сен 2013.

  1. Wot?

    Wot? Нуб

    Пытаюсь сделать меню, вот пример:
    Код (C):
    #include <Wire.h>//для часов
    #include <DS1307new.h>//для часов
    #include <LiquidCrystal.h> // библиотека экрана
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

    int lcd_key  = 0;
    int adc_key_in  = 0;
    #define btnRIGHT  0
    #define btnUP    1
    #define btnDOWN   2
    #define btnLEFT   3
    #define btnSELECT 4
    #define btnNONE   5



    bool key_menu=false;

    void setup(){
      lcd.begin(16, 2); // запускаем библиотеку
    }


    void loop(){
      if (key_menu==false)
      {
        printTimeToLCD(); // выводим время на экран
       
        lcd_key=read_LCD_buttons();
        if (lcd_key==btnSELECT)
        {
          key_menu=true;
        }
      }
      else
      {
        lcd.print("NaNaNaNaNa");
      }
     }
     
     
    int read_LCD_buttons()
    {
     adc_key_in = analogRead(0);
     if (adc_key_in > 1000) return btnNONE;
     if (adc_key_in < 50)   return btnRIGHT;  
     if (adc_key_in < 250)  return btnUP;
     if (adc_key_in < 450)  return btnDOWN;
     if (adc_key_in < 650)  return btnLEFT;
     if (adc_key_in < 850)  return btnSELECT;  
     return btnNONE;
    }

    void printTimeToLCD(){
        RTC.getTime();
        byte static prevSecond=0;
         
        if(RTC.second!=prevSecond){
          lcd.setCursor(4,0);
           
          if (RTC.hour<10) lcd.print("0");
          lcd.print(RTC.hour);
         
          lcd.print(":");
         
          if (RTC.minute<10) lcd.print("0");
          lcd.print(RTC.minute);
         
          lcd.print(":");
         
          if (RTC.second<10) lcd.print("0");
          lcd.print(RTC.second);
         
        prevSecond=RTC.second;
      }
    }
     
    При нажатии на кнопку "Select" заходит в меню (пока для примера выводится надпись).
    Вопросы:
    1) Почему выводит вместо "NaNaNaNaNa" 10 первых ячеек, весь дисплей заполняется этими буквами?
    2) Почему спустя 1-2 минуты (обычно даже меньше) выкидывает из меню обратно на время? (вроде переменная key_menu не должна позволить сделать это, она ведь жестко устанавливается в значение true при нажатии)
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    1) Потому что после того, как вы делаете `print` курсор сдвигается вправо на количество напечатанных символов и следующий `print` начинает печатать с того места, где всё закончилось прошлый раз. Используйте `lcd.setCursor(0, 0)` для возврата курсора в начало.

    2) Похоже на перезагрузку платы и начала скетча заново. Светодиод L в этот момент помаргивает?
     
  3. NIch

    NIch Нерд

    Обрати внимание на контрольную лампочку, ее моргание "без причин" в процессе работы, скажет тебе о перезагрузке устройства.