Treker (Damian Szymański) Wrzesień 5, 2022 Udostępnij Wrzesień 5, 2022 @RakietowyKim super Dla formalności, przy else if zamiast formatować program tak: if(value < 204){ digitalWrite(red2, HIGH); } else if(value < 409){ digitalWrite(red1, HIGH); } Bezpieczniej robić tak: if (value < 204) { digitalWrite(red2, HIGH); } else if (value < 409){ digitalWrite(red1, HIGH); } Wtedy jest mniejsza szansa, że podczas edycji/kopiowania programów "wstrzelisz" cos przypadkiem między "}" a "else if". A takie cos może powodować dość nieprzyjemne do odszukiwania błędy. 2
trainee Wrzesień 5, 2022 Udostępnij Wrzesień 5, 2022 (edytowany) 3 godziny temu, Treker napisał: Wtedy jest mniejsza szansa, że podczas edycji/kopiowania programów "wstrzelisz" cos przypadkiem między "}" a "else if". A jaki przykład takiego wstrzelenia możesz pokazać, który nie skończyłby się wyraźnym błędem kompilacji z numerem wiersza? Edytowano Wrzesień 5, 2022 przez trainee
RakietowyKim Wrzesień 7, 2022 Udostępnij Wrzesień 7, 2022 (edytowany) # define leftDiode 10 # define middleDiode 9 # define rightDiode 8 short int valueL = 0; short int valueR = 0; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(leftDiode, OUTPUT); pinMode(middleDiode, OUTPUT); pinMode(rightDiode, OUTPUT); } void loop() { // put your main code here, to run repeatedly: valueL = analogRead(A1); valueR = analogRead(A2); Serial.print("Left Value is: "); Serial.println(valueL); Serial.print("Right Value is: "); Serial.println(valueR); delay(1500); if(valueL-valueR > 20){ digitalWrite(rightDiode, LOW); digitalWrite(middleDiode, LOW); digitalWrite(leftDiode, HIGH); }else if(valueL-valueR < -20){ digitalWrite(rightDiode, HIGH); digitalWrite(middleDiode, LOW); digitalWrite(leftDiode, LOW); }else{ digitalWrite(rightDiode, LOW); digitalWrite(middleDiode, HIGH); digitalWrite(leftDiode, LOW); } } Zrobiłem zadanie z diodami 4.6, wymagało by lepszej kalibracji wartości dla precyzji ale spełnia swoje zadanie w miarę. Sprawdzone latarką. Edytowano Wrzesień 7, 2022 przez RakietowyKim 1
Treker (Damian Szymański) Wrzesień 7, 2022 Udostępnij Wrzesień 7, 2022 11 minut temu, RakietowyKim napisał: # define leftDiode 10 # define middleDiode 9 # define rightDiode 8 @RakietowyKim dobra robota, tylko tutaj wkradły się niepotrzebne spacje po "#" Powodzenia w dalszych eksperymentach! 2
Wojtek777 Wrzesień 8, 2022 Udostępnij Wrzesień 8, 2022 Witam, mam dwa pytania: Cytat napiecie = odczytanaWartosc * (5.0/1024.0); //Przeliczenie wartości na napięcie Zwróć uwagę, że zmienna napięcie została zadeklarowana jako typ float, czyli taką, która pozwala na przechowywanie liczb zmiennoprzecinkowych. Liczby dzielone przez siebie w powyższym kodzie zostały zapisane z dopiskiem ".0", jest to informacja dla kompilatora, aby traktował je jako liczby zmiennoprzecinkowe. Inaczej wynik takiej operacji byłby całkowity! Chciałem sprawdzić właśnie co się stanie jeżeli zapisze bez .0 (czyli 5/1024). Z kursu wynika, że wyświetlany wynik powinien być liczbą całkowitą (czyli np. zamiast 1,8 V będzie 2V). U mnie cały czas wyświetla się tylko 0.00 (pomimo zmieniania wartości potencjometru). Z czego może to wynikać? drugie pytanie dotyczy tego eksperymentu: Cytat Zadanie domowe 4.2 Jeśli będziesz miał szczęście (dużo zakłóceń w otoczeniu), to możliwe będzie wykonanie bardzo widowiskowego eksperymentu. Wykorzystaj połączony wcześniej układ z 5 diodami. Odłącz przewód idący do potencjometru i pozostaw go w powietrzu. Co się dzieje, gdy zbliżasz rękę do przewodu (nie dotykając końcówki)? U mnie, przy przewodzie wiszącym w powietrzu świeciły się 3 diody, jednak wystarczyło zbliżyć rękę na odległość 2cm od kabla i zapalały się wtedy wszystkie diody. Masz pomysł dlaczego tak się dzieje? W moim przypadku po odłączeniu przewodu diody zaczęły migać w pewnej sekwencji a dokładniej najpierw migały dwie zewnętrzne potem dwie w środku i potem jeszcze dwie inne (i tak się to cały czas powtarzało). Miganie diod nie ulegało żadnej zmianie przy zbliżaniu palca do przewodu. Ciekawi mnie czemu diody migały w takiej sekwencji a nie świeciły się np. 3 a potem po zbliżeniu palca wszystkie tak jak w opisanym kursie? (Odnośnie przykładu z kursu) Nasuwa się pytanie czemu potem świeciły wszystkie diody jak w kodzie są warunki, że może się świecić tylko jedna dioda? Nie wiem też czemu po zbliżeniu palca zapaliły się wszystkie diody.
farmaceuta Wrzesień 8, 2022 Udostępnij Wrzesień 8, 2022 24 minuty temu, Wojtek777 napisał: Witam, mam dwa pytania: Chciałem sprawdzić właśnie co się stanie jeżeli zapisze bez .0 (czyli 5/1024). Z kursu wynika, że wyświetlany wynik powinien być liczbą całkowitą (czyli np. zamiast 1,8 V będzie 2V). U mnie cały czas wyświetla się tylko 0.00 (pomimo zmieniania wartości potencjometru). Z czego może to wynikać? Np. ze złego podłączenia potencjometru...możliwe że do wyjścia potencjometru podpisałeś masę...
Treker (Damian Szymański) Wrzesień 9, 2022 Udostępnij Wrzesień 9, 2022 16 godzin temu, Wojtek777 napisał: Z kursu wynika, że wyświetlany wynik powinien być liczbą całkowitą (czyli np. zamiast 1,8 V będzie 2V). U mnie cały czas wyświetla się tylko 0.00 (pomimo zmieniania wartości potencjometru). @Wojtek777 pokaż dla formalności cały program testowy 16 godzin temu, Wojtek777 napisał: Miganie diod nie ulegało żadnej zmianie przy zbliżaniu palca do przewodu. Czy na pewno przewód był podłączony do (odpowiedniego) wyjścia Arduino? Nie odłączyłeś go przypadkiem "po drugiej stronie"? 16 godzin temu, Wojtek777 napisał: (Odnośnie przykładu z kursu) Nasuwa się pytanie czemu potem świeciły wszystkie diody jak w kodzie są warunki, że może się świecić tylko jedna dioda? Nie wiem też czemu po zbliżeniu palca zapaliły się wszystkie diody. W tamtym programie jest tylko minimalne opóźnienie. Pętla wykonywana jest bardzo szybko, więc w praktyce na pewno na raz świeciła tylko jedna dioda, jednak przełączanie działo się tak szybko, że ludzkie oko tego nie dostrzegało. jeśli zwiększysz opóźnienie np. do 200 ms to powinieneś widzieć, że jednocześnie świeci tylko jedna dioda.
Wojtek777 Wrzesień 9, 2022 Udostępnij Wrzesień 9, 2022 kod wygląda następująco int odczytanaWartosc = 0; float napiecie = 0; void setup() { Serial.begin(9600); } void loop() { odczytanaWartosc = analogRead(A5); napiecie = odczytanaWartosc * (5/1024); Serial.println(napiecie); delay(200); } Jeżeli wcześniej było 5.0/1024.0 wszystko było ok. Potem sprawdziłem 5.0/1024 i też było ok ale jak pisze już 5/1024 to wyskakują w terminalu same 0.00. Przewód był (i jest bo teraz jeszcze raz zmontowałem układ). Przewód odłączyłem wtedy przy potencjometrze. Teraz też sprawdziłem gdybym odłączył go przy pinie A5 i sytuacja taka sama czyli miganie diodami. Teraz już rozumiem czemu wydawało mi się, że świeciło kilka diod na raz ale dalej nie rozumiem czemu po zbliżeniu palca miałaby się zwiększyć ilość świecących diod.
H1M4W4R1 Wrzesień 9, 2022 Udostępnij Wrzesień 9, 2022 20 godzin temu, Wojtek777 napisał: Chciałem sprawdzić właśnie co się stanie jeżeli zapisze bez .0 (czyli 5/1024). Z kursu wynika, że wyświetlany wynik powinien być liczbą całkowitą (czyli np. zamiast 1,8 V będzie 2V). U mnie cały czas wyświetla się tylko 0.00 (pomimo zmieniania wartości potencjometru). Z czego może to wynikać? Nie widzę odpowiedzi, więc odpowiem: Tak będzie to liczba całkowita, ale nie tak jak uważasz. Komputer najpierw podzieli 5 przez 1024, a potem zaokrągli to do liczby całkowitej. Będzie to mniej więcej równoznaczne temu zapisowi: (int) 5.0/1024; // lub (int) 5.0/1024.0; Czyli 5/1024 to jakieś 0.004 po ucięciu miejsca po przecinku zostaje Ci 0. Stąd zwracanie samego zera. Komputer nie jest tak inteligentny jak Ty i zamienia na liczbę całkowitą to, co mu każesz zamienić na liczbę całkowitą (nie jest w stanie domyślić się, że chodzi Ci o wynik). 11 minut temu, Wojtek777 napisał: napiecie = odczytanaWartosc * (5/1024); Problemem jest nawias, który każe najpierw policzyć wynik z dzielenia i zamienić go na liczbę całkowitą. Usunięcie powinno pomóc. Czytaj: spróbuj tak: napiecie = (odczytanaWartosc * 5) / 1024; // nawias jest zbędny, ale ułatwia zrozumienie co myśli komputer Wtedy wynik powinien być prawidłowy. 1 1
Wojtek777 Wrzesień 9, 2022 Udostępnij Wrzesień 9, 2022 @H1M4W4R1 Wielkie dzięki za tak fajny sposób wytłumaczenia. Teraz ma to dla mnie sens. Jest dokładnie tak jak napisałeś, po zmianie miejsca nawiasów otrzymuje liczby całkowite. 1
Danyeru Wrzesień 13, 2022 Udostępnij Wrzesień 13, 2022 Myślałem, że pyknę dzisiaj 3 ostatnie zadania i przejdę dalej. O jakże się myliłem, o ile z dwoma fotorezystorami sobie poradziłem, to pozostałe dwa pochłonęły mnie na niemal cały dzień. 4.4 int readValue = 0; //Zmienna przechowujaca odczyt ADC z A5 (dzielnik napiecia) int prog = 0; //Zmienna przechowujaca odczyt odczyt ADC z A4 (potencjometr) boolean info = true; //Decyzja czy wyslac info void setup() { pinMode(8, OUTPUT); //Konfiguracja wyjscia pod LED Serial.begin(9600); //Ururchomienie transzmisji z UART } void loop() { readValue = analogRead(A5); //Odczyt wartosci z ADC - dzielnik prog = analogRead(A4); //Odczyt warosci z ADC - potencjometr if (readValue < prog) { //Czy jest ciemniej od ustawionego progu digitalWrite(8, HIGH); //Wlacz diode if (info) { //Jezeli trzeba wyslac komunikat float napiecie = readValue * (5.0 / 1023.0); //Obliczenie napieca Serial.print("Odczytano: "); // Komunikat Serial.print(napiecie); Serial.println(" V"); info = false; //Kolejny komunikat jest niepotrezbny } } else { digitalWrite(8, LOW); //Wylaczenie diody info = true; //Kolejny komunikat jest potrzebny } delay(50); } 4.5 #define red 8 #define yellow1 9 #define yellow2 10 #define green 11 #define button 12 int pote = 0; //Wartosc 0-1023 odczytana z potencjometru String liczba = ""; //Odpowiedz wprowadzona przez uart int liczba_int = 0; //Zmienna przekonwertowana ze string na int void setup() { Serial.begin(9600); //Uruchomienie komunikacji UART pinMode(green, OUTPUT); //Konfiguracja pinow dla LED pinMode(yellow1, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(red, OUTPUT); pinMode(button, INPUT_PULLUP); //Konfiguracja pinu pod guzik } void loop() { //Ustawienie pozycji poczatkowej digitalWrite(green, LOW); digitalWrite(yellow1, LOW); digitalWrite(yellow2, LOW); digitalWrite(red, LOW); Serial.println("Witaj w grze!"); Serial.println("Ustaw potencjomentr i odgadnij jego wartość"); Serial.println("Masz 3 próby"); Serial.println(" "); Serial.println("Przekręć potencjometr i naciśnij przysick"); pote = analogRead(A5); //Odczyt wartosci potencjometru while (digitalRead(button) == HIGH) {} //Kiedy wcisnieto przycisk delay(50); Serial.println("Podaj liczbę od 0 do 1023"); Serial.println("Masz trzy próby"); while(Serial.available() == 0) {} //Czekaj na nowe dane (przy > 0 leci automatycznie) liczba = Serial.readStringUntil('\n'); //Odczyt danych z portu liczba_int = liczba.toInt(); //Konwersja danych z portu do zmiennej liczbowej if(liczba_int - 50 <= pote && liczba_int + 50 >= pote) { //Warunek wykonywany jezeli liczba jest do +/-50 taka jak wartosc odczytana z potencjometru digitalWrite(green, HIGH); //Wlaczenie zielonej diody Serial.println("Wygrałeś!"); Serial.print("Ustawiona wartość to: "); Serial.println(pote); //Wyswietlenie aktualnej wartosci potencjometru delay(5000); } else { digitalWrite(yellow1, HIGH); //Wlaczenie zoltej diody Serial.println("Niestety - zła liczba"); Serial.println("Spróbuj jeszcze raz - zostały Ci dwie próby"); while(Serial.available() == 0) {} //Czekaj na nowe dane liczba = Serial.readStringUntil('\n'); //Odczyt danych z portu liczba_int = liczba.toInt(); //Konwersja odebranych danych do zmiennej liczbowej if(liczba_int - 50 <= pote && liczba_int + 50 >= pote) { //Porownanie liczbe w kolejnej probie digitalWrite(yellow1, LOW); //Wylaczenie pierwszej zoltej diody digitalWrite(green, HIGH); //Wlaczenie zielonej diody Serial.println("Wygrałeś!"); Serial.print("Ustawiona wartość to: "); Serial.println(pote); //Wyswietlenie aktualnej wartosci potencjometru delay(5000); } else { Serial.println("Niestety - zła liczba"); Serial.println("Spróbuj jeszcze raz - została Ci ostatnia próba"); digitalWrite(yellow1, HIGH); //Zapalenie obu zoltych diod digitalWrite(yellow2, HIGH); while(Serial.available() == 0) {} //Czekaj na nowe dane liczba = Serial.readStringUntil('\n'); //Odczyt danych z portu liczba_int = liczba.toInt(); //Konwersja odebranych danych do zmiennej liczbowej if(liczba_int - 50 <= pote && liczba_int + 50 >= pote) { //Porownianie liczby w ostatniej probie digitalWrite(yellow1, LOW); //Wylaczenie obu zoltych diod digitalWrite(yellow2, LOW); digitalWrite(green, HIGH); //Wlaczenie zielonej diody Serial.println("Wygrałeś!"); Serial.print("Ustawiona wartość to: "); Serial.println(pote); //Wyswietlenie aktualnej wartosci potencjometru delay(5000); } else { digitalWrite(yellow1, LOW); //Wylaczenie obu zoltych LEDow digitalWrite(yellow2, LOW); digitalWrite(red, HIGH); //Wlaczenie czerwonej diody Serial.println("Koniec Gry"); Serial.println("Niestety - przegrałeś!"); Serial.print("Ustawiona wartość to: "); Serial.println(pote); //Wyswietlenie aktualnej wartosci potencjometru delay(5000); } } } } 4.6 #define leftLED 8 //Zdefioniowanie pinow #define midLeft 9 #define midLED 10 #define midRight 11 #define rightLED 12 int readLeft = 0; //Zmienna do odczytu ADC z A5 int readRight = 0; //Zmienna do odczytu ADC z A4 int fotoSuma = 0; //Zmienna z sumy z odczytow A4+A5 void setup() { Serial.begin(9600); //Uruchomienie komunikacji UART pinMode(leftLED, OUTPUT); //Konfiguracja LED pinMode(midLeft, OUTPUT); pinMode(midLED, OUTPUT); pinMode(midRight, OUTPUT); pinMode(rightLED, OUTPUT); } void loop() { readLeft = analogRead(A5); //Odczyt ADC z pinu A5 readRight = analogRead(A4); //Odczyt ADC z pinu A4 readLeft = map(readLeft, 0, 1023, -2, 2); //Mapowanie-konwersja odczytow z lewej readRight = map(readRight, 0, 1023, 2, -2); //Mapowanie-konwersja odczytow z prawej fotoSuma = readLeft + readRight; Serial.print("Lewy = "); //Wysłanie odczytow na monitor Serial.println(readLeft); Serial.print("Prawy = "); Serial.println(readRight); Serial.print("Suma = "); Serial.println(fotoSuma); if (fotoSuma == 2) { digitalWrite(leftLED, HIGH); digitalWrite(midLeft, LOW); digitalWrite(midLED, LOW); digitalWrite(midRight, LOW); digitalWrite(rightLED, LOW); } else if (fotoSuma == 1) { digitalWrite(leftLED, LOW); digitalWrite(midLeft, HIGH); digitalWrite(midLED, LOW); digitalWrite(midRight, LOW); digitalWrite(rightLED, LOW); } else if (fotoSuma == 0) { digitalWrite(leftLED, LOW); digitalWrite(midLeft, LOW); digitalWrite(midLED, HIGH); digitalWrite(midRight, LOW); digitalWrite(rightLED, LOW); } else if (fotoSuma == -1) { digitalWrite(leftLED, LOW); digitalWrite(midLeft, LOW); digitalWrite(midLED, LOW); digitalWrite(midRight, HIGH); digitalWrite(rightLED, LOW); } else if (fotoSuma == -2) { digitalWrite(leftLED, LOW); digitalWrite(midLeft, LOW); digitalWrite(midLED, LOW); digitalWrite(midRight, LOW); digitalWrite(rightLED, HIGH); } else { digitalWrite(leftLED, LOW); digitalWrite(midLeft, LOW); digitalWrite(midLED, LOW); digitalWrite(midRight, LOW); digitalWrite(rightLED, LOW); } delay(50); } 1
Treker (Damian Szymański) Wrzesień 14, 2022 Udostępnij Wrzesień 14, 2022 @Danyeru czasami niestety tak bywa, pozornie proste zadania mogą zająć dużo czasu. Super, że się udało - powodzenia w dalszych eksperymentach 1
Wejmon Październik 24, 2022 Udostępnij Październik 24, 2022 Czwarta lekcja pozornie prosta, swoimi zadaniami zatrzymała mnie na dobre kilkanaście godzin. Nie było łatwo, ale ostatecznie udało się! Gdyby ktoś potrzebował pomocy, poniżej podrzucam własne spostrzeżenia oraz działające kody programów do zadań domowych Zadanie domowe nr 4.4 int odczytanaWartosc = 0; int prog = 0; void setup() { pinMode(8, OUTPUT); Serial.begin(9600); } void loop() { odczytanaWartosc = analogRead(A5); prog = analogRead(A4); if (odczytanaWartosc < prog) { digitalWrite(8, HIGH); Serial.println(odczytanaWartosc); //Podanie wartości z ADC ("fotorezystor") while(analogRead(A5) < prog) {} //Pętla blokująca delay(50); //Niwelowanie zakłóceń } else { digitalWrite(8, LOW); } delay(50); } Zadanie domowe nr 4.5 Najtrudniejsza praca domowa z całej lekcji Do rozwiązania tego zadania wykorzystałem zapis (".toInt") w celu zamiany ciągu znaków na wartość oraz operator ("&&"). Więcej na ten temat możecie znaleźć na oficjalnej stronie Arduino: (".toInt") [link], ("&&") [link]: String liczbaPodana = ""; int potencjometr = 0; int liczba = 0; int proba = 1; //Rozpoczymany grę z liczbą prób równą 1 #define przycisk 13 #define zielona 12 #define zolta 11 #define czerwona_1 10 #define czerwona_2 9 void setup() { pinMode(przycisk, INPUT_PULLUP); pinMode(zielona, OUTPUT); pinMode(zolta, OUTPUT); pinMode(czerwona_1, OUTPUT); pinMode(czerwona_2, OUTPUT); digitalWrite(zielona, LOW); digitalWrite(zolta, LOW); digitalWrite(czerwona_1, LOW); digitalWrite(czerwona_2, LOW); Serial.begin(9600); Serial.println("*** Mistrz Arduino ***"); Serial.println(); Serial.println("Zasady gry:"); Serial.println("1. Przekrec potencjometrem"); Serial.println("2. Nacisnij przycisk"); Serial.println(); } void loop() { while (digitalRead(przycisk) == HIGH) {} //Czekaj do momentu wciśnięcia przycisku delay(50); potencjometr = analogRead(A5); Serial.println("Podaj liczbe od 0 do 1023"); Serial.println(); while (Serial.available() == 0) {} //Czekaj do momentu podania liczby delay(50); if (Serial.available() > 0) { liczbaPodana = Serial.readStringUntil('\n'); liczba = liczbaPodana.toInt(); //Zmiana znaków na wartość (int) } if ((potencjometr - 50 <= liczba) && (potencjometr + 50 >= liczba)) { //Warunek wygranej digitalWrite(zielona, HIGH); digitalWrite(zolta, LOW); digitalWrite(czerwona_1, LOW); digitalWrite(czerwona_2, LOW); Serial.println("Gratulacje! Wygrana!"); Serial.println("Dokladna wartosc potencjometru to:"); Serial.println(potencjometr); } else if (proba == 3) { digitalWrite(zielona, LOW); digitalWrite(zolta, HIGH); digitalWrite(czerwona_1, HIGH); digitalWrite(czerwona_2, HIGH); Serial.println("A to pech! Koniec gry!"); Serial.println("Dokladna wartosc potencjometru to:"); Serial.println(potencjometr); } else if (proba == 2) { digitalWrite(zielona, LOW); digitalWrite(zolta, HIGH); digitalWrite(czerwona_1, HIGH); digitalWrite(czerwona_2, LOW); proba = proba + 1; Serial.println("Pudlo! Ostatnia szansa!"); Serial.println("Nacisnij przycisk"); Serial.println(); } else { digitalWrite(zielona, LOW); digitalWrite(zolta, HIGH); digitalWrite(czerwona_1, LOW); digitalWrite(czerwona_2, LOW); proba = proba + 1; Serial.println("Pudlo! Sprobuj jesze raz!"); Serial.println("Nacisnij przycisk"); Serial.println(); } } Zadanie domowe 4.6 Nieco prostsze od poprzedniego, ale mimo wszystko zachowujące "wysoki" poziom int odczytanaWartosc_L = 0; int odczytanaWartosc_P = 0; int wartosc_L = 0; int wartosc_P = 0; int wynik = 0; #define dioda_L2 12 //Diody przypisane do lewgo fotorezystora #define dioda_L1 11 #define dioda_S 10 //Dioda środkowa #define dioda_P1 9 //Diody przypisane do prawego fotorezystora #define dioda_P2 8 void setup() { Serial.begin(9600); pinMode(dioda_L2, OUTPUT); pinMode(dioda_L1, OUTPUT); pinMode(dioda_S, OUTPUT); pinMode(dioda_P1, OUTPUT); pinMode(dioda_P2, OUTPUT); digitalWrite(dioda_L2, LOW); digitalWrite(dioda_L1, LOW); digitalWrite(dioda_S, LOW); digitalWrite(dioda_P1, LOW); digitalWrite(dioda_P2, LOW); } void loop() { odczytanaWartosc_L = analogRead(A4); //Wartość lewego fotorezystora odczytanaWartosc_P = analogRead(A5); //Wartość prawego fotorezystora wartosc_L = map(odczytanaWartosc_L, 0, 1023, -2, 2); wartosc_P = map(odczytanaWartosc_P, 0, 1023, 2, -2); wynik = wartosc_L + wartosc_P; Serial.println("Lewy fotorezystor:"); Serial.println(odczytanaWartosc_L); Serial.println("Prawy fotorezystor:"); Serial.println(odczytanaWartosc_P); Serial.println(); if (wynik >= 2) { //Wynik większy bądź równy 2 digitalWrite(dioda_L2, HIGH); digitalWrite(dioda_L1, LOW); digitalWrite(dioda_S, LOW); digitalWrite(dioda_P1, LOW); digitalWrite(dioda_P2, LOW); } else if (wynik == 1) { digitalWrite(dioda_L2, LOW); digitalWrite(dioda_L1, HIGH); digitalWrite(dioda_S, LOW); digitalWrite(dioda_P1, LOW); digitalWrite(dioda_P2, LOW); } else if (wynik == 0) { digitalWrite(dioda_L2, LOW); digitalWrite(dioda_L1, LOW); digitalWrite(dioda_S, HIGH); digitalWrite(dioda_P1, LOW); digitalWrite(dioda_P2, LOW); } else if (wynik == -1) { digitalWrite(dioda_L2, LOW); digitalWrite(dioda_L1, LOW); digitalWrite(dioda_S, LOW); digitalWrite(dioda_P1, HIGH); digitalWrite(dioda_P2, LOW); } else { //Wynik mniejszy niż -1 digitalWrite(dioda_L2, LOW); digitalWrite(dioda_L1, LOW); digitalWrite(dioda_S, LOW); digitalWrite(dioda_P1, LOW); digitalWrite(dioda_P2, HIGH); } delay(50); } 1
Treker (Damian Szymański) Październik 25, 2022 Udostępnij Październik 25, 2022 @Wejmon dobra robota i życzę udanych dalszych eksperymentów 1
Abraxos Listopad 21, 2022 Udostępnij Listopad 21, 2022 (edytowany) Może i ja pochwalę się zrobionymi zdaniami, i chętnie wysłucham wskazówek Zadanie 4.5 Z tym się dwa dni męczyłem, mam nadzieje że wszystko jest okej. Tak mi się spodobała ta gierka że przeniosę ja po świętach do realnego świata, już z obsługą OLEDa i drukowaną obudową pochwalę się na forum rezultatem. #define przycisk 7 // definicja nazw pinow #define zolty 8 #define zielony 9 #define czerwony 10 int komputer = 0; // wartosc potencjometru String odpgracza = ""; // odpowiec z uart int liczbagracza = 0; // przekonwertowana odpowiedz int zycia = 0; void setup() { Serial.begin(9600); // wlaczenie komunikacji pinMode(7, INPUT_PULLUP); // konfiguracja pin switch pinMode(8, OUTPUT); // 3x konfig led pin pinMode(9, OUTPUT); pinMode(10, OUTPUT); delay(1100); Serial.println("Witaj w grze!"); delay(500); Serial.println("Masz 3 proby na zgadnięcie liczby"); delay(500); Serial.println("Zakres od 0 do 1023, mozesz pomylic sie o 50"); delay(500); Serial.print("."); delay(700); Serial.print("."); delay(700); Serial.println("."); delay(700); Serial.println("Przekrec potencjometr i i kliknij przycisk"); while (digitalRead(przycisk) == HIGH) {} // pusta petla, czekaj az przycisk zostanie wcisniety komputer = analogRead(A5); // zapisz przekrecony potencjometr do zmiennej jako liczba pc Serial.println("Podaj liczbę z zakresu 0 do 1023"); // polecenie kompa } void loop() { while (Serial.available() == 0) { // czekaj az zostana odebrane dane } if (Serial.available() > 0) { // jesli dane zostaly odebrane odpgracza = Serial.readStringUntil('\n'); // zapisz dane do konca linii, do zmiennej liczbagracza = odpgracza.toInt(); // zmien zmienna string na int } if (liczbagracza + 50 >= komputer && liczbagracza - 50 <= komputer) { // warunke wygranej digitalWrite(zielony, HIGH); Serial.println("Brawo zgadles"); delay(1000); Serial.print("Twoja liczba to: "); Serial.println(liczbagracza); delay(500); Serial.print("Dokladna liczba pc to: " + komputer); Serial.println(komputer); delay(2000); Serial.println("Jeśli chcesz zagrać ponownie, wcisnij przycisk reset"); } else if (zycia == 0) { // warunek pudla digitalWrite(zolty, HIGH); Serial.println("Niestety, nie trafiles. Sprobuj jeszcze raz"); delay(2000); digitalWrite(zolty, LOW); zycia++; Serial.println("Podaj liczbę z zakresu 0 do 1023"); // polecenie kompa } else if (zycia == 1) { // warunek drugiego pudla digitalWrite(zolty, HIGH); Serial.println("Niestety, nie trafiles. Sprobuj jeszcze raz"); delay(2000); digitalWrite(zolty, LOW); zycia++; Serial.println("Podaj liczbę z zakresu 0 do 1023"); // polecenie kompa } else if (zycia == 2) { // warunek 3 pudla digitalWrite(zolty, HIGH); Serial.println("Niestety, nie trafiles. Sprobuj jeszcze raz"); delay(2000); digitalWrite(zolty, LOW); zycia++; Serial.println("Podaj liczbę z zakresu 0 do 1023"); // polecenie kompa } else { // warunek 4 pudla, czyli to co sie dzieje jezeli zaden z warunkow nie zostanie spelniony digitalWrite(czerwony, HIGH); Serial.println("Niestety, to juz koniec"); delay(2000); Serial.println("Jezeli chcesz zagrac ponownie kliknij reset"); // polecenie kompa } } Zadanie 4.6 Tutaj było stosunkowo łatwo, jedyny czasochłonny moment to ustalenie zakresów świecenia lewej i prawej strony. Ale teraz tak o tym myślę i wydaje mi się że łatwiej było by zrobić fotoR1 > fotoR2, zamiast męczyć się z dopasowaniem wartości. #define zolty1 12 // definicja pinow #define zolty2 11 #define zielony 10 #define czerwony1 9 #define czerwony2 8 int fotoR1 = 0; // fotorezystorow int fotoR2 = 0; void setup() { pinMode(zolty1, OUTPUT); // konfiguracja pinow pinMode(zolty2, OUTPUT); pinMode(zielony, OUTPUT); pinMode(czerwony1, OUTPUT); pinMode(czerwony2, OUTPUT); digitalWrite(zolty1, LOW); // wylaczenie led digitalWrite(zolty2, LOW); digitalWrite(zielony, LOW); digitalWrite(czerwony1, LOW); digitalWrite(czerwony2, LOW); } void loop() { fotoR1 = analogRead(A0); // przypisanie wartosci adc do zmiennych fotoR2 = analogRead(A1); if (fotoR1 > 100) { // warunek 1 lewa stona digitalWrite(zolty1, HIGH); digitalWrite(zolty2, HIGH); digitalWrite(zielony, LOW); digitalWrite(czerwony1, LOW); digitalWrite(czerwony2, LOW); } else if (fotoR2 > 90) { // warunek 2 prawa strona digitalWrite(zolty1, LOW); digitalWrite(zolty2, LOW); digitalWrite(zielony, LOW); digitalWrite(czerwony1, HIGH); digitalWrite(czerwony2, HIGH); } else if (fotoR1 > 40 && fotoR2 > 40) { // warunek 3 srodek digitalWrite(zolty1, LOW); digitalWrite(zolty2, LOW); digitalWrite(zielony, HIGH); digitalWrite(czerwony1, LOW); digitalWrite(czerwony2, LOW); } else { // bez tego ciagle swiecila zielona, bo nigdzie nie było komendy wyłącz tą diode digitalWrite(zolty1, LOW); digitalWrite(zolty2, LOW); digitalWrite(zielony, LOW); digitalWrite(czerwony1, LOW); digitalWrite(czerwony2, LOW); } } Edytowano Listopad 21, 2022 przez Abraxos 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ę »