Прошу помощи с экраном 16х2

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

  1. vovchik001

    vovchik001 Нерд

    Подскажите, что нужно добавить в этот кусок кода чтобы каждый последующий символ введенный с клавиатуры отображался рядом с предыдущим? Подключен дисплей МЭЛТ и матричная клавиатура 4х4 сейчас происходит так, что каждый новый символ пишется на первой позиции второй строки, а надо чтобы символы шли друг за другом как при наборе номера на телефоне. Заранее благодарен. Я к сожалению в этом профан совсем. вот код:
    void loop(){
    char key = keypad.getKey();

    if (key){
    lcd.setCursor(0, 0);
    lcd.print("Enter password:");
    lcd. blink();
    lcd.setCursor(0, 1);
    lcd.print(key);
    //---------start tone------------
    digitalWrite(43, HIGH);
    tone(44, 1440, 200);
    delay(200);
    noTone(44);
    digitalWrite(43, LOW);
    //-------stop tone------------
    shet=shet+1;
    if (shet==7){
    summ="";
    keystr="";
    shet=0;
    lcd.clear();
    lcd.print("Enter password:");
    lcd.setCursor(0, 1);
    lcd.print("To long");
    delay(1000);
    lcd.setCursor(0, 1);
    // печатаем вторую строку
    lcd.print("Press - #");
     
  2. X-Dron

    X-Dron Гик

    lcd.setCursor(0, 1); на
    lcd.setCursor(shet, 1);
     
  3. vovchik001

    vovchik001 Нерд

    Теперь при вводе символа курсор двигается на одно деление но при этом введенный символ на экране не сохраняется как этого избежать подскажите? нужно видеть что уже введено.
     
  4. geher

    geher Гуру

    Возможно, символ дальше по коду затирается (например, на его место пишется пробел), или вообще экран очищается вызовом lcd.clear();
     
  5. vovchik001

    vovchik001 Нерд

    Вот полный код, я его нашел по описанию кодового замка в интернете переставил пины для использования меги вместо уно, добавил пару реле и пытаюсь прикрутить экран, но это оказалось слишком сложно и без помощи не могу обойтись.
    Код (Text):
    /* @file HelloKeypad.pde
    || @version 1.0
    || @author Alexander Brevig
    || @contact alexanderbrevig@gmail.com
    ||
    || @description
    || | Demonstrates the simplest use of the matrix Keypad library.
    || #
    */
    #include <LiquidCrystal.h>

    // Инициализируем объект-экран, передаём использованные
    // для подключения контакты на Arduino в порядке:
    // RS, E, DB4, DB5, DB6, DB7
    LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
    #include <Keypad.h>

    const byte ROWS = 4; //four rows
    const byte COLS = 4; //three columns
    char keys[ROWS][COLS] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };
    byte rowPins[ROWS] = {53,52,51,50}; //connect to the row pinouts of the keypad
    byte colPins[COLS] = {49,48,47,46}; //connect to the column pinouts of the keypad

    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
    String summ;
    String keystr;
    int shet=0;
    void setup()
    {
        // устанавливаем размер (количество столбцов и строк) экрана
        lcd.begin(16, 2);
        // печатаем первую строку
        lcd.print("B\xb3""e\xe3\xb8\xbf""e \xbe""apo\xbb\xc4:");
        // устанавливаем курсор в колонку 0, строку 1. То есть на
        // самом деле это вторая строка, т.к. нумерация начинается с нуля
        lcd.setCursor(0, 1);
        // печатаем вторую строку
        lcd.print("# - c\xb2poc");
      Serial.begin(9600);
      pinMode(43, OUTPUT);
        pinMode(42, OUTPUT);
        pinMode(41, OUTPUT);
        pinMode(39, OUTPUT);
        pinMode(40, OUTPUT);
      //---------start tone------------
      digitalWrite(39, HIGH);
    digitalWrite(40, HIGH);
    digitalWrite(43, HIGH);
    digitalWrite(42, HIGH);
    digitalWrite(41, HIGH);
    tone(44, 800, 200);
      delay(200);
      noTone(44);
      tone(44, 300, 200);
      delay(200);
      noTone(44);
        tone(44, 800, 200);
      delay(200);
      noTone(44);
          tone(44, 300, 200);
      delay(200);
      noTone(44);
          tone(44, 800, 200);
      delay(200);
      noTone(44);
        tone(44, 300, 200);
      delay(200);
      noTone(44);
        tone(44, 800, 200);
      delay(200);
      noTone(44);
          tone(44, 300, 200);
      delay(200);
      noTone(44);
          tone(44, 800, 200);
      delay(200);
      noTone(44);
        tone(44, 300, 200);
      delay(200);
      noTone(44);
        tone(44, 800, 200);
      delay(200);
      noTone(44);
          tone(44, 300, 200);
      delay(200);
      noTone(44);
          tone(44, 800, 200);
      delay(200);
      noTone(44);
      digitalWrite(43, LOW);
      digitalWrite(42, LOW);
      digitalWrite(41, LOW);
    //-------stop tone------------
    }
    void loop(){
    char key = keypad.getKey();

    if (key){
    lcd.clear();
      lcd.setCursor(0, 0);
    lcd.print("B\xb3""e\xe3\xb8\xbf""e \xbe""apo\xbb\xc4:");
      lcd.setCursor(shet, 1);
      lcd.print(key);
      lcd.blink();
    //---------start tone------------
    digitalWrite(43, HIGH);
      tone(44, 1440, 200);
      delay(200);
      noTone(44);
      digitalWrite(43, LOW);
    //-------stop tone------------
    shet=shet+1;
    if (shet==7){
    summ="";
    keystr="";
    shet=0;
    lcd.clear();
    lcd.print("B\xb3""e\xe3\xb8\xbf""e \xbe""apo\xbb\xc4:");
    lcd.setCursor(0, 1);
    lcd.print("O\xc1\xb8\xb2\xba""a!");
    delay(1000);
        lcd.setCursor(0, 1);
        // печатаем вторую строку
        lcd.print("Ha\xb6\xbc\xb8\xbf""e - #");
    //---------start tone------------
      digitalWrite(42, HIGH);
      tone(44, 600, 200);
      delay(200);
      noTone(44);
      digitalWrite(42, LOW);
    //-------stop tone------------
    };
    summ=summ+key;
    Serial.println(summ);
    keystr=String(key);

    if (keystr=="#"){
      summ="";
    keystr="";
    shet=0;
    lcd.setCursor(0, 1);
    lcd.print("");
    //---------start tone------------
      digitalWrite(42, HIGH);
      tone(44, 600, 200);
      delay(200);
      noTone(44);
      digitalWrite(42, LOW);
    //-------stop tone------------
    };


    if (summ=="123456"){
    lcd.clear();
    lcd.noBlink();
    lcd.print("\xa8""apo\xbb\xc4 \xbep\xb8\xbd\xc7\xbf!");
    delay(500);
    lcd.clear();
    lcd.noBlink();
    lcd.print("Ba\xbc \xbao\xbd""e\xe5!");

    summ="";
    keystr="";
    shet=0;
    //---------start tone------------
    digitalWrite(41, HIGH);
    tone(44, 800, 200);
      delay(200);
      noTone(44);
      tone(44, 300, 200);
      delay(200);
      noTone(44);
        tone(44, 800, 200);
      delay(200);
      noTone(44);
          tone(44, 300, 200);
      delay(200);
      noTone(44);
          tone(44, 800, 200);
      delay(200);
      noTone(44);
        tone(44, 300, 200);
      delay(200);
      noTone(44);
        tone(44, 800, 200);
      delay(200);
      noTone(44);
          tone(44, 300, 200);
      delay(200);
      noTone(44);
          tone(44, 800, 200);
      delay(200);
      noTone(44);
        tone(44, 300, 200);
      delay(200);
      noTone(44);
        tone(44, 800, 200);
      delay(200);
      noTone(44);
          tone(44, 300, 200);
      delay(200);
      noTone(44);
          tone(44, 800, 200);
      delay(200);
      noTone(44);
      digitalWrite(41, LOW);
      digitalWrite(39, LOW);
      delay (3000);
      digitalWrite(39, HIGH);
      delay (2000);
      digitalWrite(40, LOW);
      delay (3000);
      digitalWrite(40, HIGH);
    //-------stop tone------------

    };
      }
    }
     
    Последнее редактирование: 12 апр 2015
  6. geher

    geher Гуру

    И сразу перед запросом и выводом очередного символа пароля lcd.clear();
    Если не перелопачивать программу, то решить проблему можно выводя не один только что введенный символ, а весь введенный перед тем текст.

    if (key){
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("B\xb3""e\xe3\xb8\xbf""e \xbe""apo\xbb\xc4:");
    lcd.setCursor(0, 1);
    lcd.print(summ);
    lcd.blink();

    т.е. выводить всю введенную строку (если я правильно понял, то оно накапливается в summ) начиная с нулевой позиции в строке экрана.
     
  7. vovchik001

    vovchik001 Нерд

    По Вашей рекомендации убрал очистку экрана но тогда пароль пишется поверх строки "#- сброс"
    и все равно получилось следующее - нажимаю кнопку на клавиатуре замка на экране пустой блок, нажимаю вторую, курсор перемещается на второй блок а не месте первого появляется ранее введенный символ. Подскажите как дальше делать?
     
  8. X-Dron

    X-Dron Гик

    после
    lcd.print(summ);
    добавить
    lcd.setCursor(shet, 1);
    lcd.print(key);

    Но лучше перелопатить и структурировать программу, она очень странная. Глюков поймать можно еще много
     
  9. vovchik001

    vovchik001 Нерд

    Получилось, очень благодарен. Как ее можно перелопатить? Эта программа вообще не выводила данные на экран а переделана из той, что посылала результат через serial port и реле у нее не были предусмотрены. Но лучше у меня не получилось.(((
    вот то что было изначально:
    Код (Text):
    /* @file HelloKeypad.pde
    || @version 1.0
    || @author Alexander Brevig
    || @contact alexanderbrevig@gmail.com
    ||
    || @description
    || | Demonstrates the simplest use of the matrix Keypad library.
    || #
    */
    #include <Keypad.h>

    const byte ROWS = 4; //four rows
    const byte COLS = 4; //three columns
    char keys[ROWS][COLS] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };
    byte rowPins[ROWS] = {9,8,7,6}; //connect to the row pinouts of the keypad
    byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad

    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
    String summ;
    String keystr;
    int shet=0;
    void setup(){
      Serial.begin(9600);
      pinMode(11, OUTPUT);
        pinMode(12, OUTPUT);
        pinMode(13, OUTPUT);
      //---------start tone------------
    digitalWrite(11, HIGH);
    digitalWrite(12, HIGH);
    digitalWrite(13, HIGH);
    tone(10, 800, 200);
      delay(200);
      noTone(10);
      tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
        tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
        tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
      digitalWrite(11, LOW);
      digitalWrite(12, LOW);
      digitalWrite(13, LOW);
    //-------stop tone------------
    }
     
    void loop(){
    char key = keypad.getKey();
    if (key){
    Serial.println(key);
    //---------start tone------------
    digitalWrite(11, HIGH);
      tone(10, 1440, 200);
      delay(200);
      noTone(10);
      digitalWrite(11, LOW);
    //-------stop tone------------
    shet=shet+1;
    if (shet==6){
    summ="";
    keystr="";
    shet=0;
    Serial.println("LONG");
    //---------start tone------------
      digitalWrite(12, HIGH);
      tone(10, 600, 200);
      delay(200);
      noTone(10);
      digitalWrite(12, LOW);
    //-------stop tone------------
    };
    summ=summ+key;
    Serial.println(summ);
    keystr=String(key);

    if (keystr=="#"){
    summ="";
    keystr="";
    shet=0;
    Serial.println("RESET");
    //---------start tone------------
      digitalWrite(12, HIGH);
      tone(10, 600, 200);
      delay(200);
      noTone(10);
      digitalWrite(12, LOW);
    //-------stop tone------------
    };

    if (keystr=="*"){
    summ="";
    keystr="";
    shet=0;
    Serial.println("ENTER");
    //---------start tone------------
    digitalWrite(12, HIGH);
      tone(10, 600, 200);
      delay(200);
      noTone(10);
      digitalWrite(12, LOW);
    //-------stop tone------------
    };

    if (summ=="83B12"){
    Serial.println("PASS OK");
    summ="";
    keystr="";
    shet=0;
    //---------start tone------------
    digitalWrite(13, HIGH);
    tone(10, 800, 200);
      delay(200);
      noTone(10);
      tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
        tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
        tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
      digitalWrite(13, LOW);
    //-------stop tone------------

    };
    //---------------start pass 2 -----------------
    if (summ=="94C3A"){
    Serial.println("PASS OK");
    summ="";
    keystr="";
    shet=0;
    //---------start tone------------
    digitalWrite(13, HIGH);
    tone(10, 800, 200);
      delay(200);
      noTone(10);
      tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
        tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
        tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
      digitalWrite(13, LOW);
    //-------stop tone------------

    };
    //------------------stop pass 2---------------------
    //---------------start pass 3 -----------------
    if (summ=="A5D81"){
    Serial.println("PASS OK");
    summ="";
    keystr="";
    shet=0;
    //---------start tone------------
    digitalWrite(13, HIGH);
    tone(10, 800, 200);
      delay(200);
      noTone(10);
      tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
        tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
        tone(10, 300, 200);
      delay(200);
      noTone(10);
        tone(10, 800, 200);
      delay(200);
      noTone(10);
          tone(10, 300, 200);
      delay(200);
      noTone(10);
          tone(10, 800, 200);
      delay(200);
      noTone(10);
      digitalWrite(13, LOW);
    //-------stop tone------------

    };
    //------------------stop pass 3---------------------

      }
    }