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.
-
Grymo
- Příspěvky: 6
- Registrován: 05 lis 2019, 22:53
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

-
ondraN
- Příspěvky: 935
- Registrován: 08 srp 2019, 20:01
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
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: 935
- Registrován: 08 srp 2019, 20:01
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
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áš

-
Přílohy
-
- countdown_timer.ino
- (2.68 KiB) Staženo 165 x
-
ondraN
- Příspěvky: 935
- Registrován: 08 srp 2019, 20:01
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
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.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti