Подскажите, что нужно добавить в этот кусок кода чтобы каждый последующий символ введенный с клавиатуры отображался рядом с предыдущим? Подключен дисплей МЭЛТ и матричная клавиатура 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 - #");
Теперь при вводе символа курсор двигается на одно деление но при этом введенный символ на экране не сохраняется как этого избежать подскажите? нужно видеть что уже введено.
Возможно, символ дальше по коду затирается (например, на его место пишется пробел), или вообще экран очищается вызовом lcd.clear();
Вот полный код, я его нашел по описанию кодового замка в интернете переставил пины для использования меги вместо уно, добавил пару реле и пытаюсь прикрутить экран, но это оказалось слишком сложно и без помощи не могу обойтись. Код (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------------ }; } }
И сразу перед запросом и выводом очередного символа пароля 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) начиная с нулевой позиции в строке экрана.
По Вашей рекомендации убрал очистку экрана но тогда пароль пишется поверх строки "#- сброс" и все равно получилось следующее - нажимаю кнопку на клавиатуре замка на экране пустой блок, нажимаю вторую, курсор перемещается на второй блок а не месте первого появляется ранее введенный символ. Подскажите как дальше делать?
после lcd.print(summ); добавить lcd.setCursor(shet, 1); lcd.print(key); Но лучше перелопатить и структурировать программу, она очень странная. Глюков поймать можно еще много
Получилось, очень благодарен. Как ее можно перелопатить? Эта программа вообще не выводила данные на экран а переделана из той, что посылала результат через 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--------------------- } }