// В этом эксперименте мы выводим на семисегментный индикатор количество нажатий на кнопку (единицы).

Список деталей для эксперимента

Для дополнительного задания

Принципиальная схема

Схема на макетке

Обратите внимание

  • В этом эксперименте мы впервые используем микросхему, в данном случае — выходной сдвиговый регистр 74HC595. Микросхемы полезны тем, что позволяют решать определенную задачу, не собирая каждый раз стандартную схему.
  • Выходной сдвиговый регистр дает нам возможность «сэкономить» цифровые выходы, использовав всего 3 вместо 8. Каскад регистров позволил бы давать 16 и т.д. сигналов через те же три пина.
  • Перед использованием микросхемы нужно внимательно изучить схему ее подключения в datasheet’е. Для того, чтобы понять, откуда считать ножки микросхемы, на них с одной стороны есть полукруглая выемка. Если мы расположим нашу 74HC595 выемкой влево, то в нижнем ряду будут ножки 1—8, а в верхнем 16—9.
  • На принципиальной схеме нашего эксперимента ножки расположены в другом порядке, чтобы не вышло путаницы в соединениях. Назначения выводов согласно datasheet’у подписаны внутри изображения микросхемы, номера ножек — снаружи.
  • Напомним, что на изображении семисегментного индикатора подписаны номера его ножек и их соответствие сегментам.

Скетч

p140_seven_segment_clicker.ino
#define DATA_PIN 13 // пин данных (англ. data)
#define LATCH_PIN 12 // пин такта (англ. clock)
#define CLOCK_PIN 11 // пин строба (англ. latch)
#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) — начиная со старшего,
    • байт данных, который нужно передать. Функция работает с порциями данных в один байт, так что если вам нужно передать больше, придется вызывать ее несколько раз.

Вопросы для проверки себя

  1. Для чего нужны микросхемы? Для чего нужен выходной сдвиговый регистр?
  2. Как найти ножку микросхемы, на которую отправляются данные?
  3. Что нужно сделать до и после отправки собственно данных на 74HC595?
  4. Сколько данных можно передать с помощью shiftOut() и как управлять порядком их передачи?

Задания для самостоятельного решения

  1. Заставьте shiftOut() отправлять биты, начиная со старшего, и измените код так, чтобы счетчик по-прежнему показывал арабские цифры.
  2. Замените кнопку на датчик света (фоторезистор в схеме делителя напряжения) и переделайте программу так, чтобы индикатор цифрой показывал уровень освещенности.

материалы с сайта Амперка