Itap88 Październik 4, 2019 Udostępnij Październik 4, 2019 @Treker Rzeczywiście. W roli przycisku restartującego grę użyłem przycisku RESET. Jest to problem? A poza tym zmieniłem kod i teraz wygląda tak: int lives; int right; int guess; String sent; int right_min; int right_max; void setup() { pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, INPUT); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); Serial.begin(9600); lives = 3; right = analogRead(A5); right_min = right - 50; right_max = right + 50; } void loop() { if(lives == 0){ digitalWrite(10, HIGH); return; }else{ Serial.println("Podaj liczbę"); while(Serial.available() == 0){} sent = Serial.readStringUntil('\n'); guess = sent.toInt(); if(right_min < guess){ if(guess < right_max){ digitalWrite(8, HIGH); return; }else{ digitalWrite(9, HIGH); lives = lives - 1; } }else{ digitalWrite(9, HIGH); lives = lives - 1; } } } i nadal działa tak samo, czyli praktycznie nie działa.
Treker (Damian Szymański) Październik 4, 2019 Udostępnij Październik 4, 2019 @Itap88 przyznam, że nie rozumiem niektórych fragmentów Twojego programu. Możesz dodać do niego komentarze? Będzie łatwiej zrozumieć co masz na myśli i szybciej znajdziemy rozwiązanie
Itap88 Październik 4, 2019 Udostępnij Październik 4, 2019 @Treker Dodałem komentarze. Chyba nawet za dużo. int lives;//liczba prób int right;//wartość z potencjometru int guess;//wartość podana przez gracza String sent;//wartość wysłana do arduino int right_min;//zakres podanych wartości dających zwycięstwo int right_max; void setup() {//zawsze po wciśnięciu przycisku RESET pinMode(8, OUTPUT);//wyjścia na diody: zielona pinMode(9, OUTPUT);//żółta pinMode(10, OUTPUT);//czerwona digitalWrite(10, LOW);//wyłączenie diód digitalWrite(9, LOW); digitalWrite(8, LOW); Serial.begin(9600);//start transmisji lives = 3;//trzy próby right = analogRead(A5);//odczytanie potencjometru i ustawienie zakresu right_min = right - 50; right_max = right + 50; } void loop() { if(lives == 0){//jeśli brak prób digitalWrite(10, HIGH);//zapal czerwoną diodę - przegrana return;//wyjdź z funkcji - zakończ program }else{ Serial.println("Podaj liczbę");//informacja dla gracza while(Serial.available() == 0){}//oczekiwanie na odpowiedź sent = Serial.readStringUntil('\n');//odczytanie odpowiedzi guess = sent.toInt();//konwersja na liczbę if(right_min < guess){//czy odpowiedź mieści się w zakresie (min) if(guess < right_max){//czy odpowiedź mieści się w zakresie (max) digitalWrite(8, HIGH);//włącz zieloną diodę - zwycięstwo return;//zakończ program }else{ digitalWrite(9, HIGH);//zapal żółtą diodę - ostrzeżenie lives = lives - 1;//utrata próby } }else{ digitalWrite(9, HIGH);//zapal żółtą diodę - ostrzeżenie lives = lives - 1;//utrata próby } } } i doszedłem do wniosku, że nie wiem czy return; działa tu tak, jak myślę że działa.
Belferek Październik 4, 2019 Udostępnij Październik 4, 2019 (edytowany) funkcja void loop() nigdy się nie kończy zobacz: C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp więc po co ten return; ? Edytowano Październik 4, 2019 przez Belferek 1
Itap88 Październik 5, 2019 Udostępnij Październik 5, 2019 @Belferek Nie wiedziałem, że ten return; nie działa. Teraz już wiem. Nie wiem dlaczego, ale po odłączeniu i ponownym podłączeniu diód wszystko działa. 1
Belferek Październik 5, 2019 Udostępnij Październik 5, 2019 (edytowany) Nie wiem co to u Ciebie znaczy "odłączenie i ponowne podłączenie" - ja staram się nie dokonywać takich modyfikacji przy pracującym urządzeniu. Może system się resetuje? Serial.println("Reset systemu...:); w setup() może pomóc w diagnostyce. Edytowano Październik 5, 2019 przez Belferek 1
Itap88 Październik 8, 2019 Udostępnij Październik 8, 2019 @Belferek Odłączenie i ponowne podłączenie oznacza po prostu rozłożenie obwodu elektrycznego na elementy składowe i ponowne jego złożenie.
Belferek Październik 8, 2019 Udostępnij Październik 8, 2019 (edytowany) No to jeszcze powiedz co Ci pokazał wynik eksperymentu z Serial.println w setup(); Czy aby nie masz sytuacji, że wszystko wraca do normy po resecie uC? Edytowano Październik 8, 2019 przez Belferek
Treker (Damian Szymański) Październik 9, 2019 Udostępnij Październik 9, 2019 @Belferek mam wrażenie, że autor zwyczajnie złożył układ od nowa i teraz wszystko działa. Zapewne był jakiś drobny błąd w pierwotnym montażu
Qbek Październik 19, 2019 Udostępnij Październik 19, 2019 Witam, Mam pytanie odnośnie zadania 4.5. Po wpisaniu błędnej lub poprawnej wartości program powinien czekać na wciśnięcie przycisku i podanie nowej wartości, a jest inaczej. Program czeka na przycisk, po wciśnięciu przeskakuje bez oczekiwania na wpisanie liczby. W kolejnej próbie program ponownie oczekuje na wpisanie liczby. Gdzie popełniam błąd? Będę wdzięczny za podpowiedź, ponieważ sam nie potrafię wymyślić rozwiązania. Moim zdaniem wygląda to tak jak by funkcja Serial.available() zwracała wartość 1 bez ponownego wpisania liczby do monitora. int wartoscLosowa = 0; int liczbaGracza = 0; int proba=2; void setup(){ Serial.begin(9600); pinMode(3, INPUT_PULLUP); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); } void loop(){ wartoscLosowa = analogRead(A4); //odczytanie wejścia while(digitalRead(3) == HIGH){} //oczekiwanie na wciśnięcie przycisku delay(20); digitalWrite(8, LOW); // ustawienie stanu diody digitalWrite(9, LOW); // ustawienie stanu diody digitalWrite(10, LOW); // ustawienie stanu diody Serial.println("Podaj liczbę"); while(Serial.available() == 0){} //oczekiwanie na wprowadzenie liczby liczbaGracza = Serial.parseInt(); if(((wartoscLosowa-50)<liczbaGracza)&&((wartoscLosowa+50)>liczbaGracza)){ //sprawdzenie czy wprowadzona liczba spełnia warunek digitalWrite(8, HIGH); //jeśli tak to zapalenie diody zielonej Serial.println("Wygrana"); } else //jeśli wprowadzona liczba nie mieści się w zakresie { digitalWrite(9, HIGH); // zapalenie diody żółtej Serial.println("Spróbuj ponownie, pozostało prob: "); Serial.println(proba); proba = proba -1; //dekrementacja ilości pozostałych prób } if(proba == -1){ //jesli wykorzystano wszystkie próby digitalWrite(10, HIGH); // ustawienie stanu diody digitalWrite(9, LOW); // ustawienie stanu diody digitalWrite(8, LOW); // ustawienie stanu diody proba = 2; // ustawienie licznika prób Serial.println("Game Over"); } delay(20); }
Treker (Damian Szymański) Październik 19, 2019 Udostępnij Październik 19, 2019 @Qbek witam na forum! Jak masz ustawiony monitor portu szeregowego? Sprawdź jak na działanie programu wpływa opcja dodawania (lub nie) znaków końca linii (rozwijane okienko w oknie monitora) 1
Qbek Październik 19, 2019 Udostępnij Październik 19, 2019 Cytat witam na forum! Jak masz ustawiony monitor portu szeregowego? Sprawdź jak na działanie programu wpływa opcja dodawania (lub nie) znaków końca linii (rozwijane okienko w oknie monitora) @TrekerW monitorze miałem ustawienie "Nowa linia", po zmianie na "brak zakończenia linii" problem ustąpił. Dziękuję bardzo za szybką odpowiedź. 1
Lukasz1979 Listopad 1, 2019 Udostępnij Listopad 1, 2019 Świetny kurs. Jako ktoś ZUPEŁNIE zielony w temacie jestem w stanie ogarnąć przykłady i tworzyć już pierwsze własne, proste projekty. Drobna uwaga matematyczna (proszę o korektę jeśli się mylę) - jeśli tworzymy nasz pierwszy prosty woltomierz to dzielić powiniśmy nie przez ilość stanów a przez wartość maksymalną. Dzieje się tak, ponieważ przetwornik ADC tak naprawdę przetwarza zakres wartości analogowych na wartość cyfrową (nie może przetwarzać każdego stanu bo jest ich nieskończenie wiele, jak to w świecie analogowym). Jeśli mamy 1024 stany to dysponujemy jedynie 1023 zakresami. Prosty dowód: jeśli dzielimy przez 1024.00 (jak w przykładzie) przy odczycie wartości z potencjometru 1023 (czyli maksymalnym) oraz napięciu 5V otrzymujemy V=5.00*(1023/1024)=4,995 V. Przy dzieleniu przez 1023 wynik wynosi dokładnie 5.00V. Przyznaję, różnica symboliczna ale im słabszy (o mniejszej rozdzielczości) przetwornik tym większe ma to znaczenie. Pozdrowienia i raz jeszcze dziękuję za kurs! 2
Treker (Damian Szymański) Listopad 1, 2019 Udostępnij Listopad 1, 2019 @Lukasz1979 witam na forum Cieszę się, że kurs jest pomocny - powodzenia w dalszych eksperymentach! Cieszę się, że zwróciłeś temat na wartość, która używana jest podczas obliczenia napięcia. Temat ten jest dość zawiły i pisząc wprost... zdania w tej sprawie są podzielone. Temat ten wraca jak bumerang i zawsze ścierają się dwie strony. Ostatecznie wychodzi jednak, że dzielenie przez 1024 jest jednak "właściwsze". Zerknij np. do tego tematu: https://forbot.pl/forum/topic/11985-przeliczanie-adc-na-v-dzielenie-przez-1023-czy-1024
Lukasz1979 Listopad 1, 2019 Udostępnij Listopad 1, 2019 6 godzin temu, Treker napisał: @Lukasz1979 witam na forum Cieszę się, że kurs jest pomocny - powodzenia w dalszych eksperymentach! Cieszę się, że zwróciłeś temat na wartość, która używana jest podczas obliczenia napięcia. Temat ten jest dość zawiły i pisząc wprost... zdania w tej sprawie są podzielone. Temat ten wraca jak bumerang i zawsze ścierają się dwie strony. Ostatecznie wychodzi jednak, że dzielenie przez 1024 jest jednak "właściwsze". Zerknij np. do tego tematu: https://forbot.pl/forum/topic/11985-przeliczanie-adc-na-v-dzielenie-przez-1023-czy-1024 Dzięki za wyjaśnienia. Podane linki rzeczywiście sporo rozjaśniły.... Przyznaję, analizowałem jedynie skrajne stany, bez pośrednich. Już wiem, czemu zagadnienie nie jest takie oczywiste, jak mogłoby się wydawać. 1
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »