SOYER Listopad 12, 2017 Udostępnij Listopad 12, 2017 Dzięki Elvis, faktycznie masz rację, rozbudowywałem ten program etapami, co mi przyszło do głowy i w końcu okazało się, że felerny warunek został gdzieś w środku programu. Umknęło mi to, nie ma to jak świeże oko. Wytłumacz mi jeszcze dlaczego lepiej jest używać else if zamiast kolejnych if? Ma to jakieś znaczenie praktyczne, estetyczne, różnica w działaniu kodu? Jedno jeszcze pytanie: co dać na końcu linii Serial.println("costam costam")????; co zamiast pytajników żeby następna linijka była pusta, a kolejny komunikat nie był jeden pod drugim? THX 😉 Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Listopad 12, 2017 Udostępnij Listopad 12, 2017 Zalet używania else jest kilka: • program dziala szybciej - jak jeden z warunków jest spełniony, pozostałych nie trzeba już sprawdzać • używanie wielu if-ów może spowodować błędy jeśli zmodyfikujesz sprawdzaną wartość - może się okazać, że więcej niż jeden if będzie jednocześnie wykonany • jeśli kiedyś zmienisz coś w jednym z if-ów, musisz pamiętać o zmianie i końcowego if-a. Powiedzmy zamiast "zolty", chcesz używać "żółty". W wersji z else zmieniasz wartość i gotowe. Poprzednio program powtarzał dwa razy tą samą wartość, a łatwo o tym zapomnieć Niestety nie używam Arduino za często, więc mogę tylko zgadywać - może jest Serial.print(), które nie dodaje znaku końca linii? Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Listopad 12, 2017 Udostępnij Listopad 12, 2017 Czyli rozumiem, ze w wersji z samymi if-ami w każdej pętli program sprawdza wszystkie if po kolei, nawet kiedy pierwszy pasuje to i tak leci przez wszystkie następne? tak? Za to w wersji z else if sprawdza pierwszego ifa i jak pasuje to pomija wszystkie pozostałe else, a jak nie pasuje if to sprawdza po kolei else aż któryś spasuje i resztę pomija? Tak? Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Listopad 12, 2017 Udostępnij Listopad 12, 2017 Dokładnie tak. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
mikro-sławek Grudzień 14, 2017 Udostępnij Grudzień 14, 2017 witam serdecznie, Oto mój program z pracy domowej, nie wiem gdzie robię błąd, gdyż zapala i gasi się tylko dioda czerwona , a zielona i komunikaty o błędnym kolorze nie działają. Z góry dziękuje za odpowiedź i pomoc. #define zielona 2 #define czerwona 4 String odebraneDane = ""; //Pusty ciąg odebranych danych boolean zielonaon =false; boolean czerwonaon =false; void setup() { Serial.begin(9600); //start komunikacji pinMode(zielona, OUTPUT); //ustawienie wyjść pinMode(czerwona, OUTPUT); digitalWrite(zielona, LOW); //Wyłączamy diody digitalWrite(czerwona, LOW); Serial.print("Wybierz kolor"); delay(1000); Serial.print("."); delay(1000); Serial.print("."); delay(1000); Serial.println("."); delay(5000); } void loop() { if(Serial.available() > 0) { //czy odebrano dane odebraneDane = Serial.readStringUntil('\n'); //jesli tak zapisz do odebraneDane if (odebraneDane == "czerwony") { //Jeśli wpisano czerwony digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną if(czerwonaon==false){ czerwonaon=true; Serial.println("zapalam czerwona!"); }else{ digitalWrite(czerwona, LOW); Serial.println("gasze czerwona!"); czerwonaon=false; if (odebraneDane == "zielony") { // jesli wpisano zielony digitalWrite(zielona, HIGH); //załącz diodę zieloną if(zielonaon ==false){ zielonaon=true; Serial.println("zapalam zielona!"); //Wyślij komunikat }else{digitalWrite(zielona, LOW); // wyłącz zieloną Serial.println("gasze zielona!"); zielonaon=false; if(odebraneDane != "zielony" && odebraneDane != "czerwony"){ //komunikaty błędnie wpisanego koloru Serial.println("niepoprawny kolor"); delay(500); } } } } } } } Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Grudzień 14, 2017 Udostępnij Grudzień 14, 2017 Może zacznij od pozamykania nawiasów od kolejnych if i else w odpowiednim miejscu. Ilość zamykających na końcu robi wrażenie, niestety nie za dobre 😉 Cytuj Link do komentarza Share on other sites More sharing options...
matural Grudzień 14, 2017 Udostępnij Grudzień 14, 2017 if (warunek) { instrukcje } if (warunek) { instrukcje } Pozamykaj klamerki tam gdzie powinieneś. Cytuj Link do komentarza Share on other sites More sharing options...
ferb01 Grudzień 27, 2017 Udostępnij Grudzień 27, 2017 Mam pytanie, dlaczego nie działa mi ten program: Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Grudzień 27, 2017 Udostępnij Grudzień 27, 2017 Hej, wydaje mi się, że powinieneś napisać: String odebraneDane; zamiast String odebraneDane =""; Pzdr Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Grudzień 28, 2017 Udostępnij Grudzień 28, 2017 ferb01, witam na forum, a co to znaczy, że nie działa? Jakie są objawy? Umieszczaj programy bezpośrednio w postach (obejmując je tagami ) ułatwisz wtedy wszystkim analizę Twoich programó 😉 SOYER, dlaczego? Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Grudzień 28, 2017 Udostępnij Grudzień 28, 2017 Treker, czyli taka forma jest poprawna? Wtedy zapisze do odebraneDane wszystko co będzie wpisane w konsolę?tak? Czy wtedy linijka odebraneDane=Serial.readStringUntil('\n") jest zbędna? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Grudzień 28, 2017 Udostępnij Grudzień 28, 2017 SOYER, nie. Mylisz tutaj kilka spraw. "String odebraneDane;" to tylko deklaracja zmiennej, której można przypisać wartość początkową lub nie. W tym wypadku jej zerowanie przez =""; nic nie zmienia, bo my do tej zmiennej niczego nie dopisujemy. My ją zawsze nadpisujemy tym, co jest właśnie zwracane przez "Serial.readStringUntil('\n")", więc jej pierwotna wartość (tuż po inicjalizacji) nie robi żadnej różnicy. Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Grudzień 28, 2017 Udostępnij Grudzień 28, 2017 Treker, masz w pełni rację jest jednak drobne ale... Tak byłoby w przypadku języka C. Jednak Arduino używa C++, a String jest klasą. Oznacza to, że kod: String odebraneDane; tworzy obiekt, czyli instancję klasy String. Podczas tworzenia wywoływany jest konstruktor, który przypisuje do obiektu pusty napis, więc robi to samo co ="", chociaż nieco inaczej (samo wywołanie konstruktora odbywa się przed funkcją main). Obiekt jest zawsze zainicjalizowany, nic nie zmieni dopisanie lub nie jawnego przypsiania wartości. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Grudzień 28, 2017 Udostępnij Grudzień 28, 2017 Elvis, dzięki za sprostowanie! Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Grudzień 29, 2017 Udostępnij Grudzień 29, 2017 Kompletnie nie wiem o czym pisz Elvis, ale wiem jedno, miałem rację pisząc, że String odebraneDane ="" jest nie do końca sensowne. Pzdr Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!