Эксперимент 18. Люксметр на сдвиговом регистре 74HC595

В 12 эксперименте мы собирали устройство Люксметр. Это устройство также можно собрать используя сдвиговый регистр 74НС595.
Сразу возникает вопрос: «Зачем переделывать устройство, если оно и так работает?».
Все дело в том, что пока мы делаем простые проекты, нам вполне хватает количества цифровых вводов\выводов, но со временем может наступить ситуация когда пинов станет не хватать. Вот здесь и может пригодиться сдвиговый регистр 74НС595, поскольку используя всего три пина контроллера и одну микросхему можно получить 8 выходов. А подключая микросхемы одну за другой можно используя все те же 3 пина контроллера получать 16,24,32 и тд. цифровых выходов.

Схема эксперимента

Рисунок 1. Электрическая принципиальная схема эксперимента

Рисунок 2. Монтажная схема эксперимента

В соответствии с распиновкой, подключаем выводы микросхемы в следующем порядке:

  • выводы 8 и 13 микросхемы на GND контроллера
  • выводы 10 и 16 микросхемы на 5v котроллера
  • выводы 11(SH_CP), 12(ST_CP) и 14(DS) микросхемы на цифровые входы\выходы контроллера (в нашем эксперементе это пины 6,5 и 4 соответственно)
  • выводы 15(Q0), 1(Q1), 2(Q2), 3(Q3), 4(Q4), 5(Q5), 6(Q6), 7(Q7) микросхемы подключаем к светодиодам

Программный код эксперимента

Exp18
  1. const int NbrLEDs = 8;
  2. int latchPin = 5;
  3. int clockPin = 6;
  4. int dataPin = 4;
  5. const int photocellPin = A0;
  6. int ledLevel = 0;
  7. byte states[8] = {B10000000,B11000000,B11100000,B11110000,B11111000,B11111100,B11111110,B11111111};
  8. int sensorValue = 0;
  9.  
  10. void updateShiftRegister(byte leds){
  11. digitalWrite(latchPin, LOW);
  12. shiftOut(dataPin, clockPin, LSBFIRST, leds);
  13. digitalWrite(latchPin, HIGH);
  14. }
  15.  
  16. void setup() {
  17. pinMode(clockPin, OUTPUT);
  18. pinMode(dataPin, OUTPUT);
  19. pinMode(latchPin, OUTPUT);
  20. digitalWrite(latchPin, HIGH);
  21. }
  22.  
  23. void loop() {
  24. sensorValue = analogRead(photocellPin);
  25. ledLevel = map(sensorValue, 0, 1023, 0, NbrLEDs);
  26. updateShiftRegister(states[ledLevel]);
  27. }

В программе эксперимента используем массив с данными, для наглядности, в форме битовой маски.

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