Zrychlení přičítání při držení tlačítka

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
Grymo
Příspěvky: 6
Registrován: 05 lis 2019, 22:53
Reputation: 0

Zrychlení přičítání při držení tlačítka

Příspěvek od Grymo » 20 úno 2020, 17:38

Ahoj,
potřeboval bych pomoct s kódem, mám jedno tlačítko, když ho podržím chci aby se na počítadle přičítaly čísla (vždy jednička) a čím déle budu tlačítko držet tím rychleji se budou čísla přičítat. Potřebuji to dát do kódu kde se neustále obnovuje segmentový display. Takže to bude asi pomocí funkce millis(). Ale nevím jak to udělat. Pomůžete mi s tím prosím?
Díky :D

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Zrychlení přičítání při držení tlačítka

Příspěvek od ondraN » 21 úno 2020, 06:53

Co třeba takhle

Kód: Vybrat vše

  const byte Tlacitko=2;
  unsigned long int Time=0;
  int Counter=0;
  Time=millis();
  while(digitalRead(Tlacitko)==LOW){
   Counter++;	// kazdych 10ms se zvysi pocitadlo o 1
   if(millis()-Time >250){	// od 250 ms se kazdy cyklus zvysi o 2
    Counter++; 
   }
   if(millis()-Time >500){
    Counter=Counter+3; 	//od 500ms se kazdy cyklus zvysi o 5
   }    
  if(Counter>=32000){	//pri dosazeni maxima se cyklus prerusi
    break;
  }
  delay(10);
 }
po 250ms bude čítat 2x rychleji, po 500ms 5xrychleji
Ber to jen jako inspiraci pro vlastní konstrukci.

Grymo
Příspěvky: 6
Registrován: 05 lis 2019, 22:53
Reputation: 0

Re: Zrychlení přičítání při držení tlačítka

Příspěvek od Grymo » 21 úno 2020, 11:44

Ahoj,
díky za odpověď. Používáš tam cyklus while, při tom se program uzavře v tomto cyklu a dislplay se neobnovuje. Šlo by to nějak nahradit jenom podmínkou? A taky jsi použil delay(), který v tomto typu kódu být nesmí. Přikládám část mého kódu, kde zatím není žádné zrychlování.

Kód: Vybrat vše

unsigned long startMillis; 
unsigned long currentMillis;
const unsigned long buttonDelay = 250;
int timer = 0;

currentMillis = millis();
if (digitalRead(A2) == LOW) {
  if (currentMillis - startMillis >= buttonDelay) {
    timer ++;
    startMillis = currentMillis;
    }
  }

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Zrychlení přičítání při držení tlačítka

Příspěvek od ondraN » 21 úno 2020, 12:16

Co kdyby si dal ten kód celý? Z nějakých fragmentů se těžko odhaduje, jak to napsat. Zrychlování čítání lze napsat mnoha způsoby a hodně záleží na celkovém kontextu.
Pokud se neobnovuje zobrazení, tak ho do toho while vlož, třeba místo toho delay.

Grymo
Příspěvky: 6
Registrován: 05 lis 2019, 22:53
Reputation: 0

Re: Zrychlení přičítání při držení tlačítka

Příspěvek od Grymo » 21 úno 2020, 18:43

Dobře přikládám celý soubor. Prvním tlačítkem se přičítá čas, druhým odčítá a třetím se spustí odpočet. Stisknutím všech tří zároveň se odpočet přeruší. Snad se v tom nějak vyznáš :D
Přílohy
countdown_timer.ino
(2.68 KiB) Staženo 134 x

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Zrychlení přičítání při držení tlačítka

Příspěvek od ondraN » 23 úno 2020, 08:52

Tady máš upravený ten kód pro čítání nahoru. S velikostí TDelay si musíš pohrát, protože nevím, jak velkou prodlevu způsobí funkce zápisu na displej. Ostatní části programu zkus upravit sám.

Kód: Vybrat vše

  if (countdown == false) {
    unsigned long int Time=millis();
    byte TDelay=20;
    while((digitalRead(A1) == LOW)&&(digitalRead(A2) == HIGH) ){
      timer++;
      if (timer > 9999) {
        timer = 9999;
      }
      WriteNumberToDisplay(timer);
      delay(TDelay);
      if((millis()-Time)>500){
        TDelay=10;
        if((millis()-Time)>1000){
          TDelay=5;
          if((millis()-Time)>2000){
            TDelay=1;
          }
        }
      }      
    }

Grymo
Příspěvky: 6
Registrován: 05 lis 2019, 22:53
Reputation: 0

Re: Zrychlení přičítání při držení tlačítka

Příspěvek od Grymo » 23 úno 2020, 15:50

Toto mi taky nefungovalo :( Když jsem dal dal ten delay víc než 20, display problikávál a když byl menší než 50 stačilo se dotknout tlačítka a přičítání bylo až moc rychlé. Zapojil jsem všechny mozkové buňky a došel k tomuto:

Kód: Vybrat vše

if (countdown == false) {
    buttonDelay = 250;
    unsigned long pushTime = millis();
    while (digitalRead(A1) == LOW) {
      currentMillis = millis();
      if (currentMillis - startMillis >= buttonDelay) {
        timer ++;
        if (millis() - pushTime >= 1000) {
          buttonDelay = 150;
        }
        if (millis() - pushTime >= 2000) {
          buttonDelay = 50;
        }
        if (millis() - pushTime >= 4000) {
          buttonDelay = 5;
        }
        startMillis = currentMillis;
      }
      if (timer > 9999) {
        timer = 9999;
      }
      WriteNumberToDisplay(timer);
    }
}
Teď vše funguje jak má :) Každopádně díky za pomoc, cením si toho.

Odpovědět

Kdo je online

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