Close

Měření doby stisku tlačítka

Úvodní stránka Fórum Software Jazyky Jazyk Wiring Měření doby stisku tlačítka

  • Toto téma obsahuje celkem 2 odpovědi. Do diskuze (2 diskutující) se naposledy zapojil uživatel arduino a poslední změna proběhla před 7 roky a 5 měsíci.
Aktuálně jsou na stránce zobrazeny 3 příspěvky - 1. až 3. (celkem z 3)
  • Autor
    Příspěvky
  • #12076
    arduino
    Účastník

    Dobrý den,
    potřeboval bych poradit. Zkouším napsat program, kde se po stisknutí tlačítka začne měřit čas a pokud je stisknuto třeba 2 sekundy, tak se něco provede, třeba rozsvítí LED. Zkoušel jsem něco přes fci millis() ale zatím bezúspěšně. Neřešil někdo podobný problém, případně neuměl by mi někdo poradit? Děkuji za odpovědi.

    #12077
    posjirka
    Účastník

    pouzij funkci pulsein()
    https://www.arduino.cc/en/Reference/PulseIn

    má parametry :
    číslo pinu (1-xx)
    na jakou hodnotu reagovat (LOW / HIGH)
    a případně max. dobu čekání na konec pulzu v ms.

    takže např:

    `unsigned long delkaStisku = pulseIn(5, LOW, 500);‘

    ti do proměnné delkaStisku typu unsigned long zapíše dobu úrovně LOW na pinu 5.
    Max doba čekání je 0,5s (500ms). Je třeba si uvědomit, že na tu dobu se ovšem arduino „zastaví“ a čeká na konec pulzu. Stejně tak když na začátku této funkce bude pin 5 v log. 1 (HIGH) tak ti napíše „0“ a pokračuje dál….

    pomocí millis to jde řešit elegantnějí, záleží na přesnosti měření.
    Ve výsledku to jde pomocí millis řešit 3 způsoby:
    – ve smyčce loop() budeš při každém průchodu testovat zde je nebo není stisknuto tlačítko (zapíšeš do proměné „start“) a po změně stavu (po uvolnění tlačítka) si vyhodnotíš aktuální stav millis()-start . Ten rozdíl je doba stisku. Vše je ale závislé na čase potřebném k vykonání 1 smyčky. To je vlastně 1 krok/stupeń rozlišení měření.
    – druhá varinta je použít přerušení. Na nějákém pinu (defaultně je to tuším 2 a 3, ale dají se i přesunout na jiné piny) si nastavíš, že když se změní stav na tomto pinu tak si zapíšeš do proměnné opět strat (stisk) případně aktuální stav millis (uvolněno tl.) a do proměnné si zapíšeš rozdíl. Tady je přesnost na 1ms a dá se zvýšit i na 1us použitím funkce micros(). Reaguje okamžitě jen proměnná musí mít přívlastek violetile aby šla jeho hodnota použít i v hlavní smyčce.
    https://www.arduino.cc/en/Reference/Volatile
    – 3 varinata je vlastně kombinace. můžeš třeba pomocí časovače timer2 nastavit přerušení každé 2ms a otestovat si tvůj pin. … vše ostatní už jsem psal výše.

    Každé má svoje a je důležité podívat se na to jako na celek. Když totiž zabereš 1 funkci na něco (třeba časovač timer 2) už jí nemůžeš použít na neco jiného (servo, tone, SW serial, …). když použiješ hlavní smyčku (var.1) tak jí nesmíš dlouho ničím zdržovat, jinak si nakopáváš měření. Varinta 2 je zase omezena defaultně na max. 2 piny. ty se dají přesouvat, můžeš dokonce i zvětšit počet pinů na 16 (2 porty po 8 pinech), ale pak třídíš a hodnotíš každý pin zvláš´t…

    snad jsem pomohl

    #12086
    arduino
    Účastník

    děkuju moc za radu, půjdu to vyzkoušet 😉

Aktuálně jsou na stránce zobrazeny 3 příspěvky - 1. až 3. (celkem z 3)
  • Pro reakci na toto téma se musíte přihlásit.