Сдвиговый регистр

azamat alimkhan
Offline
Зарегистрирован: 17.02.2016

Добрый день! Хочу собрать стенд при помощи сдвигового регистра 74hc595. Суть в том что при нажатии на кнопку сработал регистр и поочередно зажег 5 светодиодов с интервалом несколько секунд.. Таких кнопок у меня 4... И 20 светодиодов...если у кого то есть готовый скетч скиньте пожалуйста

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Такой скетч вы ниасилите. Даже если тут будет скинут.

T.Rook
Offline
Зарегистрирован: 05.03.2016

azamat alimkhan: Готового под такую специфическую задачку нет. Так а в чем сложность то?

Алгоритмически вроде все просто: Одна кнопка, одно событие нажатия, потом  6 состояний регистра через промежутки времени. И таких четыре конечных автомата.

Или сложность в кодинге?

 

 

azamat alimkhan
Offline
Зарегистрирован: 17.02.2016

Да как раз таки в кодинге сложность...

T.Rook
Offline
Зарегистрирован: 05.03.2016

azamat alimkhan пишет:
Да как раз таки в кодинге сложность...

Так тогда дело за малым! Начинайте с одной кнопки, одного регистра и 5 светодиодов(потом просто будет размножить), и осилим.

Нажатие на кнопку и зажигание светодиода  работает ?

T.Rook
Offline
Зарегистрирован: 05.03.2016

azamat alimkhan пишет:
Да как раз таки в кодинге сложность...

План работ по кодингу:

1. Нажатие кнопки. Результат: Зажигаем светодиод (можно встроенный)

2. +74hc595   Результат: Зажигаем светодиод через 74hc595.

3. +светодиоды через промежуток времени (читаем про состояние конечного автомата и millis() )

4. Расширяемся до четырех регистров

На каком этапе сейчас?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну это пример того в каком направлении надо двигаться Полный скетч здесь 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();
}

 

Logik
Offline
Зарегистрирован: 05.08.2014

Сдается мне, господа, что мы имеем дело с очередным студентом осчастливившим нас своей курсовой в надежде чужим кодом разжится. Не, не так?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Logik пишет:

Сдается мне, господа, что мы имеем дело с очередным студентом осчастливившим нас своей курсовой в надежде чужим кодом разжится. Не, не так?

Скорее всего. Но наличие кода не означает, что в нем не огрехов, что вы в нем разбираетсь, что вы (много раз)  , что вы в конце его сдадите.

T.Rook
Offline
Зарегистрирован: 05.03.2016

Logik пишет:

Сдается мне, господа, что мы имеем дело с очередным студентом осчастливившим нас своей курсовой в надежде чужим кодом разжится. Не, не так?

Ну... это же не значит, что не нужно давать человеку  шанс на обретение знаний методом прохождения своего задания  :)

azamat alimkhan
Offline
Зарегистрирован: 17.02.2016

Дело в том что при подключении к сети у меня загораются все 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);
  }
 }
}

 

TRook
Offline
Зарегистрирован: 27.03.2017

azamat alimkhan пишет:

Дело в том что при подключении к сети у меня загораются все 5 светодиодов ОДНОВРЕМЕННО!!!

Внимательно смотрим на свою схему включения и вспоминаем что "... в момент подачи питания на выходах могут быть сучайные состояния..." (как написано в статье по ссылке про сдвиговый регистр). Ну или на старте обнуляем и забываем.

"..По очереди.." - так заполняйте регистр единицами побитно, а не гоните от 0 до 256. И про паузы не забудьте.

Про разницу "после нажатия кнопки должны загореться" и "пока кнопка нажата загораются", тоже уже пора подумать. Например "вспомнить" про флаг состояния кнопки.

 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

azamat alimkhan пишет:

Дело в том что при подключении к сети у меня загораются все 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();
}

 

azamat alimkhan
Offline
Зарегистрирован: 17.02.2016

Мышы плакали, кололись, но все равно пытались запустить "кактус" в Космос. 

Я говорю, что так не "взлетит". Мой полный скетч здесь. Проверил. Работает. https://yadi.sk/d/WaW7iUgj3GPUvp

 

Мне если честно непонятен ваш код, копирую в ардуино скетч не работает, дополнительные файлы это просто пояснение? или их надо в код добавить?

JasKo
Offline
Зарегистрирован: 21.11.2015

azamat alimkhan пишет:

Мне если честно непонятен ваш код, копирую в ардуино скетч не работает, дополнительные файлы это просто пояснение? или их надо в код добавить?

Берите весь его архив с яндекса, а не только  тот кусок кода, что он на форуме показал. Тогда заработает.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

azamat alimkhan пишет:
Мне если честно непонятен ваш код, копирую в ардуино скетч не работает, дополнительные файлы это просто пояснение? или их надо в код добавить?

Я поэтому сказал, что вы не справитесь с заданием . Если делать код в одном файле, то мало того, что он будет глючным,в котором искать будет сложно. Вот поэтому я и разделил код на части и файлы. Просто сделал драйвер каскада сдвиговых регистров(в программе поствил 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();
}

 

JasKo
Offline
Зарегистрирован: 21.11.2015

azamat alimkhan пишет:

Мне если честно непонятен ваш код, копирую в ардуино скетч не работает, дополнительные файлы это просто пояснение? или их надо в код добавить?

Понижаем уровень. А такой код тебе будет понятен?

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);
    }
  }
}

И в силах ли ты его расширить под свое количество регистров?