Сдвиговый регистр
- Войдите на сайт для отправки комментариев
Вс, 26/03/2017 - 10:00
Добрый день! Хочу собрать стенд при помощи сдвигового регистра 74hc595. Суть в том что при нажатии на кнопку сработал регистр и поочередно зажег 5 светодиодов с интервалом несколько секунд.. Таких кнопок у меня 4... И 20 светодиодов...если у кого то есть готовый скетч скиньте пожалуйста
Такой скетч вы ниасилите. Даже если тут будет скинут.
azamat alimkhan: Готового под такую специфическую задачку нет. Так а в чем сложность то?
Алгоритмически вроде все просто: Одна кнопка, одно событие нажатия, потом 6 состояний регистра через промежутки времени. И таких четыре конечных автомата.
Или сложность в кодинге?
Да как раз таки в кодинге сложность...
Так тогда дело за малым! Начинайте с одной кнопки, одного регистра и 5 светодиодов(потом просто будет размножить), и осилим.
Нажатие на кнопку и зажигание светодиода работает ?
План работ по кодингу:
1. Нажатие кнопки. Результат: Зажигаем светодиод (можно встроенный)
2. +74hc595 Результат: Зажигаем светодиод через 74hc595.
3. +светодиоды через промежуток времени (читаем про состояние конечного автомата и millis() )
4. Расширяемся до четырех регистров
На каком этапе сейчас?
Ну это пример того в каком направлении надо двигаться Полный скетч здесь https://yadi.sk/d/HiLIliNi3GM3zE
Головной для интереса смотрите.
/*wire_74HC595.ino */ #include "wire_74HC595.h" const byte latchPin = 8 ; //Пин подключен к ST_CP входу 74HC595 const byte clockPin = 12 ; //Пин подключен к SH_CP входу 74HC595 const byte dataPin = 11 ; //Пин подключен к DS входу 74HC595 wire_74HC595 Out1(latchPin, clockPin, dataPin, 2); // подключить две 74HC595 последовательно #include "Cl_led.h" Cl_led LED[] = { Cl_led(&Out1, 1, // подключить на шину Out1 1 горит 1, 0), // 1 74HC595 в разряд D0 светодиод Cl_led(&Out1, 1, // подключить на шину Out1 1 горит 1, 3), // 1 74HC595 в разряд D3 светодиод Cl_led(&Out1, 1, // подключить на шину Out1 1 горит 2, 0), // 2 74HC595 в разряд D0 светодиод Cl_led(&Out1, 1, // подключить на шину Out1 1 горит 2, 3) // 2 74HC595 в разряд D3 светодиод }; void setup() { Out1.setup(); for (int i = 0; i < 4; i++)LED[i].setup(); LED[0].blink(1000);// первый светодиод 1 сек горит 1 сек нет LED[3].blink(200);// червертый светодиод 0.2 сек горит 0.2 сек нет } void loop() { for (int i = 0; i < 4; i++)LED[i].loop(); }Сдается мне, господа, что мы имеем дело с очередным студентом осчастливившим нас своей курсовой в надежде чужим кодом разжится. Не, не так?
Сдается мне, господа, что мы имеем дело с очередным студентом осчастливившим нас своей курсовой в надежде чужим кодом разжится. Не, не так?
Скорее всего. Но наличие кода не означает, что в нем не огрехов, что вы в нем разбираетсь, что вы (много раз) , что вы в конце его сдадите.
Сдается мне, господа, что мы имеем дело с очередным студентом осчастливившим нас своей курсовой в надежде чужим кодом разжится. Не, не так?
Ну... это же не значит, что не нужно давать человеку шанс на обретение знаний методом прохождения своего задания :)
Дело в том что при подключении к сети у меня загораются все 5 светодиодов ОДНОВРЕМЕННО!!! Нажимаю на кнопку он выключается и обратно включается, а должно загореться светодиоды только после нажатия на кнопку и то по очереди!!!
int clockPin = 13; int dataPin = 12; int latchPin = 10; int button = 7; void setup() { pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(7, INPUT); } void loop() { if(digitalRead(7)==LOW) { for (int i=0; i<256; i++) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, i); digitalWrite(latchPin, HIGH); } } }Дело в том что при подключении к сети у меня загораются все 5 светодиодов ОДНОВРЕМЕННО!!!
Внимательно смотрим на свою схему включения и вспоминаем что "... в момент подачи питания на выходах могут быть сучайные состояния..." (как написано в статье по ссылке про сдвиговый регистр). Ну или на старте обнуляем и забываем.
"..По очереди.." - так заполняйте регистр единицами побитно, а не гоните от 0 до 256. И про паузы не забудьте.
Про разницу "после нажатия кнопки должны загореться" и "пока кнопка нажата загораются", тоже уже пора подумать. Например "вспомнить" про флаг состояния кнопки.
Дело в том что при подключении к сети у меня загораются все 5 светодиодов ОДНОВРЕМЕННО!!! Нажимаю на кнопку он выключается и обратно включается, а должно загореться светодиоды только после нажатия на кнопку и то по очереди!!!
Я говорю, что так не "взлетит". Мой полный скетч здесь. Проверил. Работает. https://yadi.sk/d/WaW7iUgj3GPUvp
/*Wire_74HC595.ino */ const int Latch_pin = 3; const int CLK_pin = 4; const int Data_pin = 2; const int max_device = 4; bool stat = 0; #include "Out_74HC595.h" Out_74HC595 Out(Latch_pin, CLK_pin, Data_pin, max_device); #include "Cl_led.h" Cl_led led[] = { Cl_led(&Out, 0, 1, 0), // шина-Out,1 горит,1-я 74HC595,D1 Cl_led(&Out, 0, 1, 1), // шина-Out,1 горит,1-я 74HC595,D2 Cl_led(&Out, 0, 1, 2), // шина-Out,1 горит,1-я 74HC595,D3 Cl_led(&Out, 0, 1, 3) // шина-Out,1 горит,1-я 74HC595,D4 }; void setup() { Out.setup(); for (byte i = 0; i < 4; i++) led[i].setup(); led[0].blink(100); led[1].blink(150); led[2].blink(500); led[3].blink(1000); } void loop() { for (byte i = 0; i < 4; i++) led[i].loop(); }Мышы плакали, кололись, но все равно пытались запустить "кактус" в Космос.
Я говорю, что так не "взлетит". Мой полный скетч здесь. Проверил. Работает. https://yadi.sk/d/WaW7iUgj3GPUvp
Мне если честно непонятен ваш код, копирую в ардуино скетч не работает, дополнительные файлы это просто пояснение? или их надо в код добавить?
Мне если честно непонятен ваш код, копирую в ардуино скетч не работает, дополнительные файлы это просто пояснение? или их надо в код добавить?
Берите весь его архив с яндекса, а не только тот кусок кода, что он на форуме показал. Тогда заработает.
Я поэтому сказал, что вы не справитесь с заданием . Если делать код в одном файле, то мало того, что он будет глючным,в котором искать будет сложно. Вот поэтому я и разделил код на части и файлы. Просто сделал драйвер каскада сдвиговых регистров(в программе поствил 4 штуки последовательно), к которым подключил драйвера светодиодов повешенных на выводы светодиодов. (Их тоже 4, хотя можно повесить 4х8=32 штуки). Теперь их можно программно включать, выключать, мигать (последнее сделано в демонстрационой программе). Осталось организовать драйвера кнопок и метод задержки вкл светодиодов и ваша задача решена.
ПС: А что бы еще больше смутить ТС то выложу такой же код, но с подлючеными кнопками. Полный скетч здесь https://yadi.sk/d/QyATemkW3GW8P6
Головной сюда. Не выкладываю все файлы, так как новичкам еще сложнее их собрать в пакет
:)
/* class_Led_v3.ino #1 светодиоды на шину из 4-х 74HC595 ->3,4,2 Latch_pin(3)->12 D0-> 15 D4->4 CLK_pin (4)->11 D1-> 1 D5->5 Data_pin (2)->14 D2-> 2 D6->6 +5V ->10,16 D3-> 3 D7->7 GND ->8,13 9 -> на 14 след микросхемы #2 кнопка 1 -> 8 вкл все светодиоды #3 кнопка 2 -> 9 выкл все светодиоды #4 кнопка 3 -> 10 все светодиоды мигают с разной частотой */ // #1 светодиоды const int Latch_pin = 3; const int CLK_pin = 4; const int Data_pin = 2; const int max_device = 4; #include "Out_74HC595.h" Out_74HC595 Out(Latch_pin, CLK_pin, Data_pin, max_device); #include "Cl_led.h" Cl_led * Led[] = { new Cl_led(&Out, 0, 1, 0), // шина-Out,1 горит,1-я 74HC595,D0 new Cl_led(&Out, 0, 1, 1), // шина-Out,1 горит,1-я 74HC595,D1 new Cl_led(&Out, 0, 1, 2), // шина-Out,1 горит,1-я 74HC595,D2 new Cl_led(&Out, 0, 1, 3) // шина-Out,1 горит,1-я 74HC595,D3 }; // #2 кнопка #include "Cl_digitalIn.h" Cl_digitalIn In[] = { Cl_digitalIn(8), // сделать вывод 8 входом Cl_digitalIn(9), // сделать вывод 9 входом Cl_digitalIn(10) // сделать вывод 10 входом }; #include "Cl_do_btn.h" void Do_Btn1() { for (byte i = 0; i < 4; i++) { Led[i]->ON(); } } void Do_Btn2() { for (byte i = 0; i < 4; i++) { Led[i]->OFF(); } } void Do_Btn3() { Led[0]->blink(100); // мигать 0.1сек горит 0.1сек нет Led[1]->blink(150); // мигать 0.15сек горит 0.15сек нет Led[2]->blink(500); // мигать 0.5сек горит 0.5сек нет Led[3]->blink(1000); // мигать 1сек горит 1сек нет } Cl_do_btn * Btn[] = { new Cl_do_btn(&In[0], 0, // шина, уровень при наж кнопки & Do_Btn1 ), // какую функцию надо сделать new Cl_do_btn(&In[1], 0, // шина, уровень при наж кнопки & Do_Btn2 ), // какую функцию надо сделать new Cl_do_btn(&In[2], 0, // шина, уровень при наж кнопки & Do_Btn3 ) // какую функцию надо сделать }; void setup() { Out.setup(); for (byte i = 0; i < 4; i++) Led[i]->setup(); for (byte i = 0; i < 3; i++) Btn[i]->setup(); } void loop() { for (byte i = 0; i < 4; i++) Led[i]->loop(); for (byte i = 0; i < 3; i++) Btn[i]->loop(); }Мне если честно непонятен ваш код, копирую в ардуино скетч не работает, дополнительные файлы это просто пояснение? или их надо в код добавить?
Понижаем уровень. А такой код тебе будет понятен?
class MyButton { uint8_t _buttonPin; uint8_t State = 0; uint8_t lastButtonState = HIGH; unsigned long lastDebounceTime = 0; public: MyButton(uint8_t pin) { _buttonPin = pin; pinMode(_buttonPin, INPUT_PULLUP); } byte Read(void) { uint8_t reading = digitalRead(_buttonPin); if (State == 0 && reading == !lastButtonState) { lastDebounceTime = millis(); State = 1; } else if (State == 1 && reading == LOW && lastButtonState == LOW && (millis() - lastDebounceTime) > 5) { State = 0; return 1; } lastButtonState = reading; return 0; } }; MyButton button_1(4); int disp1 = 0; #define dataPin 12 //Общий дата пин для всех 74hc595 #define clockPin 13 //Общий слок пин для всех 74hc595 #define latchPin_1 11 //для каждого 74hc595 свой латч пин void setup() { pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(latchPin_1, OUTPUT); reg_clear(latchPin_1); } void reg_clear(uint8_t latchPin) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0); digitalWrite(latchPin, HIGH); } void reg_set(uint8_t latchPin) { digitalWrite(latchPin_1, LOW); digitalWrite(dataPin, 1); digitalWrite(clockPin, HIGH); digitalWrite(clockPin, LOW); digitalWrite(latchPin_1, HIGH); } void loop() { static unsigned long Time1 = 0; if (button_1.Read() && disp1 == 0) disp1 = 6; if (disp1 > 0 && millis() - Time1 > 1000) { Time1 = millis(); reg_set(latchPin_1); disp1--; if (disp1 == 0) { reg_clear(latchPin_1); } } }И в силах ли ты его расширить под свое количество регистров?