Mam problem z Arduino. Mam podpiętą klawiaturkę membranową i jak wyrzucam z programu jedną linijkę (dataZmien(); - pogrubiona 6 od dołu) to przestaje mi reagować na klawisze C i D. A i B działają jak działały. Zacząłem grzebać w sekcji void dataZmien() i jak całą zawartość wrzucę w komentarz (między /* i */) to nie działa C i D (A i B działa). Jak wrzucę określoną część to działa tylko D, jak wrzucę tylko kawałek to działa C i D. Ta sekcja uruchamiana jest tylko przy zmianie daty, więc normalnie nie jest wykonywana. Sam już nie wiem o co chodzi. Coś z pamięcią? Jak wywalam część sekcji to ładuje się w inne miejsca i nie działa?
if (key){ switch (key){ case 'A': //+15 min timer = timer +(15*60); break; case 'B': //-7 min timer = timer -(7*60); if (timer < 0) {timer = 0;} break; case '3': //start timera break; case 'C': //zmiana biegu if (bieg == 1) {bieg = 0;} else {bieg = 1;} break; case 'D': if (cykleAktywne == 1) {cykleAktywne = 0;} else {cykleAktywne = 1;} dataZmien(); break; default: break; } }
@Polanin: Wyjaśnię ci. Pytasz o funkcję dataZmien() której ciało znajduje się w innym miejscu. Pytasz o obsługę klawiatury, które to procedury znajduję się w innym miejscu. Problem twój polega na tym, że nie potrafisz nawet zilustrować pytania właściwym fragmentem kodu(o sam kod pokazany tutaj już nie będę się czepiał).
@Portier-Harry_Portier: jakie ma znaczenia co jest w zmienData() jeśli nie jest wykonywany? Obsługa klawiatury dziala i leci na standardowej bibliotece.
czyli "A", jak sama nazwa wskazuje "case 'A': //+15 min" dodaje 26 minut do timera, "B", "case 'B': //-7 min" odejmuje od timera ok. 12.5 minuty (jak sama nazwa wskazuje), "3" startuje timer (czyli nie robi nic). Działają jak działały, czyli nie tak jak powinny. Zmienne boolean (sądząc po wartościach) "bieg" i "cykleAktywne" są negowane warunkiem, zamiast po prostu "bieg=!bieg". Tyle
@JohnReese: To nie tam siedzi. Pogrzebałem wycinając kawałki kodu i doszedłem, ze coś jest nie tak z linijką (wyświetla timer hh:mm:ss): sprintf(str, "%02ld:%02d:%02d", h, m, s); Ta linijka siedzi w innej funkcji, do której datazmien się nie odwołuje. Jeszcze nie ogarnąłem całkiem o co chodzi, szczególnie, że mało wiem o sprintf. Jak je przytnę do sprintf(str, "%02d:%02d", h, m); to działa. Jak zrobię sprintf(str, "%02:%02d:%02d", h, m, s); to wyrzuca krzaczki
@Polanin: Nie mam teraz za bardzo czasu by sie tym doglebnie zajmowac ale wedlug mnie problemem lezy gdzies tu:
lcd.print(str); lcd.println("A+15,B-7,3=RUN");
Nie wiem jak ten ekranik dokladnie dziala i nie mam czasu sie w to zaglebiac ale jesli dobrze rozumiem opis tych funkcji to "print" nie przechodzi do nastepnej linijki. Wiec najprawdopodobniej lcd.println zwraca ci out of bounds error.
Poczytaj jak te funkcje dzialaja bo glupia tak robic cos w ciemno:
@JohnReese: Dzięki, że się pochyliłeś nad problemem. Jak dam w pierwszej linii lcd.println czyli lcd.println(str); lcd.println("A+15,B-7,3=RUN"); to mimo, że znaków jest dokładnie tyle co miejsce w linijce to wstawia pustą linię. W tej bibliotece tak jest zawsze jak jest tyle znaków co miejsc w linii. Do tego jeśli linia jest za długa to po prostu kontynuuje w drugiej i nie wyrzuca żadnego błędu. Na razie sformatowałem to ręcznie i działa. if
@Polanin: Czyli jednak mialem racje ze problem siedzi tam. Ile znakow miesci jedna linijka na ekranie? Bo wydaje mi sie ze str po uzyciu sprintf nie wyglada w rzeczywistosci tak jak myslisz ze wyglada. Uzyj printf by zobaczyc w terminalu jak wyglada str to bedziesz wiedzial czy jest to to co bys chcial.
@JohnReese: w pierwotnej wersji czas był wyświetlany w 12 znakach, bo godziny były kodowane w 4 znakach. Wtedy po prostu przynosiło tekst to kolejnego wiersza. Potem zmieniłem na 2 znaki w godzinie i mieści sie idealnie w linijce.
if (key){
switch (key){
case 'A': //+15 min
timer = timer +(15*60);
break;
case 'B': //-7 min
timer = timer -(7*60);
if (timer < 0) {timer = 0;}
break;
case '3': //start timera
break;
case 'C': //zmiana biegu
if (bieg == 1) {bieg = 0;}
else {bieg = 1;}
break;
case 'D':
if (cykleAktywne == 1) {cykleAktywne = 0;}
else {cykleAktywne = 1;}
dataZmien();
break;
default:
break;
}
}
#arduino #programowanie
Pytasz o funkcję dataZmien() której ciało znajduje się w innym miejscu.
Pytasz o obsługę klawiatury, które to procedury znajduję się w innym miejscu.
Problem twój polega na tym, że nie potrafisz nawet zilustrować pytania właściwym fragmentem kodu(o sam kod pokazany tutaj już nie będę się czepiał).
Obsługa klawiatury dziala i leci na standardowej bibliotece.
No i moze tak jak koledzy pisza zapodaj caly kod albo conajmniej to datazmien bo na 100% problem jest tam.
NIE
czyli "A", jak sama nazwa wskazuje "case 'A': //+15 min" dodaje 26 minut do timera, "B", "case 'B': //-7 min" odejmuje od timera ok. 12.5 minuty (jak sama nazwa wskazuje), "3" startuje timer (czyli nie robi nic). Działają jak działały, czyli nie tak jak powinny.
Zmienne boolean (sądząc po wartościach) "bieg" i "cykleAktywne" są negowane warunkiem, zamiast po prostu "bieg=!bieg".
Tyle
sprintf(str, "%02ld:%02d:%02d", h, m, s);
Ta linijka siedzi w innej funkcji, do której datazmien się nie odwołuje. Jeszcze nie ogarnąłem całkiem o co chodzi, szczególnie, że mało wiem o sprintf. Jak je przytnę do
sprintf(str, "%02d:%02d", h, m);
to działa. Jak zrobię
sprintf(str, "%02:%02d:%02d", h, m, s);
to wyrzuca krzaczki
lcd.print(str);
lcd.println("A+15,B-7,3=RUN");
Nie wiem jak ten ekranik dokladnie dziala i nie mam czasu sie w to zaglebiac ale jesli dobrze rozumiem opis tych funkcji to "print" nie przechodzi do nastepnej linijki. Wiec najprawdopodobniej lcd.println zwraca ci out of bounds error.
Poczytaj jak te funkcje dzialaja bo glupia tak robic cos w ciemno:
Jak dam w pierwszej linii lcd.println czyli
lcd.println(str);
lcd.println("A+15,B-7,3=RUN");
to mimo, że znaków jest dokładnie tyle co miejsce w linijce to wstawia pustą linię. W tej bibliotece tak jest zawsze jak jest tyle znaków co miejsc w linii. Do tego jeśli linia jest za długa to po prostu kontynuuje w drugiej i nie wyrzuca żadnego błędu. Na razie sformatowałem to ręcznie i działa.
if