jednoduchý kód

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: jednoduchý kód

Příspěvek od pavel1tu » 22 črc 2019, 12:06

Jasný,

tohle řeším na kroužku každý den ....
každý píše jiným stylem, někdo čistě, jiný co nejvíce knihoven, někdo v kuse, jiný milion funkcí - a já v tom hledám chyby.

Potřeboval bych aby program šel nějakým debugerem krokovat ...
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: jednoduchý kód

Příspěvek od AstroMiK » 22 črc 2019, 22:33

Taky přidávám jedno řešení.

V principu to bude asi podobné, jako má Gilhad, akorát já nepoužívám millis().
Program mi běží v docela rychlé hlavní smyčce (100x za sekundu).
To už bez problémů stačí na testování tlačítek, aniž by byl uživatel nějak omezován tím, že musí tlačítko držet nějakou delší dobu.

Program pak už jen při stisku nějakého tlačítka sepne výstupy a aktivuje příslušné čítače smyček.
Zároveň právě použité tlačítko zablokuje do doby, než se stiskne tlačítko opačné.
Když některý z čítačů smyček doběhne do požadovaného času, odpovídající výstup se vypne.

Mimochodem, zadání není úplně přesné, takže se nám programy chovají trochu odlišně (jde o to, kdy se mají tlačítka odblokovat)

Kód: Vybrat vše



//  prirazeni pinu 
#define pin_tlacitko1   5            // pin pro 1. tlacitko
#define pin_tlacitko2   6            // pin pro 2. tlacitko

#define pin_vystup1     8            // vystup, ktery sepne 1. tlacitkem na 5 sekund
#define pin_vystup2     9            // vystup, ktery sepne 1. tlacitkem na 10 sekund
#define pin_vystup3    10            // vystup, ktery sepne 2. tlacitkem na 15 sekund
#define pin_vystup4    11            // vystup, ktery sepne 2. tlacitkem na 20 sekund



//  globalni promenne
byte posledni_stisknute = 0;         // znacka, ktere tlacitko bylo stisknute jako posledni, aby samo sebe mohlo zablokovat (na zacatku jsou obe tlacitka odblokovana)

boolean aktivni_1 = false;           // znacka, jesli prave bezi casovac, ktery se startuje 1. tlacitkem
unsigned int citac_1;                // pocitadlo smycek po stisku prvniho tlacitka (kazda smycka trva 0,01s)

boolean aktivni_2 = false;           // znacka, jesli prave bezi casovac, ktery se startuje 2. tlacitkem
unsigned int citac_2;                // pocitadlo smycek po stisku druheho tlacitka (kazda smycka trva 0,01s)




void setup(void)
  {
    pinMode(pin_tlacitko1, INPUT_PULLUP);      // u tlacitek predpokladam, ze spinaji proti GND
    pinMode(pin_tlacitko2, INPUT_PULLUP);

    pinMode(pin_vystup1, OUTPUT);
    pinMode(pin_vystup2, OUTPUT);
    pinMode(pin_vystup3, OUTPUT);
    pinMode(pin_vystup4, OUTPUT);
  }



void loop(void)
  {

    // ---------------  obsluha 1. tlacitka ----------------------------
    if (digitalRead(pin_tlacitko1) == LOW and posledni_stisknute != 1)      // bylo stisknute prvni tlacitko
      {                                                                     //  prvni tlacitko muze byt stisknute jen v pripade, ze nebylo stisknute jako posledni
        posledni_stisknute = 1;                // prvni tlacitko bude od ted zablokovane (druhe se odblokuje)
        aktivni_1 = true;                      // nastaveni znacky, ze probiha odpocet 1. casovace
        citac_1 = 0;                           // po stisku tlacitka se vynuluje 1. citac
        digitalWrite(pin_vystup1, HIGH);       // a sepnou se prvni dva vystupy
        digitalWrite(pin_vystup2, HIGH);
      }


    if (aktivni_1 == true)                      // kdyz je aktivni 1. casovac
      {
        citac_1 ++;                             //  zacnou se pocitat smycky
        if (citac_1 == 500)                     // po 5 sekundach se vypne 1. vystup
          {
            digitalWrite(pin_vystup1, LOW);
          }

        if (citac_1 == 1000)                   // po 10 sekundach se vypne druhy vystup
          {
            digitalWrite(pin_vystup2, LOW);
            aktivni_1 = false;                 //  a prvni casovac se deaktivuje
          }
      }
    // -----------------------------------------------------------------    


    // ---------------  obsluha 2. tlacitka ----------------------------
    if (digitalRead(pin_tlacitko2) == LOW and posledni_stisknute != 2)      // prave bylo stisknute druhe tlacitko
      {                                                                     //  druhe tlacitko muze byt stisknute jen v pripade, ze nebylo stisknute jako posledni
        posledni_stisknute = 2;                // druhe tlacitko bude od ted zablokovane (prvni se odblokuje)
        aktivni_2 = true;                      // nastaveni znacky, ze probiha odpocet 2. casovace
        citac_2 = 0;                           // po stisku tlacitka se vynuluje 2. citac
        digitalWrite(pin_vystup3, HIGH);       // a sepnou se druhe dva vystupy
        digitalWrite(pin_vystup4, HIGH);
      }


    if (aktivni_2 == true)                      // kdyz je aktivni 2. casovac
      {
        citac_2 ++;                             //  zacnou se pocitat smycky
        if (citac_2 == 1500)                    // po 15 sekundach se vypne 3. vystup
          {
            digitalWrite(pin_vystup3, LOW);
          }

        if (citac_2 == 2000)                    // po 20 sekundach se vypne 4. vystup
          {
            digitalWrite(pin_vystup4, LOW);
            aktivni_2 = false;                  //  a druhy casovac se deaktivuje
          }
      }
    // -----------------------------------------------------------------    

    delay(10);          //   kazda smycka trva 10ms (tech par predchozich prikazu ma v tomto pripade zanedbatelny vliv na rychlost)
  }


Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: jednoduchý kód

Příspěvek od gilhad » 23 črc 2019, 03:13

Ano, u tebe například lze rychlým střídavým klikáním udržet všechny diody svítící naráz neomezeně dlouho :)
(A samozřejmě je většinu doby MCU zablokované, což zde nevadí, ale při rozšiřování se ti jednak začne rozcházet čas, jednak kratší pulzy mohou být náhodně ignorovány. )

Woyta
Příspěvky: 16
Registrován: 17 črc 2019, 17:04
Reputation: 0

Re: jednoduchý kód

Příspěvek od Woyta » 23 črc 2019, 13:50

Milis() má výhodu že to je jednoduchý příkaz čtoucí čas z hlavního timeru arduina. Měl by čítat asi do 50dni než se překlopí.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: jednoduchý kód

Příspěvek od gilhad » 23 črc 2019, 18:52

A pokud se to pouzije vyse zminenym zpusobem, tak ani to preklopeni nevadi, jen neni mozno (takto primitivne) merit intervaly delsi nez tech asi 50 dni :)

Ale spustit to 49. den s intervalem na 3 dny neni problem, i kdyz to mezitim pretece.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 11 hostů