Wpis z mikrobloga

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;
}
}

#arduino #programowanie
  • 13
@Polanin: Ale nie dzialaja ci klawisze czy poprostu nie robia tego co bys chcial?

No i moze tak jak koledzy pisza zapodaj caly kod albo conajmniej to datazmien bo na 100% problem jest tam.

Coś z pamięcią? Jak wywalam część sekcji to ładuje się w inne miejsca i nie działa?


NIE
@JohnReese: Ładnie to opisał:

A i B działają jak działały

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.