У овом тексту ћемо истражити како да користимо померачки регистар (IC 74HC595) и 7-сегментни дисплеј (модел 5161AS) за праћење броја људи који улазе и излазе из собе. Користећи ове елементе и неколико дугмади, направићемо систем који приказује тренутни број људи присутних на екрану. У ранијим текстовима 7-сегментни дисплеј и померачки регистар сам користио засебно, а сада их комбинујем и уводим занимљиве ефекте на дисплеју.
Опис пројекта са 7-сегментним дисплејом и померачким регистром
Улазак и излазак особа из собе биће симулирани помоћу тастера. Улазак у просторију повећава бројач за 1, док излазак смањује његову вредност. Тренутно стање бројача ће бити приказано на 7-сегментном дисплеју. Пошто се користи само један модул дисплеја, могуће вредности су у опсегу од 0 до 9. Рад екрана се контролише помоћу померачког регистра. Када је соба празна, приказује се број 0, док када је у просторији максималан број људи (за потребе демонстрације), број 9 ће трептати на дисплеју 2 пута у секунди.
Програм и објашњење
int latchPin = 9; //pin 12 on the 595
int dataPin = 8; //pin 14 on the 595
int clockPin = 10; //pin 11 on the 595
const int btnUp = 3;
const int btnDown = 2;
volatile int pplCount = 0;
int prevPplCnt = 0;
const int segPin = 5;
int numbers[] = { 95, 6, 59, 47, 102, 109, 125, 7, 127, 111 };
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(segPin, OUTPUT);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(btnUp), incCounter, RISING);
attachInterrupt(digitalPinToInterrupt(btnDown), decCounter, RISING);
}
void loop() {
Serial.println(pplCount);
if (pplCount != prevPplCnt || pplCount == 0) displayNumber(pplCount);
if (pplCount == 9) {
digitalWrite(segPin, HIGH);
delay(250);
digitalWrite(segPin, LOW);
}
delay(10);
}
void displayNumber(int br) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, numbers[br]);
digitalWrite(latchPin, HIGH);
}
void incCounter() {
static unsigned long lastMicros = 0;
// button debouncing
if (micros() - lastMicros > 250000) {
if (pplCount < 9) pplCount++;
}
lastMicros = micros();
}
void decCounter() {
static unsigned long lastMicros = 0;
// button debouncing
if (micros() - lastMicros > 250000) {
if (pplCount > 0) pplCount--;
}
lastMicros = micros();
}
Овај код за Ардуино је дизајниран да контролише 7-сегментни дисплеј, преко померачког регистра 74HC595, користећи тастере за повећање и смањење броја људи (`pplCount`). Број се приказује на 7-сегментном дисплеју, а постоји посебно понашање када `pplCount’ достигне 9, при чему пинови сегмента мењају своја стања сваких 250 милисекунди, што ефективно значи да ће број на екрану трептати. Ево поделе кључних компоненти и функционалности:
Одељак декларација
Код почиње дефинисањем пинова за контролу 595 ИK-а (`latchPin`, `dataPin`, `clockPin`) и за притискање тастера за читање (`btnUp`, `btnDown`). Такође дефинише променљиве за бројање људи (`pplCount`), чување претходног броја (`prevPplCnt`) и контролу 7-сегментног приказа (`segPin`). Поред тога, иницијализује низ (`numbers[]`) за приказивање цифара на 7-сегментном дисплеју.
Функција конфигурације
У функцији `setup()`, подешава се режим рада пинова повезаних на 595 ИK и серијску комуникацију. Прекиди су везани за пинове `btnUp` и `btnDown` за позивање функција (`incCounter` и `decCounter`) кад год се ови тастери притисну.
Функција петље
Главна логика програма ради у функцији `loop()`. Приказује тренутни број људи на серијски монитор и проверава да ли се број променио или је нула да ажурира екран.
Функција displayNumber
Функција `displayNumber(int br)` је одговорна за ажурирање 7-сегментног екрана са тренутним бројем људи. Користи функцију `shiftOut` да пошаље бинарни приказ броја на 595 ИК, који затим контролише сегменте приказа.
ИСР функције
Функције `incCounter()` и `decCounter()` се позивају путем прекида када се притисну одговарајући тастери. Они једноставно повећавају или смањују променљиву `pplCount` у одређеним границама.
Завршна реч
Код демонстрира основну интеракцију између хардверских компоненти (тастери, 7-сегментни дисплеј и микроконтролер) кроз софтвер, показујући како читати улазе, манипулисати излазима и управљати променама стања као одговор на радње корисника.