===== Эксперимент 18. Люксметр на сдвиговом регистре 74HC595 =====
В 12 эксперименте мы собирали устройство Люксметр. Это устройство также можно собрать используя [[theory:74HC595|сдвиговый регистр 74НС595.]]\\
Сразу возникает вопрос: "Зачем переделывать устройство, если оно и так работает?".\\
Все дело в том, что пока мы делаем простые проекты, нам вполне хватает количества цифровых вводов\выводов, но со временем может наступить ситуация когда пинов станет не хватать. Вот здесь и может пригодиться сдвиговый регистр 74НС595, поскольку используя всего три пина контроллера и одну микросхему можно получить 8 выходов. А подключая микросхемы одну за другой можно используя все те же 3 пина контроллера получать 16,24,32 и тд. цифровых выходов.
==== Схема эксперимента ====
{{ :products:ardu:exp18_sch.png?nolink&400 |}}
//Рисунок 1. Электрическая принципиальная схема эксперимента//
{{ :products:ardu:exp18.png?direct&600 |}}
//Рисунок 2. Монтажная схема эксперимента//
В соответствии с [[theory:74HC595|распиновкой]], подключаем выводы микросхемы в следующем порядке:
* выводы 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) микросхемы подключаем к светодиодам
==== Программный код эксперимента ====
const int NbrLEDs = 8;
int latchPin = 5;
int clockPin = 6;
int dataPin = 4;
const int photocellPin = A0;
int ledLevel = 0;
byte states[8] = {B10000000,B11000000,B11100000,B11110000,B11111000,B11111100,B11111110,B11111111};
int sensorValue = 0;
void updateShiftRegister(byte leds){
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
void setup() {
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
digitalWrite(latchPin, HIGH);
}
void loop() {
sensorValue = analogRead(photocellPin);
ledLevel = map(sensorValue, 0, 1023, 0, NbrLEDs);
updateShiftRegister(states[ledLevel]);
}
В программе эксперимента используем массив с данными, для наглядности, в форме битовой маски.
==== Дополнительное задание ====