ethanak Październik 31, 2021 Udostępnij Październik 31, 2021 No tak, tylko po co pokazałeś że potrafisz rozwiązać zadanie dla przedszkolaków?
pmochocki Październik 31, 2021 Udostępnij Październik 31, 2021 13 minut temu, ethanak napisał: No tak, tylko po co pokazałeś że potrafisz rozwiązać zadanie dla przedszkolaków? Obiecuję poprawę.
enikan Listopad 18, 2021 Udostępnij Listopad 18, 2021 Średnio jeden wieczór schodzi na jeden artykuł... Po tym zaczyna się bonanza, bo co najmniej przez tydzień męczę zadania domowe 4.4 i 4.6 jakoś poszło, ale niemiłosiernie namęczyłem się z zad.: 4.5 i choć nadal mam problemy z działaniem tej gierki, to cieszę się - jako tako działa. Nie obyło się bez Googla i dodatkowej literatury. Kursik mocno przymusza do myślenia, ale to oczywiście zaleta... Aż z radości wkleję tutaj mój kod: 4.5: #define przycisk 8 #define zielona 9 #define zolta 10 #define czerwona 11 #define potencjometr A5 int stan_gry = 2; int odczyt_potencjometru = 0; int wpisane_przez_gracza = 0; int granica_bledu = 50; void setup() { pinMode(przycisk, INPUT_PULLUP); pinMode(zielona, OUTPUT); pinMode(zolta, OUTPUT); pinMode(czerwona, OUTPUT); digitalWrite(zielona, LOW); digitalWrite(zolta, LOW); digitalWrite(czerwona, LOW); Serial.begin(9600); } void loop() { if (stan_gry == 2) { delay(300); digitalWrite(zielona, LOW); digitalWrite(zolta, LOW); digitalWrite(czerwona, LOW); Serial.println("Witaj w grze polegającej na odgadywaniu wskazań potencjometru."); Serial.println("Dowolnie przekręć pokrętło potencjometru i naciśnij"); Serial.println("przycisk na płytce stykowej.\n"); while (digitalRead(przycisk) == HIGH) { delay(25); } odczyt_potencjometru = analogRead(potencjometr); Serial.println("Teraz odgadnij, na jaką wartość ustawiłeś potencjometr. Masz dwie szanse."); Serial.println("Wpisz tą liczbę powyżej i kliknij przycisk 'Wyślij'.\n"); while (Serial.available() == 0) {} wpisane_przez_gracza = Serial.parseInt(); if ((odczyt_potencjometru <= wpisane_przez_gracza + granica_bledu) && (odczyt_potencjometru >= wpisane_przez_gracza - granica_bledu)) { Serial.println("Brawo! Odgadłeś za pierwszym razem."); Serial.println("Naciśnij przycisk na płytce stykowej, aby rozpocząć od nowa.\n"); digitalWrite(zielona, HIGH); digitalWrite(zolta, LOW); digitalWrite(czerwona, LOW); while (digitalRead(przycisk) == HIGH) { delay(25); Serial.read(); } stan_gry = 2; } else { Serial.read(); stan_gry = 1; } } if (stan_gry == 1) { Serial.println("Niestety nie zgadłeś. Masz jeszcze jedną szansę."); Serial.println("Wpisz liczbę powyżej i kliknij przycisk 'Wyślij \n"); digitalWrite(zielona, LOW); digitalWrite(zolta, HIGH); digitalWrite(czerwona, LOW); odczyt_potencjometru = analogRead(potencjometr); while (Serial.available() == 0) {} wpisane_przez_gracza = Serial.parseInt(); if ((odczyt_potencjometru <= wpisane_przez_gracza + granica_bledu) && (odczyt_potencjometru >= wpisane_przez_gracza - granica_bledu)) { Serial.println("Brawo! Odgadłeś za drugim razem."); Serial.println("Naciśnij przycisk na płytce stykowej, aby rozpocząć od nowa.\n"); digitalWrite(zielona, HIGH); digitalWrite(zolta, LOW); digitalWrite(czerwona, LOW); while (digitalRead(przycisk) == HIGH) { delay(25); } stan_gry = 2; } else { Serial.println("Niestety za drugim razem też nie zgadłeś. Koniec."); Serial.println("Naciśnij przycisk na płytce stykowej, aby rozpocząć od nowa.\n"); digitalWrite(zielona, LOW); digitalWrite(zolta, LOW); digitalWrite(czerwona, HIGH); while (digitalRead(przycisk) == HIGH) { delay(25); } Serial.read(); stan_gry = 2; } } }
Gieneq Listopad 19, 2021 Udostępnij Listopad 19, 2021 @enikan Przejrzałem kod i widzę, że zauważyłeś o co chodzi w tym algorytmie Można jeszcze go zmniejszyć ale na początek to naprawdę dobrze. Ogólnie istotą programu jest pętla (najlepiej while), która służy do zbliżania się do wyniku, a sam algorytm można nazwać algorytmem bisekcji - tu lektura googla. Jest dobrze, tak trzymaj 1
Wiktor-IT Listopad 26, 2021 Udostępnij Listopad 26, 2021 Witam mam problem, ponieważ nie wiem jak wygląda ten przetwornik ADC, a w zestawie nie mogę go znaleźć, czy mógłby ktoś wysłać zdjęcia jak on wygląda. Z góry dziękuje
enikan Listopad 26, 2021 Udostępnij Listopad 26, 2021 @Wiktor-IT Przetwornik ADC jest "wbudowaną" funkcją mikrokontrolera (w przypadku tego kursu). Nie jest to żaden osobny układ... Proponuje jeszcze raz na spokojnie przeczytać cały rozdział i wtedy wszystko się rozjaśni. Pozdrawiam 2
omeniq Listopad 28, 2021 Udostępnij Listopad 28, 2021 (edytowany) Uh zadanie 4.5 zrobione, zeszło mi niedzielne popołudnie Zmodyfikowałem nieco moją wersje tego zadania gdyż nie do końca rozumiałem chyba jak ma wyglądać zapalnie czerwonej diody W związku z tym zrobiłem 3 czerwone diody które symbolizują ilość popełnionych błędów. Pomarańczowa dioda zapala się w momencie popełnienia błędu a następnie jedna z czerwonych. Przy kolejnym błędzie drugie, przy ostatnim trzecim błędzie ostatnia czerwona dioda. Wiem, że mój kod nie jest jakiś super i da się go napisać lepiej - aczkolwiek korzystałem tylko z funkcji/metod opisanych do tej pory w kursie PS. Teraz 4.6 które będzie ciekawsze Super jest Wasz kurs #include <Arduino.h> #define red3 12 #define red2 11 #define red1 10 #define yellow 9 #define green 8 #define button 7 int potentiometer_value = 0; int user_input = 0; int attempts_counter = 3; bool is_started = false; bool ignore_incoming_data = true; void setup() { Serial.begin(9600); pinMode(red1, OUTPUT); pinMode(red2, OUTPUT); pinMode(red3, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); pinMode(button, INPUT_PULLUP); digitalWrite(red1, LOW); digitalWrite(red2, LOW); digitalWrite(red3, LOW); digitalWrite(yellow, LOW); digitalWrite(green, LOW); Serial.println("Set potentiometer and press button to start"); } void loop() { potentiometer_value = analogRead(A5); // wartosc z potencjometru if (ignore_incoming_data) // ignoruj odbierane dane do momentu wciśniecia przycisku { while (Serial.read() > 0) {} } if (digitalRead(button) == LOW) // jesli przycisk jest wcisniety { Serial.println("Enter a number:"); is_started = true; // zacznij odbieranie danych dopiero gdy przycisk został naciśnięty ignore_incoming_data = false; // przestań ignorować odbierane dane delay(200); // opoźnienie aby nie wyswietlać info wiele razy } if (Serial.available() > 0 && is_started) // jesli odebrano dane { user_input = Serial.readStringUntil('\n').toInt(); // pobierz wprowadzony string i konwertuj do int Serial.print("Your number: "); Serial.println(user_input); int min = potentiometer_value - 50; int max = potentiometer_value + 50; // Wyswietl zakres by wygrać :D // Serial.print("Min: "); // Serial.print(min); // Serial.print(" Max: "); // Serial.println(max); if (user_input >= min && user_input <= max) // czy odebrana liczna jest w zakresie min max { digitalWrite(green, HIGH); // zapal zielona jesli poprawa liczba digitalWrite(red1, LOW); digitalWrite(red2, LOW); digitalWrite(red3, LOW); digitalWrite(yellow, LOW); Serial.print("You win! You hit in range: "); Serial.print(min); Serial.print(" - "); Serial.println(max); Serial.println("Press button to reset game."); while (digitalRead(button) == HIGH){} // czekaj na wcisniecie przycisku attempts_counter = 3; // zresetuj licznik ignore_incoming_data = true; // ponownie ignoruj wprowadzone dane do momentu wciśniecia przycisku digitalWrite(red1, LOW); // wylacz reszte diod jesli poprawna liczba digitalWrite(red2, LOW); digitalWrite(red3, LOW); digitalWrite(yellow, LOW); digitalWrite(green, LOW); } else { digitalWrite(yellow, HIGH); // mignij pomarańczową dioda gdy bład delay(500); digitalWrite(yellow, LOW); attempts_counter--; // zmniejsz ilość prob o jeden Serial.print("Wrong. Remaining attempts: "); Serial.println(attempts_counter); if (attempts_counter == 2) { digitalWrite(red1, HIGH); // zapal pierwsza diode gdy błąd Serial.println("Enter a number:"); } else if (attempts_counter == 1) { digitalWrite(red2, HIGH); // zapal druga diode gdy błąd Serial.println("Enter a number:"); } else { digitalWrite(red3, HIGH); // zapal trzecia diode gdy błąd } } delay(50); // opoźnienie aby spowolnić odczyt ADC } if (attempts_counter == 0) // gdy skończa sie dozwolone proby { Serial.println("Game over! Press button to start again."); while (digitalRead(button) == HIGH) {} // czekaj na wcisniecie przycisku is_started = false; // zresetuj gre attempts_counter = 3; // zresetuj licznik ignore_incoming_data = true; // ponownie ignoruj wprowadzone dane do momentu wciśniecia przycisku digitalWrite(red1, LOW); // wylacz diody po wcisnieciu przycisku - reset gry digitalWrite(red2, LOW); digitalWrite(red3, LOW); digitalWrite(yellow, LOW); digitalWrite(green, LOW); } } Edytowano Listopad 28, 2021 przez omeniq 2
Gieneq Listopad 29, 2021 Udostępnij Listopad 29, 2021 @omeniq super, że sobie poradziłeś. Kod faktycznie jest bardzo duży, ale z czasem podłapiesz inne metody powodzenia!
omeniq Grudzień 1, 2021 Udostępnij Grudzień 1, 2021 Dobra mam zadanie 4.6 Myśle że działa nawet fajnie - podrzucam filmik oraz nieco skomentowany kod. #include <Arduino.h> #define red1 8 #define red2 9 #define yellow1 10 #define yellow2 11 #define green1 13 #define green2 12 int foto_down_map = 0; int foto_up_map = 0; void setup() { Serial.begin(9600); pinMode(red1, OUTPUT); pinMode(red2, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(green1, OUTPUT); pinMode(green2, OUTPUT); } void loop() { foto_down_map = map(analogRead(A5), 0, 1023, 0, 15); // przeskaluj zakres na 0-14 - dolny fotorezystor foto_up_map = map(analogRead(A4), 0, 1023, 0, 15); // jw - grny fotorezystor digitalWrite(yellow1, LOW); // wylącz wszyskie diody jeśli brak mocniejszego źrodla swiatla digitalWrite(yellow2, LOW); digitalWrite(red1, LOW); digitalWrite(red2, LOW); digitalWrite(green1, LOW); digitalWrite(green2, LOW); Serial.print("UP: "); Serial.println(foto_up_map); Serial.print("DOWN: "); Serial.println(foto_down_map); if (foto_down_map > foto_up_map) // jesli wartosc dolnego foto wieksza do gorengo to znak ze swiatla wiecej na dole { // dolny ma czerwone diody if ((foto_down_map - foto_up_map) == 1) // jesli roznica pomedzy dolny a gornym jest rowna jeden { digitalWrite(yellow1, HIGH); // zapal zolta diode ktora jest blizej skrajnej czerwonej digitalWrite(red2, HIGH); // zapal srodkowa czerwona dioda digitalWrite(red1, LOW); // wylacz skrajna czerwona diode digitalWrite(green1, LOW); // wylaczamy zielona } else if ((foto_down_map - foto_up_map) > 1) // jesli roznica pomiedzy dolnym a gornym jest wieksza od jeden { // to znak ze swiatlo jest najmocniejsze z tej strony digitalWrite(yellow1, LOW); // wylaczamy wiec zolta diode digitalWrite(red1, HIGH); // zapal skrajna czerwona digitalWrite(red2, LOW); // wylaczamy srodkowa czerwona digitalWrite(green1, LOW); // wylaczamy zielona } } else if (foto_up_map > foto_down_map) // jesli wartosc gornego foto jest wieksza niz dolnego to znak ze swiatla wiecej u gory { // gorny ma zielone diody if ((foto_up_map - foto_down_map) == 1) // jesli roznica pomiedzy gornym a dolnym jest rowna jeden { digitalWrite(yellow2, HIGH); // zapal zolta diode ktora jest blizej skrajnej zielonej digitalWrite(red1, LOW); // wylacz czerwona diode digitalWrite(green1, LOW); // wylacz skrajna zielona diode digitalWrite(green2, HIGH); // zapal skrajna zielona diode } else if ((foto_up_map - foto_down_map) > 1) // jesli rozncia pomiedzy gornym a dolnym jest wieksza od jeden { digitalWrite(yellow2, LOW); // wylacz zolta diode digitalWrite(red1, LOW); // wylacz czerwona diode digitalWrite(green2, LOW); // wylacz srodkowa zielona diode digitalWrite(green1, HIGH); // zapal skrajna zielona diode } } else if (foto_down_map > 0 && (foto_down_map - foto_up_map) == 0) // jesli roznica pomiedzy gora a dolem jest zero to znak ze natezenie swiatła jest podobne { // wtedy zapal tylko dwie srodkowe zolte diody ALE tylko wtedy gdy pojawilo sie jakies zrodło swiatła wieksze niz zero - dzieki temu zolte diody nie swieca sie non stop digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); digitalWrite(red1, LOW); digitalWrite(red2, LOW); digitalWrite(green1, LOW); } delay(50); }
Gieneq Grudzień 6, 2021 Udostępnij Grudzień 6, 2021 @omeniq fajnie że się uczysz, poczytaj tę serię artykułów którą piszę, mogą przydać się do ulepszenia kodu w tym zadaniu 2
Franek100 Styczeń 19, 2022 Udostępnij Styczeń 19, 2022 int dane = 0; void setup() { Serial.begin(9600); pinMode(6, OUTPUT); } void loop() { dane = analogRead(A5); if(dane < 200){ digitalWrite(6, HIGH); Serial.println(dane); while(dane < 200) {} }else{ digitalWrite(6, LOW); } } Próbuję zrobić zadanie 4.4, żeby wiadomość jakie napięcie jest na A5 pokazała się tylko raz. Niestety ten kod nie działa i nie wiem dlaczego. Kiedy zgaszę światło rzeczywiście pokazuje mi się jakaś liczba poniżej 200 tylko raz i dioda się zapala, ale działa to wszystko tylko raz. Kiedy następnie zapalam światło, to dioda nadal świeci : - / Ma ktoś może jakiś pomysł dlaczego to nie gra?
farmaceuta Styczeń 19, 2022 Udostępnij Styczeń 19, 2022 Bo nie sprawdzasz pinu analogowego w petli while...gdy zaswiecisz swiatlo to wartosc wzrosnie, ale Ty caly czas znajdujesz sie w while bo sprawdzasz wartosc ktora zostala zapisana przed wejsciem w while...poprostu tworzysz petle nieskonczona...raz wpadniesz i juz nigdy nie wyjdziesz... if(dane < 200){ digitalWrite(6, HIGH); Serial.println(dane); while(analogRead(A5) < 200) {} Tak to ma byc
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ę »