Обратный отсчет по нажатию кнопки
- Войдите на сайт для отправки комментариев
Пнд, 07/11/2016 - 11:16
Добрый день!
Только начинаю изучать Arduino и прошу Вас дать советы по написанию кода.
Программа состоит из двух частей:
1) Необходимо подсчитать количество нажатий на кнопку от 0 до 9 и вывести на 7-сегментный индикатор, использую сдвиговый регистр для экономии выходов (такой пример есть разобранный и по нему вроде все понятно, код приведен ниже)
2) Другая кнопка должна запускать обратный отсчет с количества нажатий до нуля и на каждой секунде издавать короткий сигнал, а при окончании долгий сигнал и должен загореться светодиод.
Подскажите, пожалуйста, какой цикл лучше использовать при обратном отсчете for или do..while?
И как написать код, чтобы сдвиговый регистр отсчитывал строго до нуля и не уходил в облать отрицательных чисел?
Заранее спасибо.
Если подобное ранее обсуждалось, то прошу дать ссылку.
#define DATA_PIN 13 // пин данных (англ. data) #define LATCH_PIN 12 // пин строба (англ. latch) #define CLOCK_PIN 11 // пин такта (англ. clock) #define BUTTON_PIN 10 int clicks = 0; boolean buttonWasUp = true; byte segments[10] = { 0b01111101, 0b00100100, 0b01111010, 0b01110110, 0b00100111, 0b01010111, 0b01011111, 0b01100100, 0b01111111, 0b01110111 }; void setup() { pinMode(DATA_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); pinMode(LATCH_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // считаем клики кнопки, как уже делали это раньше if (buttonWasUp && !digitalRead(BUTTON_PIN)) { delay(10); if (!digitalRead(BUTTON_PIN)) clicks = (clicks + 1) % 10; } buttonWasUp = digitalRead(BUTTON_PIN); // для записи в 74HC595 нужно притянуть пин строба к земле digitalWrite(LATCH_PIN, LOW); // задвигаем (англ. shift out) байт-маску бит за битом, // начиная с младшего (англ. Least Significant Bit first) shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[clicks]); // чтобы переданный байт отразился на выходах Qx, нужно // подать на пин строба высокий сигнал digitalWrite(LATCH_PIN, HIGH); }
Любой, какой Вам больше нравится.
Никак. Сдвиговый регистр не умеет ничего отсчитывать, это не его функция. Отсчитывать будете сами. Просто сравнивайте с нулём и если достигнут, дальше не уменьшайте.
Весьма оригинально!
Вы используете программную реализацию последовательного интерфейса, который в данном контроллере реализован также аппаратно. Обычно программную реализацию используют тогда, когда пины, к которым привязана аппаратная реализация заняты и их невозможно совободить.
Вы же повесили программную реализацию на те же пину, на которых живёт аппаратная. Зачем?
Добрый вечер!
Учел все замечания, написал код, компилирование проходит успешно, но после загрузки не работает, если не трудно, подскажите в чем дело, вероятнее всего ошибка в коде обратного отсчета, так как подсчет количества нажатий работал успешно.
При обратно отсчете необходимо чтобы программа останавливалась и загорался светодиод.
Заранее спасибо!
dbv1991,
Вас не смущает тот факт, что переменные BUTT_PIN и BUTT_REV никогда не меняются? Как Вы их сделали true в строка 15 и 16, так они таковыми и остаются пожизненно. Но при этом Вы старательно сравниваете их с 0 в строках 48 и 67. Зачем?
Я уж не говорю, что переменную типа boolean не стоит сравнивать на >0, т.к. она может быть >0, а может и <0 но всё равно она при этом true.
И ещё, на "языке наших партнёров" существительное butt имеет много значений, но одно из наиболее распространённых - "задница". За что Вы эти переменные так?
Я честно пытался сделать кнопки как у Вас, но ничего не получилось, сделал по своему. Убрать сериал и добавить 7 сегментный экран (у меня опять же в эмуляторе не получилось его сделать) решил не тратить время и сделать через сериал.
От души благодарен! Теперь стала понятна структура скетча!
Но по условию задачи все равно надо выводить на 7-сегментный индикатор с помощью регистра сдвига и чтобы нажатие на кнопку считало от 0 до 9 только. Сейчас попробую адаптировать под свою задачу!
Еще раз огромное спасибо!
Добрый день!
Прошу Вашей помощи в модернизации программы, она должна выполнять следущее:
Добрый день!
Прошу Вашей помощи в модернизации программы, она должна выполнять следущее:
Судя по скетчу в Вас каша в голове. Вы не определили пины Холов через #define, хотя попытка была, только решетку забыли добавить. потом решили их через int сделать, что не несть хорошо. лучше все же черед Дефайн. Так как в при их инициализации через int вы их ни к чему не приравняли поскольку трудно приравнять аналоговые порты к int овой переменной вы сдались, а какие они у Вас значения получили хз. потом.... Работа с тумблером от работы с кнопкой ничем не отличается, работа с датчиком холла от работы с кнопкой особо ничем не отличается. Используйте функции которые опрашивают состояния устройств и ставят флаги когда состояние меняется.
про миллис. вы его используете неправильно, вот вы переменную ms создали, приравняли ее в начале к millis(); это значит что она будет равна millis(); только там где вы ее приравняли, то есть в начале программы, потом она не меняется. Мой совет-уберите ms и пропишите в лупе вместо нее millis()
Моя программа была рабочей и делала то что было нужно. Ваша же уже то что нужно не делает. мне сейчас не хочется сидеть и искать где Вы ошиблись. Попробуйте решать поэтапно, выводите переменные в сириал где это нужно для отладки. Возмите рабочее (мое) решение и постипенно добавляейте элементы, так чтобы оно работало как надо на каждом этапе добавления. Сначала добавьте millis() вместо delay (), потом добавьте датчик Холла с диодом, потом второй... не нужно все городить в кучу а потом искать где ошибся.