обработка char
- Войдите на сайт для отправки комментариев
Друзья, привет. В программировании близок к нулю. В аппаратной части соображаю нормально. Вопрос такой: есть матричная клава и матрица светодиодов. Нужно зажигать диоды от кнопок. Кнопок 16, контактов 8. Пытался написать своими силами обработку кнопок, не смог. Взял готовое решение с использованием библиотеки. Код срисовал у https://vk.com/don_arturos
#include <Keypad.h> // подключаем нашу библиотеку
const byte ROWS = 4; //число строк у нашей клавиатуры
const byte COLS = 4; //число столбцов у нашей клавиатуры
char hexaKeys[ROWS][COLS] = {
{'1','4','7','*'}, // здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования
{'2','5','8','0'},
{'3','6','9','#'},
{'A','B','C','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //к каким выводам подключаем управление строками
byte colPins[COLS] = {9, 8, 7, 6}; //к каким выводам подключаем управление столбцами
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){
Serial.println(customKey);
}
}
Работает код корректно: выдает в монитор порта символы, в соответствии с нажатием. Я же не знаю как обработать полученный чар. Пишу, например:
if (customKey == '1' ) {
digitalWrite(13, HIGH);
}
else {
digitalWrite(13, LOW);
}
}
По нажатию кнопки диод загорается, но не гаснет при отпускании. То есть работает этот чар не как привычный мне булин. Прошу, подскажите, как совладать с кнопкой. В итоге нужно сделать чтобы диод загорался по нажатию и горел. По следующему нажатию тух. Была бы обычная кнопка, я бы написал, тут же не выходит.
Покажите конечный код программы. Может быть вы не корректно их соединили?
#include <Keypad.h> // подключаем нашу библиотеку const byte ROWS = 4; //число строк у нашей клавиатуры const byte COLS = 4; //число столбцов у нашей клавиатуры char hexaKeys[ROWS][COLS] = { {'1','4','7','*'}, // здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования {'2','5','8','0'}, {'3','6','9','#'}, {'A','B','C','D'} }; byte rowPins[ROWS] = {5, 4, 3, 2}; //к каким выводам подключаем управление строками byte colPins[COLS] = {9, 8, 7, 6}; //к каким выводам подключаем управление столбцами //initialize an instance of class NewKeypad Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); void setup(){ Serial.begin(9600); } void loop(){ char customKey = customKeypad.getKey(); if (customKey){ Serial.println(customKey); } if (customKey == 49) { digitalWrite(13, HIGH);} }Там, где вы зажигаете светодиод, добавьте дополнительное условие - проверяйте, если светодиод не горит, то зажигайте, иначе - гасите его.
Это делается, конечно, и без условия, но для вас пока так будет проще.
DEL
Спасибо!!
#include <Keypad.h> // подключаем нашу библиотеку const byte ROWS = 4; //число строк у нашей клавиатуры const byte COLS = 4; //число столбцов у нашей клавиатуры char hexaKeys[ROWS][COLS] = { {'1','4','7','*'}, // здесь мы располагаем названия наших клавиш, как на клавиатуре,для удобства пользования {'2','5','8','0'}, {'3','6','9','#'}, {'A','B','C','D'} }; byte rowPins[ROWS] = {5, 4, 3, 2}; //к каким выводам подключаем управление строками byte colPins[COLS] = {9, 8, 7, 6}; //к каким выводам подключаем управление столбцами //initialize an instance of class NewKeypad Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); boolean led; void setup(){ Serial.begin(9600); pinMode(13, OUTPUT); } void loop(){ led = digitalRead(13); char customKey = customKeypad.getKey(); if (customKey){ Serial.println(customKey); } if (customKey == 49) { digitalWrite(13, !led);} }DEL
Так и у меня получалось уже. Но мне надо в обяз с одной клавиши зажигать и тушить. Вопрос уже решен, спасибо, ребят.
Переменная
ledлишняя, кроме как вdigitalWriteона нигде больше не используется. И заводить для каждого светодиода матрицы переменную - это расточительно. Пишите сразуdigitalWrite(13, !digitalRead(13));Принял к сведению, спасибо.
Друзья, еще вопрос возник. Новую тему создавать не буду, спрошу здесь. В коде, изложенном в шапке, я опрашиваю состояния кнопок клавиатуры при помощи библиотеки и чужого кода. Мне же очень сильно необходимо пропустить процесс обработки клавиш через себя, понимания ради. Да и для задачи. Ну, не катит мне библиотека, так уж получилось. Теорию, вроде как, понимаю. Вот статья хорошая https://habr.com/ru/post/394585/ изучил, вроде понял что-то. Понимаю, что цикл нужен для динамического опроса кнопки (кнопок). Но как завернуть все это не знаю. Понимаю, что просить написать кусок кода - наглость, но может есть где пример (кода), который облегчит понимание. Спасибо.
PS Содержание библиотеки просмотрел, мне это ничего не дало.
Хочу представить свой потешный код:
void setup() { Serial.begin(9600); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); pinMode(5, INPUT_PULLUP); } void pr1() { digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, LOW); } void pr2() { digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, HIGH); } void pr3() { digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(8, HIGH); digitalWrite(9, HIGH); } void pr4() { digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); } void loop() { pr1(); //pr2(); //pr3(); //pr4(); if (digitalRead(5) != 1 && digitalRead(9) == 0) { Serial.print("button S12 pressed \n"); } }Созданные мною процедуры pr1-pr4 динамически сдвигают потенциал второй ноги кнопки, там самым позволяя динамически опрашивать кнопки (по крайней мере мне бы так хотелось). Я полагал, войд луп будет крутить мои процедуры от первой к четвертой и так до бесконечности, но не работает. Друзья, помогите ньюфагу создать такой цикл, чтобы эта идея (динамическое изменение состояния пина) заработала...
Бред
Та я знаю
Ничего, постепенно дойдёт. После каждой pr делайте опрос 2..5 и результат (4 бита) сохраняйте в переменных. Т.о., на выходе будет 4 переменных. Только пины обзовите осмысленно.
Ничего, постепенно дойдёт. После каждой pr делайте опрос 2..5 и результат (4 бита) сохраняйте в переменных. Т.о., на выходе будет 4 переменных. Только пины обзовите осмысленно.
Спасибо, ваш способ попробую позже (тк не все понял), пока так закрутил:
void setup() { Serial.begin(9600); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); pinMode(5, INPUT_PULLUP); } void loop() { //pr1(); //pr2(); //pr3(); //pr4(); for (int i=6; i<=9; i++) { switchoff(); digitalWrite(i, 0); } if (digitalRead(5) != 1 && digitalRead(9) == 0) { Serial.print("button S12 pressed \n"); } } void switchoff(){ for (int i=6; i<=9; i++) { digitalWrite(i, 1); } }Вроде работает, щас попробую вторую кнопку навесить.
Один столбец работает, перехожу на второй и провал. Гляньте код плиз, кому не сложно:
void setup() { Serial.begin(9600); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); pinMode(5, INPUT_PULLUP); } void loop() { for (int i=6; i<=9; i++) { switchoff(); digitalWrite(i, 0); } if (digitalRead(5) != 1 && digitalRead(9) == 0) { Serial.print("button S16 pressed \n"); } if (digitalRead(4) != 1 && digitalRead(9) == 0) { Serial.print("button S12 pressed \n"); } if (digitalRead(3) != 1 && digitalRead(9) == 0) { Serial.print("button S8 pressed \n"); } if (digitalRead(2) != 1 && digitalRead(9) == 0) { Serial.print("button S4 pressed \n"); } if (digitalRead(5) != 1 && digitalRead(8) == 0) { Serial.print("button S15 pressed \n"); } } void switchoff(){ for (int i=6; i<=9; i++) { digitalWrite(i, 1); } }Контакт на 8 пине есть, вызванивал.
} из 20 надо вырезать и вставить между 36 37
Поменял местами входы и выходы в проге, добавил дилей в лупе. Что-то проясняется...
void setup() { Serial.begin(9600); pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); } void loop() { for (int i=2; i<=5; i++) { switchoff(); digitalWrite(i, 0); delay(100); } if (digitalRead(9) != 1 && digitalRead(5) == 0) { Serial.print("button S16 pressed \n"); } if (digitalRead(8) != 1 && digitalRead(5) == 0) { Serial.print("button S12 pressed \n"); } if (digitalRead(7) != 1 && digitalRead(5) == 0) { Serial.print("button S8 pressed \n"); } if (digitalRead(6) != 1 && digitalRead(5) == 0) { Serial.print("button S4 pressed \n"); } if (digitalRead(9) != 1 && digitalRead(4) == 0) { Serial.print("button S15 pressed \n"); } } void switchoff(){ for (int i=6; i<=9; i++) { digitalWrite(i, 1); } }Показалось. Но, хотя бы, напруга между группами пинов нормальная стала.
} из 20 надо вырезать и вставить между 36 37
По моим наблюдениям, не влияет эта скобка на ход поршней. Кнопка S15 очнулась. Но, при нажати S15 или S16 в порт выходит сразу два сообщения. Где я не прав?
Не удалось мне различить нажатия кнопок из двух рядов(
Принял к сведению, спасибо.
Друзья, еще вопрос возник. Новую тему создавать не буду, спрошу здесь. В коде, изложенном в шапке, я опрашиваю состояния кнопок клавиатуры при помощи библиотеки и чужого кода. Мне же очень сильно необходимо пропустить процесс обработки клавиш через себя, понимания ради. Да и для задачи. Ну, не катит мне библиотека, так уж получилось. Теорию, вроде как, понимаю. Вот статья хорошая https://habr.com/ru/post/394585/ изучил, вроде понял что-то. Понимаю, что цикл нужен для динамического опроса кнопки (кнопок). Но как завернуть все это не знаю. Понимаю, что просить написать кусок кода - наглость, но может есть где пример (кода), который облегчит понимание. Спасибо.
На основе пятого поста:
for(int col = 9; col >= 6; col--) { for(int row = 5; row >= 2; row--) { if(digitalRead(col)==0 && digitalRead(row)==0)//тут не помню точно, будет ли так работать проверка digitalRead(); { digitalWrite(13, LOW); } else { digitalWrite(13, HIGH); } } }Спасибо, но не помогло. Все равно при нажатии каждой из четырех кнопок столбца (одного столбца) срабатывает проверка.
void setup() { Serial.begin(9600); pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); } void loop() { for(int col = 9; col >= 6; col--) { for(int row = 5; row >= 2; row--) { if(digitalRead(9) != 0 && digitalRead(5) == 0) { digitalWrite(13, LOW); } else { digitalWrite(13, HIGH); } } } }Не удалось мне различить нажатия кнопок из двух рядов(
Может надо опрашивать только тот ряд, который активен на данный момент?
Т.е -установили высокий уровень на ряд-опросили -низкий уровень на ряд
дальше опрашиваем следующий ряд
P.S. В упрощённом виде, кнопки "подтянуты" к земле
const byte button[4][4] = { //номера кнопок {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}, }; unsigned long last_millis = 0; void setup() { Serial.begin(9600); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(2, INPUT); pinMode(3, INPUT); pinMode(4, INPUT); pinMode(5, INPUT); } void loop() { if (millis() - last_millis >= 10) { // каждые 10мс last_millis = millis(); for (byte i = 6; i < 10; i++) { digitalWrite(i, HIGH); //"активируем" столбец for (byte z = 2; z < 6; z++) { //опрашиваем строку if (digitalRead(z)) { Serial.println(button[i][z]);// печатаем номер кнопки } } digitalWrite(i, LOW); //гасим столбец } } }Может просто не нужно мозги парить, а воспользоваться полным функционалом библиотеки Keypad.h ?
может, я не разобрался(
Спасибо, но не помогло. Все равно при нажатии каждой из четырех кнопок столбца (одного столбца) срабатывает проверка.
Да, так не будет работать, я думал, что все 8 пинов это входы... Есть схема этого дисплея. Или словами описать как оно должно работать. Насколько понял от 2го до 5го устанавливается 1 по очереди и потом считывается с 6го по 9й.
void setup() { Serial.begin(9600); pinMode(6, INPUT_PULLUP); pinMode(7, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(9, INPUT_PULLUP); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); } void loop() { for(int row = 5; row >= 2; row--) digitalWrite(row, HIGH); { for(int col = 9; col >= 6; col--) { if(digitalRead(col) != 0)//сюда не константу(9) надо ставить, а переменную цикла, чтобы при каждой итерации происходил опрос другого порта { digitalWrite(13, LOW); delay(1000); } else { digitalWrite(13, HIGH); } } digitalWrite(row, LOW); } }По идее сейчас контроллер будет по очереди выставлять на 2-5 высокий уровень, потом читать с 6-9, если будет высокий уровень на 6-9, то светодиод погаснет на секунду, после чего дальше опрос пойдет.
Вы сейчас заново тут напишите библиотеку Keypad.h, только криво и с урезанным функционалом :-)
При опросе матричной клавиатуры, все пины последовательно меняются ролями .
Каждый пин во время опроса становится то входом, то выходом.
Чтоб не писать всякую дурь, откройте исходники библиотеки и посмотрите как там написано.
Здравствуйте. Никакие куски кода, написанные компетентными людьми здесь, у меня должным образом не работают. Ну вообще прям ничего не получается (совсем нуб). Хотел бы попросить подсказать мне темы/понятия/алгоритмы, которые имеет смысл усиленно поизучать. Спасибо.
Не запускал, но надеюсь. Добейтесь чтоб оно заработало. По-моему должно помочь понять и доделать.
....... for( byte y = 2; y < 6; y++ ) { digitalWrite( y, LOW ); for( byte x = 6; x < 10; x++ ) { if( digitalRead( x ) == LOW ) { Serial.print( " *" ); } else { Serial.print( " -" ); } } // for( byte x = ....... ) // digitalWrite( y, HIGH ); Serial.println( " :)" ); } // for( byte y = ....... ) // delay( 500 ); Serial.println( " " ); .......В итоге нужно сделать чтобы диод загорался по нажатию и горел. По следующему нажатию тух.
Здесь, как по мне, с диодом не всё ясно:
напр. 1-е нажатие на кнопку1 - диод загорелся
2-е нажатие на кнопку1 - потух
------------------------------------------------
или
1-е нажатие на кнопку1 - диод загорелся
следующее нажатие на кнопку2 - а)диод потух?
б)продолжает гореть?
в) по диоду на кнопку?)))
Матрица СИДов- какая, как собираетесь ею управлять?
Хотел бы попросить подсказать мне темы/понятия/алгоритмы, которые имеет смысл усиленно поизучать. Спасибо.
берите любой учебник по Си и читайте с самого начала. Только приготовтесь, что прежде чем вы почувствуете, что что-то поняли - пройдет от пары недель до трех-четырех месяцев
Хотел бы попросить подсказать мне темы/понятия/алгоритмы, которые имеет смысл усиленно поизучать. Спасибо.
берите любой учебник по Си и читайте с самого начала. Только приготовтесь, что прежде чем вы почувствуете, что что-то поняли - пройдет от пары недель до трех-четырех месяцев
... или горааааздо больше ))
Хотел бы попросить подсказать мне темы/понятия/алгоритмы, которые имеет смысл усиленно поизучать. Спасибо.
берите любой учебник по Си и читайте с самого начала. Только приготовтесь, что прежде чем вы почувствуете, что что-то поняли - пройдет от пары недель до трех-четырех месяцев
... или горааааздо больше ))
это да, я начал читать в 1993, ещё не осилил )))
Не запускал, но надеюсь. Добейтесь чтоб оно заработало. По-моему должно помочь понять и доделать.
....... for( byte y = 2; y < 6; y++ ) { digitalWrite( y, LOW ); for( byte x = 6; x < 10; x++ ) { if( digitalRead( x ) == LOW ) { Serial.print( " *" ); } else { Serial.print( " -" ); } } // for( byte x = ....... ) // digitalWrite( y, HIGH ); Serial.println( " :)" ); } // for( byte y = ....... ) // delay( 500 ); Serial.println( " " ); .......Как до железа доберусь, попробую в обяз. Спасибо.
В итоге нужно сделать чтобы диод загорался по нажатию и горел. По следующему нажатию тух.
Здесь, как по мне, с диодом не всё ясно:
напр. 1-е нажатие на кнопку1 - диод загорелся
2-е нажатие на кнопку1 - потух
------------------------------------------------
или
1-е нажатие на кнопку1 - диод загорелся
следующее нажатие на кнопку2 - а)диод потух?
б)продолжает гореть?
в) по диоду на кнопку?)))
Логика такая: каждому диоду своя кнопка. Кнопку нажал - загорелся и горит(типа как самоподхват). Еще раз нажал ТУ ЖЕ КНОПКУ - потух.
Матрица СИДов- какая, как собираетесь ею управлять?
Вопрос не понял ВООБЩЕ. Вы говорите с куском дерева щас.
Хотел бы попросить подсказать мне темы/понятия/алгоритмы, которые имеет смысл усиленно поизучать. Спасибо.
берите любой учебник по Си и читайте с самого начала. Только приготовтесь, что прежде чем вы почувствуете, что что-то поняли - пройдет от пары недель до трех-четырех месяцев
Хорошоооо. Только вот язык этот больше похож на с++ (вроде). Или все же вся сила в СИ заключена.
Хорошоооо. Только вот язык этот больше похож на с++ (вроде). Или все же вся сила в СИ заключена.
Си и С++ - близнецы-братья
Хорошоооо. Только вот язык этот больше похож на с++ (вроде). Или все же вся сила в СИ заключена.
Си и С++ - близнецы-братья
Так почему курить-то рекомендуют именно СИ?
Так почему курить-то рекомендуют именно СИ?
Читайте что найдете, разница между Си и С++ проявится только во второй половине учебника
если честно, я вообще для себя их не разделяю и считаю одним языком. Си , говоря грубо - подмножество С++, программы на Си можно писать и там и там :)
О чем речь понял, до ооп в с++ так и не дошел пока)
Так почему курить-то рекомендуют именно СИ?
Если найдете учебник по чистому Си после 2010 года написания, дайте знать)) Не то, чтобы он мне сильно нужен, просто для расширения границ неОпознанного ))
Вникайте в "плюсЫ", ардуиноИДЕ это и потребляет.
если честно, я вообще для себя их не разделяю и считаю одним языком. Си , говоря грубо - подмножество С++, программы на Си можно писать и там и там :)
Плюсую (извините за каламбур:))
Задание я, кстати, провалил. Это было тестовое на вакансию электронщика. Ну, не суть. Удовольствие я получил от выполнения. Поэтому хочу "добить".
Логика такая: каждому диоду своя кнопка. Кнопку нажал - загорелся и горит(типа как самоподхват). Еще раз нажал ТУ ЖЕ КНОПКУ - потух.
А если нажал первую кнопку - загорелся, а затем, не нажимая первую, нажимаем вторую?
Задание я, кстати, провалил. Это было тестовое на вакансию электронщика. Ну, не суть. Удовольствие я получил от выполнения. Поэтому хочу "добить".
По статистике, подавляющее большинство вакансий и соискателей не сходятся в точку (по разным причинам), это жизнь. Если не секрет, что за позиция "электронщик"? Это нужно генерировать электроны, или передавать их на большие расстояния?
Логика такая: каждому диоду своя кнопка. Кнопку нажал - загорелся и горит(типа как самоподхват). Еще раз нажал ТУ ЖЕ КНОПКУ - потух.
А если нажал первую кнопку - загорелся, а затем, не нажимая первую, нажимаем вторую?
тогда загорается второй/третий и тд. ну сколько там диодов ардуина по току потянет я не знаю. по идее нажав все клавиши можно зажечь все светодиоды
Задание я, кстати, провалил. Это было тестовое на вакансию электронщика. Ну, не суть. Удовольствие я получил от выполнения. Поэтому хочу "добить".
По статистике, подавляющее большинство вакансий и соискателей не сходятся в точку (по разным причинам), это жизнь. Если не секрет, что за позиция "электронщик"? Это нужно генерировать электроны, или передавать их на большие расстояния?
))))))))))) а разве электрон сгенерировать можно?) я думал его только от атома "оторвать" можно. да и вообще процессы эти туманны, никто их не видел воочию, насколько я понимаю.
короче позиция заключалась в разработке несложных устройств (пленочных клавиатур, например), на базе мк, и написание прошивок (что меня и манит).
так то я и так "электронщик" в трудовой. типа специалист по электронным устройствам: плк, инверторы. но притомился, и здоровье уже не то по командировкам дрягаться. программировать хочу.