Zrychlení přičítání při držení tlačítka
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.
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.
Zrychlení přičítání při držení tlačítka
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
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
Re: Zrychlení přičítání při držení tlačítka
Co třeba takhle
po 250ms bude čítat 2x rychleji, po 500ms 5xrychleji
Ber to jen jako inspiraci pro vlastní konstrukci.
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);
}
Ber to jen jako inspiraci pro vlastní konstrukci.
Re: Zrychlení přičítání při držení tlačítka
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í.
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;
}
}
Re: Zrychlení přičítání při držení tlačítka
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.
Pokud se neobnovuje zobrazení, tak ho do toho while vlož, třeba místo toho delay.
Re: Zrychlení přičítání při držení tlačítka
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áš
- Přílohy
-
- countdown_timer.ino
- (2.68 KiB) Staženo 135 x
Re: Zrychlení přičítání při držení tlačítka
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;
}
}
}
}
Re: Zrychlení přičítání při držení tlačítka
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:
Teď vše funguje jak má Každopádně díky za pomoc, cením si toho.
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);
}
}
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 27 hostů