Close

Posuvný registr 74HC595 pomoc

Úvodní stránka Fórum Vaše projekty Arduino Posuvný registr 74HC595 pomoc

Aktuálně je na stránce zobrazeno 5 příspěvků - 1. až 5. (celkem z 5)
  • Autor
    Příspěvky
  • #11206
    Jindra
    Účastník

    Dobrý den,

    chtěl bych Vás poprosit o radu.
    Mám posuvný registr 74HC595 připojen k Arduinu mega. K registru 8x led a výsledný prográmek by měl dělat asi tohle.
    Ještě na úvod píšu že dělá, ale mám vnitřní pocit, že jsem to vyřešil příliš složitě.
    Po splnění podmínky se postupně rozesvítí ledky po určitém času (v řádech ms) a jako poslední krok bude, že svítí všechny a už neshasnou dokut podmínka, která uvedla tuto funkci v činnost nebude false.

    dodávám funkční kód, ale jak píši asi není uplně správný.

    int latchPin = 3;
    int clockPin = 4;
    int dataPin = 2;
    
    byte data[] =
    {
      B10000000,
      B11000000,
      B11100000,
      B11110000,
      B11111000,
      B11111100,
      B11111110,
      B11111111,
    };
    
    byte data2[1] =
    
    {
      B11111111,
    };
    
    void setup() {
    
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
    }
    
    void loop() {
    
      for (int index = 0; index<10; index++)
      {
    
        digitalWrite(latchPin, LOW);
    
        shiftOut(dataPin, clockPin, MSBFIRST, data[index]);
    
        if (index > 6)  {
    
          shiftOut(dataPin, clockPin, MSBFIRST, data[7]);
          
          index = 7;
          }
    
        digitalWrite(latchPin, HIGH);
    
        delay(200);
    
      }
    
    }

    Na konec se ještě zeptám. Nemůžu řešit časování delay(200);, protože nemůžu zastavit program. Šlo by to řešit millis();? A jak by to asi mělo vypadat?
    Předem děkuji všem za odpovědi.

    Začátečník Jindra 🙂

    EDIT: Ano vím, že nekteré části kodu tam být nemus, viz pole data2. Je to ale rozpracovaná verze, kde se už s polem data2 počítá.

    #11227
    RomanB
    Účastník

    Funkce delay(200) tam je proto, protože void loop() je stále se opakující smyčka. Když se postupně rozsvítí všechny ledky, pak se čeká 200 ms a ledky se začnou znova rozsvěcet. Vůbec tam nemusí být.

    Pro podmínku použij if (podminka==1 && index<7){a tady dej rutinu pro zobrazení}
    else (podminka==0) {rutina pro zobrazení,ale s data2[1]
    =B00000000 aby ti to zhaslo}

    #11233
    Jindra
    Účastník

    Pokud tam nebude funkce delay() tak ty ledky blikaji tak rychle, ze to oko ani nezaregistruje. Myslel jsem ze loop() za jedno kolo odela posun na registru o jeden byt. To znamena ze za jedno kolo s funkci delay() rosviti jednu ledku podle pole data[] a pak prave ceka 200ms. Slo by to vyresit millis()?

    EDIT: ne byt, ale bit

    #11237
    RomanB
    Účastník
    
    int latchPin = 4;
    int clockPin = 5;
    int dataPin = 6;
    int vstup = 7;   //pridal jsem si vstup jako podminku
    
    int index=0;
    
    byte data[] =
    {
      B10000000,
      B11000000,
      B11100000,
      B11110000,
      B11111000,
      B11111100,
      B11111110,
      B11111111,
    };
    
    byte data2[1] =
    
    {
      B11111111,
    };
    
    unsigned long staryMillis = 0;        
    
    const long interval = 800;
    
    unsigned long novyMillis = millis();
    
    void setup() {
      
      Serial.begin(9600);
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
      pinMode(vstup, INPUT_PULLUP);
      
    }
    
    void loop() {
      
      
    boolean podminka = digitalRead(vstup);  
    
    //**********************************************************************  
    
     unsigned long novyMillis = millis();
     
      if (novyMillis - staryMillis >= interval && podminka==0) {
       
          staryMillis = novyMillis; 
    
           
          digitalWrite(latchPin, LOW);
    
          shiftOut(dataPin, clockPin, MSBFIRST, data[index]);
          
          if (index > 6)  { shiftOut(dataPin, clockPin, MSBFIRST, data[7]); index = 7;  }
        
          digitalWrite(latchPin, HIGH);
          
     Serial.println(index);   
     //Serial.println(staryMillis);
     //Serial.println(novyMillis);
     
          index=index+1;
     
    }
    //**********************************************************************
     if (novyMillis - staryMillis >= interval && podminka==1) {
       
          staryMillis = novyMillis; 
          
          index = 0;
          
          digitalWrite(latchPin, LOW);
          
          shiftOut(dataPin, clockPin, MSBFIRST, data2[index]);
          
           
     Serial.println(index);   
     //Serial.println(staryMillis);
     //Serial.println(novyMillis);
    
    }
    //********************************************************************** 
     
    }//konec smycky

    Vyzkoušej toto. Jako podmínku jsem použil tlačítko: 0 je stlačeno.

    #11297
    posjirka
    Účastník

    ona je opravdu otázka jak to je zapojeno …. ať tady nehoníte duchy 🙂
    ps. omezil bych ty 2 pole za 1 hodnotu BYTE se smyčkou FOR pro naplnění log.1/0

Aktuálně je na stránce zobrazeno 5 příspěvků - 1. až 5. (celkem z 5)
  • Pro reakci na toto téma se musíte přihlásit.