====== Эксперимент 14. Счётчик нажатий ======
[[секундомер|← Секундомер]] | [[конспект-arduino:|Оглавление]] | [[комнатный-термометр|Комнатный термометр →]]
В этом эксперименте мы выводим на семисегментный индикатор количество нажатий на кнопку (единицы).
===== Список деталей для эксперимента =====
* 1 плата [[amp>product/arduino-uno|Arduino Uno]]
* 1 беспаечная [[amp>collection/breadboards|макетная плата]]
* 1 тактовая [[amp>product/tactile-button|кнопка]]
* 1 выходной сдвиговый регистр [[amp>product/chip-sn74hc595n|74HC595]]
* 1 [[amp>product/7-segment-led|семисегментный]] индикатор
* 7 [[amp>product/resistor-220r|резисторов]] номиналом 220 Ом
* 24 провода [[amp>product/wire-mm|«папа-папа»]]
====Для дополнительного задания====
* 1 [[amp>product/ldr|фоторезистор]]
* 1 резистор номиналом 10 кОм
* еще 1 провод
===== Принципиальная схема =====
{{ :конспект-arduino:14_7seg_click_scheme.svg.png?nolink& |}}
===== Схема на макетке =====
{{ :конспект-arduino:14_7seg_click_bread.svg.png?nolink& |}}
===== Обратите внимание =====
* В этом эксперименте мы впервые используем микросхему, в данном случае — выходной сдвиговый регистр 74HC595. Микросхемы полезны тем, что позволяют решать определенную задачу, не собирая каждый раз стандартную схему.
* Выходной сдвиговый регистр дает нам возможность «сэкономить» цифровые выходы, использовав всего 3 вместо 8. Каскад регистров позволил бы давать 16 и т.д. сигналов через те же три пина.
* Перед использованием микросхемы нужно внимательно изучить схему ее подключения в [[http://files.amperka.ru/datasheets/74hc595.pdf|datasheet’е]]. Для того, чтобы понять, откуда считать ножки микросхемы, на них с одной стороны есть полукруглая выемка. Если мы расположим нашу 74HC595 выемкой влево, то в нижнем ряду будут ножки 1—8, а в верхнем 16—9.
* На принципиальной схеме нашего эксперимента ножки расположены в другом порядке, чтобы не вышло путаницы в соединениях. Назначения выводов согласно datasheet’у подписаны внутри изображения микросхемы, номера ножек — снаружи.
* Напомним, что на изображении семисегментного индикатора подписаны номера его ножек и их соответствие сегментам.
===== Скетч =====
#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);
}
===== Пояснения к коду =====
* Обратите внимание, что в этом эксперименте кодировки символов отличаются от кодировок из эксперимента [[секундомер|«Секундомер»]].
* Для того, чтобы передать порцию данных, которые будут отправлены через сдвиговый регистр далее, нам нужно подать ''LOW'' на latch pin (вход STcp микросхемы), затем передать данные, а затем отправить ''HIGH'' на latch pin, после чего на соответствующих выходах 74HC595 появится переданная комбинация высоких и низких уровней сигнала.
* Для передачи данных мы использовали функцию ''shiftOut(dataPin, clockPin, bitOrder, value)''. Функция ничего не возвращает, а в качестве параметров ей нужно сообщить
* пин Arduino, который подключен ко входу DS микросхемы (data pin),
* пин Arduino, соединенный со входом SHcp (clock pin),
* порядок записи битов: ''LSBFIRST'' (least significant bit first) — начиная с младшего, или ''MSBFIRST'' (most significant bit first) — начиная со старшего,
* байт данных, который нужно передать. Функция работает с порциями данных в один байт, так что если вам нужно передать больше, придется вызывать ее несколько раз.
===== Вопросы для проверки себя =====
- Для чего нужны микросхемы? Для чего нужен выходной сдвиговый регистр?
- Как найти ножку микросхемы, на которую отправляются данные?
- Что нужно сделать до и после отправки собственно данных на 74HC595?
- Сколько данных можно передать с помощью ''shiftOut()'' и как управлять порядком их передачи?
===== Задания для самостоятельного решения =====
- Заставьте ''shiftOut()'' отправлять биты, начиная со старшего, и измените код так, чтобы счетчик по-прежнему показывал арабские цифры.
- Замените кнопку на датчик света (фоторезистор в схеме делителя напряжения) и переделайте программу так, чтобы индикатор цифрой показывал уровень освещенности.
----
[[секундомер|← Секундомер]] | [[конспект-arduino:|Оглавление]] | [[комнатный-термометр|Комнатный термометр →]]