matiowoz98 Lipiec 13, 2021 Udostępnij Lipiec 13, 2021 @ethanak A... to dziękuję, że mi powiedziałeś jak ten program teraz działa, analizując go i pisząc byłem pewien, że będzie działać inaczej... Ja chcę, aby mój program działał w ten sposób: Program wykonuje w kółko pewną sekwencję ( u mnie zawartą w ELSE) Po naciśnięciu (chciałbym, żeby nie trzeba było go trzymać, tylko kliknąć) wykonuje pewną sekwencje i po jej wykonaniu wraca do mojej sekwencji zawartej w ELSE. I to tyle... czuję, że to jest tak banalnie proste, a ja nie mogę do tego dojść.. Myślałem, że ten fragment - else (digitalRead(7) == HIGH); { //jesli przycisk NIE wcisniety Będzie powodować wykonywanie sekwencji pod ELSE, kiedy przycisk nie bedzie wciśniety, a IF kiedy go nacisnę. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 13, 2021 Udostępnij Lipiec 13, 2021 2 minuty temu, matiowoz98 napisał: Myślałem, że ten fragment Przede wszystkim: else // prawidłowo (digitalRead(7) == HIGH) // czyli porównujesz coś z czymś, ale nie używasz nigdzie wyniku ; // średnik czyli koniec instrukcji { cośtam dalej } // czyli blok instrukcji zupełnie niezależny od ifa, elsa czy innego whila przedtem Teoretycznie powinno to wyglądać mniej więcej tak: else if (digitalRead(7) == HIGH) { cała druga sekwencja} Porównaj sobie rozpiskę: Jeśli (cośtam) wykonaj A, w przeciwnym razie wykonaj B. i Jeśli (cośtam) wykonaj A, w przeciwnym razie porównaj X i Y. Wykonaj B. Które jest tym co chciałeś? I jeszcze drobiazg: if (przycisk_jest_naciśnięty) {cośtam}; else if (przycisk_nie_jest_naciśnięty) {cośinnego}; Czy Twoim zdaniem może zajść taka sytuacja, że w czasie wykonywania else przycisk będzie naciśnięty? Przecież to już sprawdzałeś. digitalRead zwraca LOW albo HIGH, nie ma trzeciej możliwości! Czyli po prostu: if (przycisk_jest_naciśnięty) {cośtam}; else {cośinnego}; Chociaż zaraz zaraz... ależ taka sytuacja może zajść! Wyobraź sobie, że: przycisk nie jest naciśnięty program wykonuje sprawdzenie w instrukcji if i stwierdza, że przycisk nie jest naciśnięty w tym momencie ktoś naciska przycisk program sprawdza w drugim ifie czy przycisk nie jest naciśnięty, stwierdza że jest w efekcie nie wykona się ani jeden ani drugi kod. Dlatego taka nadmiarowość może prowadzić do trudnych w znalezieniu błędów w czasie wykonania programu (szczególnie że taka sytuacja będzie zachodzić bardzo rzadko). 1 Cytuj Link do komentarza Share on other sites More sharing options...
matiowoz98 Lipiec 13, 2021 Udostępnij Lipiec 13, 2021 (edytowany) @ethanak Czyli dobrze rozumiem, że jeżeli program wykonuje pentlę ELSE i w tym czasie nacisnę przycisk, to nie przejdzie do IF tak? Jeśli (cośtam) wykonaj A, w przeciwnym razie wykonaj B. - Tą opcję chciałem Edytowano Lipiec 13, 2021 przez matiowoz98 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 14, 2021 Udostępnij Lipiec 14, 2021 6 godzin temu, matiowoz98 napisał: Czyli dobrze rozumiem, że jeżeli program wykonuje pentlę ELSE Nie, nie rozumiesz. Nie ma żadnej "pentli else" - co to w ogóle ma znaczyć? I tak, owszem, jeśli program coś robi a Ty w tym czasie naciśniesz przycisk, to nie przejdzie magicznie do wykonywania czegoś innego. Jeśli np. oglądasz serial na Polsacie to jeśli w tym samym czasie TVP poda jakieś wielce ważne informacje - raczej sam się odcinek MacGyvera nie przerwie żeby przełączyć na Teleekspres. 7 godzin temu, matiowoz98 napisał: Jeśli (cośtam) wykonaj A, w przeciwnym razie wykonaj B. - Tą opcję chciałem No to teraz zapisz to ładnie w kodzie. Możesz dla uproszczenia na razie założyć, że A to Serial.println("A") a B to Serial.println("B"). (ot tak, żeby za dużo nie pisać). 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
Bartroz Wrzesień 4, 2021 Udostępnij Wrzesień 4, 2021 (edytowany) Dzień dobry, jest ktoś w stanie wyjaśnić dlaczego dioda nie mruga co 1 sekundę mimo iż wszystko (kod oraz podłączenie) zrobiłem zgodnie z instrukcją na kursie? Chodzi o pierwszy przykład. Edytowano Wrzesień 4, 2021 przez Bartroz Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Wrzesień 6, 2021 Udostępnij Wrzesień 6, 2021 @Bartroz witam na forum 🙂 A jednak wrzuć swój kod programu i zdjęcie połączeń. Różnie bywa 😉 Cytuj Link do komentarza Share on other sites More sharing options...
Bartroz Wrzesień 6, 2021 Udostępnij Wrzesień 6, 2021 Po dogłębnej analizie znalazłem problem w swoim układzie, a mianowicie podłączyłem diodę na odwrót. Tak więc dziękuję za odpowiedź, a następnym początkującym radzę się nie śpieszyć przy nauce! 1 Cytuj Link do komentarza Share on other sites More sharing options...
Antagonista99 Wrzesień 15, 2021 Udostępnij Wrzesień 15, 2021 Mam problem jak chodzi o petle for. Teoretycznie powinno świecić 4 razy świeci dużo razy więcej. Czy to winna że wartość i jest nadpisywana przez 0 w warunku? A jak tak to jak można eliminować zjawisko? Pozdrawiam for (int i =0; i<5; i++){ digitalWrite(led , HIGH); delay(500); digitalWrite(led , LOW); delay(500); } Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Wrzesień 15, 2021 Udostępnij Wrzesień 15, 2021 (edytowany) 19 minut temu, Antagonista99 napisał: Teoretycznie powinno świecić 4 razy świeci dużo razy więcej. Teoretycznie powinno swiecic 5 razy...zmienna w petli bedzie miala wartosci 0/1/2/3/4...czyli 5 obiegow...najpierw sprawdza warunek, potem petla sie wypelnia, potem nastepuje inkrementacja, potem sprawdza znow warunek itp... 19 minut temu, Antagonista99 napisał: Czy to winna że wartość i jest nadpisywana przez 0 w warunku Tak...po kazdym obiegu loop() zmienna w for jest tworzona od nowa i inicjowana zerem wiec for sie powtorzy... 19 minut temu, Antagonista99 napisał: A jak tak to jak można eliminować zjawisko Mozesz stworzyc zmienna globalna i to wystarczy, ale(!) trzeba pamietac zeby ta zmienna wyzerowac przed kazdym wejsciem do for... int i = 0; //zmienna globalna for ( i; i<5; i++) Jednak wtedy nie mozesz tej zmiennej zerowac przed petla for bo bedzie taka sama sytuacja jaka teraz masz...musisz utworzyc jakis warunek ktory w okreslonym momencie bedzie zerowac ta zmienna zeby mozna bylo wykonac for... Edytowano Wrzesień 15, 2021 przez farmaceuta Cytuj Link do komentarza Share on other sites More sharing options...
RysiekUP Listopad 28, 2021 Udostępnij Listopad 28, 2021 (edytowany) void setup() { // put your setup code here, to run once: pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, INPUT_PULLUP); digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(6, LOW); } void loop() { // put your main code here, to run repeatedly: digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, LOW); delay(1000); digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, HIGH); delay(5000); digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); delay(1000); digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); delay(1000); if (digitalRead(7) == LOW) { digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); delay(1000); digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); delay(1000); digitalWrite (6, HIGH); digitalWrite (5, LOW); delay(3000); digitalWrite (6, LOW); digitalWrite (5, HIGH); delay(1000); digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, LOW); } else {digitalWrite(5, HIGH); } } Cześć Próbuję zrobić światła drogowe działające tak: -cały czas sekwencja ziel4, żółte3, czer2, czer2 i zół3, ziel4.... a na przejsciu cały czas czerw5 -chyba, że wcisnę przycisk7 to żół3, czerw2 > na przejściu ziel6, czerw5 i wracam do początku Mają powyższy program w miarę to działa ale są dwa problemy: -muszę długo przytrzymać przycisk7 żeby uruchomić if - Dlaczego tak się dzieje? - i mniejszy problem - idzie czerw2, zół3, czerw2 i dopiero wtedy if - macie na to jakiś pomysł? Edytowano Listopad 28, 2021 przez RysiekUP Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Listopad 28, 2021 Udostępnij Listopad 28, 2021 7 minut temu, RysiekUP napisał: -muszę długo przytrzymać przycisk7 żeby uruchomić if - Dlaczego tak się dzieje? Delay() to taka funkcja ktora "zamraza" kod na czas jaki zostal ustalony...nie zrobisz z tym nic, jedyny ratunek to funkcja millis() ktora nie blokuje i program reaguje bardzo szybko na jakies zdarzenia...poprostu kod wykonuje sie w kolko bardzo szybko.. Cytuj Link do komentarza Share on other sites More sharing options...
RysiekUP Listopad 28, 2021 Udostępnij Listopad 28, 2021 a jak użyć millis? w miejsce delay? np. millis(1000) //zatrzymaj na 1 sek? Dzięki za pomoc 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
RysiekUP Listopad 28, 2021 Udostępnij Listopad 28, 2021 Ok znalazłem artykuł o millis: https://forbot.pl/blog/kurs-arduino-ii-wielozadaniowosc-opoznienia-z-millis-id18418 Dopiero zaczynam więc na razie odpuszczę ten temat bo to nie takie proste 😛 Ogólnie to wydawało mi się, że mikrokontrolery będą łatwiejsze w obsłudze... może za stary na to jestem hehe Ale ciekawi mnie jak sobie z tym poradzą uczniowie podstawówek i ich nauczyciele.... Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Listopad 28, 2021 Udostępnij Listopad 28, 2021 12 minut temu, RysiekUP napisał: Dopiero zaczynam więc na razie odpuszczę ten temat bo to nie takie proste 😛 przyjdzie z czasem...😉 13 minut temu, RysiekUP napisał: Ogólnie to wydawało mi się, że mikrokontrolery będą łatwiejsze w obsłudze... Panie to i tak chyba najprostsza wersja programowania...w sensie adruino ide..😉 14 minut temu, RysiekUP napisał: Ale ciekawi mnie jak sobie z tym poradzą uczniowie podstawówek i ich nauczyciele.... nie od razu rzym zbudowano..😉 void setup() { // put your setup code here, to run once: pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, INPUT_PULLUP); digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(6, LOW); } void loop() { static int tab[] = {1000,5000,1000,1000}; static int tab1[] = {1000,1000,3000,1000,1000}; static int i = 0; static byte stan = 0; static long last = 0; if (millis() - last > tab[i]) { i++; last = millis(); if (i == 4) { i = 0; } } if (stan == 0) { if (i == 0) { digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, LOW); } if (i == 1) { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, HIGH); } if (i == 2) { digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); } if (i == 3) { digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); } } if (digitalRead(7) == LOW) { stan = 1; i = 0; delay(1000); } if (millis() - last > tab1[i]) { i++; last = millis(); } if (i == 5) { i = 0; stan = 0; } if (stan == 1) { if (i == 0) { digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); } if (i == 1) { digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); } if (i == 2) { digitalWrite (6, HIGH); digitalWrite (5, LOW); } if (i == 3) { digitalWrite (6, LOW); digitalWrite (5, HIGH); } if (i == 4) { digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, LOW); } } } sprawdz...moze zadziala 1 Cytuj Link do komentarza Share on other sites More sharing options...
RysiekUP Listopad 28, 2021 Udostępnij Listopad 28, 2021 10 minut temu, farmaceuta napisał: 28 minut temu, RysiekUP napisał: Ogólnie to wydawało mi się, że mikrokontrolery będą łatwiejsze w obsłudze... Panie to i tak chyba najprostsza wersja programowania...w sensie adruino ide.. Nawet mnie nie załamuj 😞 A ja myślałem, że zmienię branżę hehe Kod, który wysłałeś lepiej działa ale rozgryzienie go pewnie zajęłoby mi całą noc 😝 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!