обработка 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); } }
По нажатию кнопки диод загорается, но не гаснет при отпускании. То есть работает этот чар не как привычный мне булин. Прошу, подскажите, как совладать с кнопкой. В итоге нужно сделать чтобы диод загорался по нажатию и горел. По следующему нажатию тух. Была бы обычная кнопка, я бы написал, тут же не выходит.
Покажите конечный код программы. Может быть вы не корректно их соединили?
Там, где вы зажигаете светодиод, добавьте дополнительное условие - проверяйте, если светодиод не горит, то зажигайте, иначе - гасите его.
Это делается, конечно, и без условия, но для вас пока так будет проще.
DEL
Спасибо!!
DEL
Так и у меня получалось уже. Но мне надо в обяз с одной клавиши зажигать и тушить. Вопрос уже решен, спасибо, ребят.
Переменная
led
лишняя, кроме как вdigitalWrite
она нигде больше не используется. И заводить для каждого светодиода матрицы переменную - это расточительно. Пишите сразуdigitalWrite(13, !
digitalRead(13)
);Принял к сведению, спасибо.
Друзья, еще вопрос возник. Новую тему создавать не буду, спрошу здесь. В коде, изложенном в шапке, я опрашиваю состояния кнопок клавиатуры при помощи библиотеки и чужого кода. Мне же очень сильно необходимо пропустить процесс обработки клавиш через себя, понимания ради. Да и для задачи. Ну, не катит мне библиотека, так уж получилось. Теорию, вроде как, понимаю. Вот статья хорошая https://habr.com/ru/post/394585/ изучил, вроде понял что-то. Понимаю, что цикл нужен для динамического опроса кнопки (кнопок). Но как завернуть все это не знаю. Понимаю, что просить написать кусок кода - наглость, но может есть где пример (кода), который облегчит понимание. Спасибо.
PS Содержание библиотеки просмотрел, мне это ничего не дало.
Хочу представить свой потешный код:
Созданные мною процедуры pr1-pr4 динамически сдвигают потенциал второй ноги кнопки, там самым позволяя динамически опрашивать кнопки (по крайней мере мне бы так хотелось). Я полагал, войд луп будет крутить мои процедуры от первой к четвертой и так до бесконечности, но не работает. Друзья, помогите ньюфагу создать такой цикл, чтобы эта идея (динамическое изменение состояния пина) заработала...
Бред
Та я знаю
Ничего, постепенно дойдёт. После каждой pr делайте опрос 2..5 и результат (4 бита) сохраняйте в переменных. Т.о., на выходе будет 4 переменных. Только пины обзовите осмысленно.
Ничего, постепенно дойдёт. После каждой pr делайте опрос 2..5 и результат (4 бита) сохраняйте в переменных. Т.о., на выходе будет 4 переменных. Только пины обзовите осмысленно.
Спасибо, ваш способ попробую позже (тк не все понял), пока так закрутил:
Вроде работает, щас попробую вторую кнопку навесить.
Один столбец работает, перехожу на второй и провал. Гляньте код плиз, кому не сложно:
Контакт на 8 пине есть, вызванивал.
} из 20 надо вырезать и вставить между 36 37
Поменял местами входы и выходы в проге, добавил дилей в лупе. Что-то проясняется...
Показалось. Но, хотя бы, напруга между группами пинов нормальная стала.
} из 20 надо вырезать и вставить между 36 37
По моим наблюдениям, не влияет эта скобка на ход поршней. Кнопка S15 очнулась. Но, при нажати S15 или S16 в порт выходит сразу два сообщения. Где я не прав?
Не удалось мне различить нажатия кнопок из двух рядов(
Принял к сведению, спасибо.
Друзья, еще вопрос возник. Новую тему создавать не буду, спрошу здесь. В коде, изложенном в шапке, я опрашиваю состояния кнопок клавиатуры при помощи библиотеки и чужого кода. Мне же очень сильно необходимо пропустить процесс обработки клавиш через себя, понимания ради. Да и для задачи. Ну, не катит мне библиотека, так уж получилось. Теорию, вроде как, понимаю. Вот статья хорошая https://habr.com/ru/post/394585/ изучил, вроде понял что-то. Понимаю, что цикл нужен для динамического опроса кнопки (кнопок). Но как завернуть все это не знаю. Понимаю, что просить написать кусок кода - наглость, но может есть где пример (кода), который облегчит понимание. Спасибо.
На основе пятого поста:
Спасибо, но не помогло. Все равно при нажатии каждой из четырех кнопок столбца (одного столбца) срабатывает проверка.
Не удалось мне различить нажатия кнопок из двух рядов(
Может надо опрашивать только тот ряд, который активен на данный момент?
Т.е -установили высокий уровень на ряд-опросили -низкий уровень на ряд
дальше опрашиваем следующий ряд
P.S. В упрощённом виде, кнопки "подтянуты" к земле
Может просто не нужно мозги парить, а воспользоваться полным функционалом библиотеки Keypad.h ?
может, я не разобрался(
Спасибо, но не помогло. Все равно при нажатии каждой из четырех кнопок столбца (одного столбца) срабатывает проверка.
Да, так не будет работать, я думал, что все 8 пинов это входы... Есть схема этого дисплея. Или словами описать как оно должно работать. Насколько понял от 2го до 5го устанавливается 1 по очереди и потом считывается с 6го по 9й.
По идее сейчас контроллер будет по очереди выставлять на 2-5 высокий уровень, потом читать с 6-9, если будет высокий уровень на 6-9, то светодиод погаснет на секунду, после чего дальше опрос пойдет.
Вы сейчас заново тут напишите библиотеку Keypad.h, только криво и с урезанным функционалом :-)
При опросе матричной клавиатуры, все пины последовательно меняются ролями .
Каждый пин во время опроса становится то входом, то выходом.
Чтоб не писать всякую дурь, откройте исходники библиотеки и посмотрите как там написано.
Здравствуйте. Никакие куски кода, написанные компетентными людьми здесь, у меня должным образом не работают. Ну вообще прям ничего не получается (совсем нуб). Хотел бы попросить подсказать мне темы/понятия/алгоритмы, которые имеет смысл усиленно поизучать. Спасибо.
Не запускал, но надеюсь. Добейтесь чтоб оно заработало. По-моему должно помочь понять и доделать.
В итоге нужно сделать чтобы диод загорался по нажатию и горел. По следующему нажатию тух.
Здесь, как по мне, с диодом не всё ясно:
напр. 1-е нажатие на кнопку1 - диод загорелся
2-е нажатие на кнопку1 - потух
------------------------------------------------
или
1-е нажатие на кнопку1 - диод загорелся
следующее нажатие на кнопку2 - а)диод потух?
б)продолжает гореть?
в) по диоду на кнопку?)))
Матрица СИДов- какая, как собираетесь ею управлять?
Хотел бы попросить подсказать мне темы/понятия/алгоритмы, которые имеет смысл усиленно поизучать. Спасибо.
берите любой учебник по Си и читайте с самого начала. Только приготовтесь, что прежде чем вы почувствуете, что что-то поняли - пройдет от пары недель до трех-четырех месяцев
Хотел бы попросить подсказать мне темы/понятия/алгоритмы, которые имеет смысл усиленно поизучать. Спасибо.
берите любой учебник по Си и читайте с самого начала. Только приготовтесь, что прежде чем вы почувствуете, что что-то поняли - пройдет от пары недель до трех-четырех месяцев
... или горааааздо больше ))
Хотел бы попросить подсказать мне темы/понятия/алгоритмы, которые имеет смысл усиленно поизучать. Спасибо.
берите любой учебник по Си и читайте с самого начала. Только приготовтесь, что прежде чем вы почувствуете, что что-то поняли - пройдет от пары недель до трех-четырех месяцев
... или горааааздо больше ))
это да, я начал читать в 1993, ещё не осилил )))
Не запускал, но надеюсь. Добейтесь чтоб оно заработало. По-моему должно помочь понять и доделать.
Как до железа доберусь, попробую в обяз. Спасибо.
В итоге нужно сделать чтобы диод загорался по нажатию и горел. По следующему нажатию тух.
Здесь, как по мне, с диодом не всё ясно:
напр. 1-е нажатие на кнопку1 - диод загорелся
2-е нажатие на кнопку1 - потух
------------------------------------------------
или
1-е нажатие на кнопку1 - диод загорелся
следующее нажатие на кнопку2 - а)диод потух?
б)продолжает гореть?
в) по диоду на кнопку?)))
Логика такая: каждому диоду своя кнопка. Кнопку нажал - загорелся и горит(типа как самоподхват). Еще раз нажал ТУ ЖЕ КНОПКУ - потух.
Матрица СИДов- какая, как собираетесь ею управлять?
Вопрос не понял ВООБЩЕ. Вы говорите с куском дерева щас.
Хотел бы попросить подсказать мне темы/понятия/алгоритмы, которые имеет смысл усиленно поизучать. Спасибо.
берите любой учебник по Си и читайте с самого начала. Только приготовтесь, что прежде чем вы почувствуете, что что-то поняли - пройдет от пары недель до трех-четырех месяцев
Хорошоооо. Только вот язык этот больше похож на с++ (вроде). Или все же вся сила в СИ заключена.
Хорошоооо. Только вот язык этот больше похож на с++ (вроде). Или все же вся сила в СИ заключена.
Си и С++ - близнецы-братья
Хорошоооо. Только вот язык этот больше похож на с++ (вроде). Или все же вся сила в СИ заключена.
Си и С++ - близнецы-братья
Так почему курить-то рекомендуют именно СИ?
Так почему курить-то рекомендуют именно СИ?
Читайте что найдете, разница между Си и С++ проявится только во второй половине учебника
если честно, я вообще для себя их не разделяю и считаю одним языком. Си , говоря грубо - подмножество С++, программы на Си можно писать и там и там :)
О чем речь понял, до ооп в с++ так и не дошел пока)
Так почему курить-то рекомендуют именно СИ?
Если найдете учебник по чистому Си после 2010 года написания, дайте знать)) Не то, чтобы он мне сильно нужен, просто для расширения границ неОпознанного ))
Вникайте в "плюсЫ", ардуиноИДЕ это и потребляет.
если честно, я вообще для себя их не разделяю и считаю одним языком. Си , говоря грубо - подмножество С++, программы на Си можно писать и там и там :)
Плюсую (извините за каламбур:))
Задание я, кстати, провалил. Это было тестовое на вакансию электронщика. Ну, не суть. Удовольствие я получил от выполнения. Поэтому хочу "добить".
Логика такая: каждому диоду своя кнопка. Кнопку нажал - загорелся и горит(типа как самоподхват). Еще раз нажал ТУ ЖЕ КНОПКУ - потух.
А если нажал первую кнопку - загорелся, а затем, не нажимая первую, нажимаем вторую?
Задание я, кстати, провалил. Это было тестовое на вакансию электронщика. Ну, не суть. Удовольствие я получил от выполнения. Поэтому хочу "добить".
По статистике, подавляющее большинство вакансий и соискателей не сходятся в точку (по разным причинам), это жизнь. Если не секрет, что за позиция "электронщик"? Это нужно генерировать электроны, или передавать их на большие расстояния?
Логика такая: каждому диоду своя кнопка. Кнопку нажал - загорелся и горит(типа как самоподхват). Еще раз нажал ТУ ЖЕ КНОПКУ - потух.
А если нажал первую кнопку - загорелся, а затем, не нажимая первую, нажимаем вторую?
тогда загорается второй/третий и тд. ну сколько там диодов ардуина по току потянет я не знаю. по идее нажав все клавиши можно зажечь все светодиоды
Задание я, кстати, провалил. Это было тестовое на вакансию электронщика. Ну, не суть. Удовольствие я получил от выполнения. Поэтому хочу "добить".
По статистике, подавляющее большинство вакансий и соискателей не сходятся в точку (по разным причинам), это жизнь. Если не секрет, что за позиция "электронщик"? Это нужно генерировать электроны, или передавать их на большие расстояния?
))))))))))) а разве электрон сгенерировать можно?) я думал его только от атома "оторвать" можно. да и вообще процессы эти туманны, никто их не видел воочию, насколько я понимаю.
короче позиция заключалась в разработке несложных устройств (пленочных клавиатур, например), на базе мк, и написание прошивок (что меня и манит).
так то я и так "электронщик" в трудовой. типа специалист по электронным устройствам: плк, инверторы. но притомился, и здоровье уже не то по командировкам дрягаться. программировать хочу.