Урок 14. Счётчик нажатий


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

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

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

  • фоторезистор
  • резистор номиналом 10 кОм
  • еще 1 провод

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

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

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

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

Скетч

  1.     #define DATA_PIN    13 // пин данных (англ. data)
    
  2.     #define LATCH_PIN   12 // пин такта (англ. clock)
    
  3.     #define CLOCK_PIN   11 // пин строба (англ. latch)
    
  4.     #define BUTTON_PIN  10
    
  5.  
  6.     int clicks = 0
    ;
    
  7.     boolean buttonWasUp = true
    ;
    
  8.     byte segments[
    10
    ] = {
    
  9.       0b01111101, 0b00100100, 0b01111010, 0b01110110, 0b00100111, 
  10.       0b01010111, 0b01011111, 0b01100100, 0b01111111, 0b01110111
    
  11.     }
    ;
    
  12.  
  13.     void setup(
    )
    
  14.     {
    
  15.       pinMode(DATA_PIN, OUTPUT)
    ;
    
  16.       pinMode(CLOCK_PIN, OUTPUT)
    ;
    
  17.       pinMode(LATCH_PIN, OUTPUT)
    ;
    
  18.       pinMode(BUTTON_PIN, INPUT_PULLUP)
    ;
    
  19.     }
    
  20.  
  21.     void loop(
    )
    
  22.     {
    
  23.       // считаем клики кнопки, как уже делали это раньше
    
  24.       if (buttonWasUp && !digitalRead(BUTTON_PIN)
    ) {
    
  25.         delay(
    10
    )
    ;
    
  26.         if (
    !digitalRead(BUTTON_PIN)
    )
    
  27.           clicks = (clicks + 1
    ) % 10
    ;
    
  28.       }
    
  29.       buttonWasUp = digitalRead(BUTTON_PIN)
    ;
    
  30.       // для записи в 74HC595 нужно притянуть пин строба к земле
    
  31.       digitalWrite(LATCH_PIN, LOW)
    ;
    
  32.       // задвигаем (англ. shift out) байт-маску бит за битом,
    
  33.       // начиная с младшего (англ. Least Significant Bit first)
    
  34.       shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[clicks]
    )
    ;
    
  35.       // чтобы переданный байт отразился на выходах Qx, нужно
    
  36.       // подать на пин строба высокий сигнал
    
  37.       digitalWrite(LATCH_PIN, HIGH)
    ;
    
  38.     }
    

Пояснения к коду

  • Обратите внимание, что в этом эксперименте кодировки символов отличаются от кодировок из эксперимента Секундомер.
  • Для того, чтобы передать порцию данных, которые будут отправлены через сдвиговый регистр далее, нам нужно подать 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() отправлять биты, начиная со старшего, и измените код так, чтобы счетчик по-прежнему показывал арабские цифры.
  • Замените кнопку на датчик света (фоторезистор в схеме делителя напряжения) и переделайте программу так, чтобы индикатор цифрой показывал уровень освещенности.

 

 

Теги: 
Источник: 
wiki.amperka.ru