Close

obsluha tlacitka v přerušení

Úvodní stránka Fórum Hardware Arduino obsluha tlacitka v přerušení

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

    Zdravím
    Mám v plánu si udělat barevnou hudbu s arduinen. Asi bych tam chtěl tři filtry a přes arduino pwmkem řídit led pásek. A napadlo mě, že bych si tam přidal nějaký blikání 😛 nezávislé na hudbě. Měl bych tam tři tlačítka. A jedním bych přepínal aby to bylo závislé na audiu a nebo aby to nějak blikalo. A pak dvě tlačítka na přepínání těch programu (nezávislé na audiu) jak by to melo blikat. Jak udělat to přepínání programů, přes switche a tlačítkama zvyšovat nebo snižovat čítač. No ale kdybych chtěl použít ty stejné tlačítka třeba na změnu rychlosti programu. Jak to udělat? Děkuji za návrhy a nápady.
    Jsme v tom začátečník

    #9763
    posjirka
    Účastník

    na tlačítka se vykašli. použij přepínač (on/off) pro přepínání zváslosti na hudbě/oscilátor a pak otočný přepínač (ideálně BCD) pro přepínání předvoleb. BCD znamená, že jednotlivé polohy jsou řešeny binárně takže má třeba 16 poloh ,ale jen 4 kontakty. Třeba teto:
    https://www.gme.cz/p-kdr10

    proč to udělat takto? ve smyčce loop() si nejdřív zjistíš, v jakém stavu je přepínač ovládání (hudba/oscilátor) a případně v jaké stavuje přepínač voleb (otočný) a podle toho dál pokračuješ ve smyčce.
    Tím máš zajištěno, že to tak bude i po vypnutí napájení, navíc nemusíš obsluhovat přerušení tlačítkem. Vše ostatní už je stejně shodne.

    #9766
    jpokorny12
    Účastník

    Super diky s tím spínačem mě to nenapadlo. Diky
    A jak bych vyřešil tu změnu rychlostí blikání. Kdybych měl tlačítka plus mínus a ty programy bych mel udělané přes delay , nebo to je blbost. Protože kdybych měl pomalou změnu barvy tak bych to tlačítko musel držet dlouho než by se ta rychlost změnila.diky

    #9767
    posjirka
    Účastník

    pro autonomní blikání )oscilátor) bych použil časovat timer1.
    tady je tutorial použití včetně knihovny:
    https://playground.arduino.cc/Code/Timer1

    hestli chceš jen nastavovat rychlost blikání tak bych použil místo otočného přepínače raděčji potenciometr. připojený na analogový vystup (v unu jich máš 6). Do pomocné proměnné třeba „oldPot“ by sis zavedl předchozí hodnotu potenciometru.
    V každé smyčce loop() bys zkonstroloval jestli nové nastavení se liší od starého (analogRead(A0) != oldPot) a pokud ano tak si přenastav časovat Timer1.
    Takže ve výsledku bys použil přepínač na volbu funkce (zvuk/automat) a potenciometr na nastavení rychlosti. U toho potenciometru jen pozor musíš to uědlat trochu hrubší krok, protože půspbí hodně prvků, které nastavení potenciometru ovlivňují (teplota okolí, stabilita referenčího napětí, odchylka LBA kroku, …).

    #9785
    play
    Účastník
    #define BUTTON_SELECT_MOD     2
    #define BUTTON_SPEED_NEXT      3
    #define BUTTON_SPEED_BACK      4
    
    #define MAX_SPEED_BLINK       10
    
    #define MODE_AUDIO            0
    #define MODE_BLINK            1
    
    bool BUTTON_SELECT_MOD_PRESSED = false;
    long int TIME_BUTTON = 0;
    
    //VHODNÉ ULOŽIT DO EEPROM
    int SELECT_MODE = MODE_AUDIO;
    int SPEED_BLINK = 0;
    //______________________
    
    void setup() {
      pinMode(BUTTON_SELECT_MOD, INPUT);
      pinMode(BUTTON_SPEED_NEXT, INPUT);
      pinMode(BUTTON_SPEED_BACK, INPUT);
    }
    
    void loop() {
      //___________PŘEPÍNÁNÍ AUDIO A BLIKÁNÍ_________[VYUŽITÍ I PRO ON/OFF]
      if (digitalRead(BUTTON_SELECT_MOD) == HIGH) {
        if (BUTTON_SELECT_MOD_PRESSED == false) {
          BUTTON_SELECT_MOD_PRESSED = true;
          if (SELECT_MODE == MODE_AUDIO) {
            SELECT_MODE = MODE_BLINK;
          } else {
            SELECT_MODE = MODE_AUDIO;
          }
        }
      } else {
        BUTTON_SELECT_MOD_PRESSED = false;
      }
      //____________________________________________
    
      if (SELECT_MODE == MODE_AUDIO) {
    
        //    KÓD KDYŽ JE AUDIO
    
      } else if (SELECT_MODE == MODE_BLINK) {
        //___________NASTAVENÍ RYCHLOSTI_________
        if (digitalRead(BUTTON_SPEED_NEXT) == HIGH or digitalRead(BUTTON_SPEED_BACK) == HIGH) {
          if (millis() >= TIME_BUTTON + 1000) {
            TIME_BUTTON = millis();
            if (digitalRead(BUTTON_SPEED_NEXT) == HIGH and SPEED_BLINK <= MAX_SPEED_BLINK) SPEED_BLINK++;
            if (digitalRead(BUTTON_SPEED_BACK) == HIGH and SPEED_BLINK >= 0) SPEED_BLINK--;
          }
        } else {
          TIME_BUTTON = millis() - 1000;
        }
        //_____________________________________
      }
    }
    #9810
    jpokorny12
    Účastník

    Díky moc
    Ale asi udělám variantu s přepínačem a s potenciometrem a s BCD přepínačem pro změnu programu blikání. Protože nevím, jak bych udělal v tom kodu dvě funkce pro jedno tlačítko. Díky

    #10251
    jpokorny12
    Účastník

    Zdravím
    Tak nějak jsem udělal schema a zkoušel jsem to. Ale když vystupy z filtru připojím na arduino, tak i když tam není žádný signál, tak pořád je tam hodnota kolem (400)? Nevadí, když ty filtry a OZ napájím jiným zdrojem (25V), ale společnou zem mají.
    Nevíte co s tím? Nebomám zkusit dát do cesty kondenzátor? Děkuji

    Tady je schema
    schema
    Schema

    #10255
    posjirka
    Účastník

    to musíš vědět ty. jestli tam ten signál je nebo neni …

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