Ввод числа с матричной клавиатуры.
- Войдите на сайт для отправки комментариев
Пт, 15/05/2015 - 09:39
Здравствуйте! Помогите, пожалуйста , с вводом чисел с матричной клавиатуры(http://dvrobot.ru/238/454.html).
Проблема такая: мне надо чтобы после нажатии клавиши A(11) я смог ввести нужное число (например 3560)
и чтобы оно созранилось в переменой(int) для последующей обработки( в моём случае мне надо ввести значение в милилитрах и когда вода проходила через датчик(http://dvrobot.ru/240/121.html) сначение уменьшалось.
Вот небольшой код который я нашёл и немного переделал. Всё сделал немножко убого.
int rows[]={9,8,7,6}; //указываем пины строк int cols[]={5,4,3,2}; //и столбцов //массив с соответствиями кодов нажатых кнопок int simbols[][2]={ {0,1}, //Клавиша 1 {1,2}, //Клавиша 2 {2,3}, //Клавиша 3 {3,11}, //Клавиша A {4,4}, //Клавиша 4 {5,5}, //Клавиша 5 {6,6}, //Клавиша 6 {7,12}, //Клавиша B {8,7}, //Клавиша 7 {9,8}, //Клавиша 8 {10,9}, //Клавиша 9 {11,13}, //Клавиша C {12,16}, //Клавиша * {13,0}, //Клавиша 0 {14,15}, //Клавиша # {15,14} //Клавиша D }; int FindKey(unsigned int keyCode){ for(int i=0;i<16;i++){ if(simbols[i][0]==keyCode){ return simbols[i][1]; } } return '-'; //если код на найден возвращаем ‘-‘ } void setup() { Serial.begin(9600); Serial.println("Starting..."); //определяем пины для строк и столбцов pinMode(2, INPUT); pinMode(3, INPUT); pinMode(4, INPUT); pinMode(5, INPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); } void loop() { for(int i=0;i<4;i++){ //цикл для перехода по всем строкам digitalWrite(rows[i], HIGH); //подаем на текущую строку высокий уровень for(int j=0;j<4;j++){ //цикл для переходов по всем столбцам if(digitalRead(cols[j])==HIGH){ //если уровень высокий, то кнопка нажата delay(250); //Serial.print(FindKey(4*i+j)); //выводим в терминал код нажатой кнопки int key = FindKey(4*i+j); if (key) { Serial.println(key); } } } digitalWrite(rows[i], LOW); //выключаем высокий уровень для пройденной строки } }
Есть 2 варианта: делается поиск до первого обнаружения нажатия и обнаружение всех нажатий (а вдруг вы все 16 кнопок нажмете разом). Алгоритмы будут отличаться. У вас в коде очень сложно все сделано, к тому же с ошибками которые компилятор не видит.
Как это можно сделать? Код то можно сказать не мой, а сам додуматься как это сделать не могу.
Код индусский, да еще и не ваш... ну получите вы число, а что дальше?
после окончания ввода числа необходимо нажать #.
Моя идея такая: программма для разлива хотелось бы чтобы работала так чтобы при нажатии A вводился объём милилитрах , кнопкой B вводилось количество разливов , кнопкой C вводилось промижуток между разливом и на дисплее отображалось объём и количество разливов. Что-то мне подсказывает что это не так просто.
Вопрос был риторический, а не что бы узнать ваши хотелки, потому как, если вы не можете разобраться с кодом выше, то и дальше ничего не сделаете, даже если получите свое число.
Спасибо! Буду разбираться.
Спасибо вам большое за это!. Всё понятно что написано,хоть и сам данный алгоритм долго бы делал. Вот только проблемма с вводом ЧИСЛА так и не исправилось, ЦИФРЫ вводятся от 0 до 9 а число(например 50) непойму как сделать. Если только как нибудь перевести цифры в стринговый тип для получения числа, а потом с помощью функции toInt() (http://www.arduino.cc/en/Reference/StringToInt) перевести в переменую. Возможно это бред какой-то.
Читайте внимательно:
после окончания ввода числа необходимо нажать #.
Я так и делаю. Нажимаю A ввожу 50 и милилитры у меня выстовляет 0 , ввожу 53 и милилитры показывает 3. Тоесть последнюю введёную цифру а не всё число.
Ошибка в 59 строке
Точно опечатка =+ поменять на +=.
Спасибо! Уже поменял + задержку побольше сделал до 200 мс чтоб-бы быстро не вводилось.
Здравствуйте [maksim] , можно ли сделать так: есть переменая L (например перемен 1000) и вторая переменая K (например 3).
когда L равна 0, K уменьшается на 1(то есть остаётся 2) после этого L сново становится сново 1000 и продолжается это до того пока K не будит 0
Конечно можно. Вот тут все есть для решения этой задачи. А начать можно с этого.
Спасибо
Сам разобрался как это сделать.
И ещё про конечные автоматы почитай и диаграмы состояний.
напоимер тут
http://is.ifmo.ru/download/switch.pdf
http://is.ifmo.ru/
Здравствуйте.Подскажите,почему в протеусе не работает?
извените-подтяжек на входах не поставил
Максим, здравствуйте. Нужна помощь профессионального программиста. Если интересно позвоните +7-985-766-26-50 Виктор.
Добрый вечер, заказал для проекта клавиатуру 1 строка 6 столбцов. На прошлой неделе пришла, вна фото(в нее также встроен светодиод, но его не пользовал).
На просторах интернета нашел код без библиотек, для моей клавитуры как раз. Смысл такой: по нажатию клавиши в монитор порта выводится символ этой клавиши. Переписал через регистровое представление пинов ардуино ( у меня uno), лично мне так читабельнее. Все работает, но мешает развитию delay.
"Можно кстати опрашивать клавиатуру через прерывание по таймеру" - Я так и решил действовать. На сайте http://www.instructables.com/id/Arduino-Timer-Interrupts/ вполне понятно объяснено о работе таймеров, конкетно о прерывание по таймеру. Вот код взятый оттуда blink на таймере 1 каждую секунду
Применительно к клаве от сериал соединения отказался сразу поскольку уже где то сталкивался, что в прерывании могут потеряться байты по UART. На основе предыдущего написал код, который задейтвует 5 клавиш клавиатуры, шестую заменил светодиод. Смысл в вызове функции обработчика прерываний каждые 50 мс для устранения дребезга, но код не фурычит. Алгоритм кода - по нажатию любой клавиши должен загореться диод. Подскажите в чем ошибся?
Конкретно светодиод не реагирует на нажатия, видимо не отрабатывается обрабтка клавиш. Буду очень благодарен если подскажите где копать
Добрый день.
Как обычно просьба сильно не пинать начинающего.
Стоит задача во время выполнения основного цикла работы программы в водить новые данные для работы программы с клавиатуры при этом отображая значения вводимых данных на LCD экране. Программа будет состоять из нескольких параллельных блоков которые будут исполнятся в зависимости от введенных данных. Планировал осуществлять ввод данных по функции внешнего прерывания attachInterrupt но не получается так как из нутри прерывания не получается вывести информацию на дисплей. В общем я думаю что задача достаточно стандартная. Если у кого есть мысли по этому поводу прошу поделится. Постоянно опрашивать клавиатуру в loop сильно не желательно так как изменения значений переменных будут происходить достаточно редко. буду признателен за реальные советы.
Добрый день.
Как обычно просьба сильно не пинать начинающего.
Стоит задача во время выполнения основного цикла работы программы в водить новые данные для работы программы с клавиатуры при этом отображая значения вводимых данных на LCD экране. Программа будет состоять из нескольких параллельных блоков которые будут исполнятся в зависимости от введенных данных. Планировал осуществлять ввод данных по функции внешнего прерывания attachInterrupt но не получается так как из нутри прерывания не получается вывести информацию на дисплей. В общем я думаю что задача достаточно стандартная. Если у кого есть мысли по этому поводу прошу поделится. Постоянно опрашивать клавиатуру в loop сильно не желательно так как изменения значений переменных будут происходить достаточно редко. буду признателен за реальные советы.
в прерывании выставить флаг обработки клавиатуры, далее в лупе вызвать эту программу, в программе - если флаг выставлен - обрабатываем, что вам надо, если нет ничего не делаем, я бы делал так
Спасибо за ответ. Можно конечно попробывать и с флагом. Но есть один момент так как основное время программа будет крутится в функциях то прейдется с какойто переодичностью допустим 1 раз в 30 сек. опрашивать состояние флага а это не совсем хорошо. Если есть возможность опрашивать флаг только после прохождения прерывания то буду благодарен если подскажете как это сделать.
Хотя если в каждой функции опрашивать флаг то оно может и ничего получится.