Rakragul Lipiec 25, 2019 Udostępnij Lipiec 25, 2019 (edytowany) Czy zadanie 4.5 w ogóle da się zrobić wykorzystując wiedzę TYLKO zaczerpniętą z tego kursu? Bo na moje to wychodzi, że nie.... Kolejne pytanko, zanim włączę grę przyciskiem, wpisuje sobie losowo jakieś liczby do terminala(niech będzie, że 5 różnych liczb). Dlaczego po naciśnięciu przycisku 5 razy, Arduino wszystkie je "wypluwa", gdzie i w jaki sposób je przechowuje? Skoro wartość podana przez terminal jest przypisywana zmiennej, to każde nowe wprowadzenie powinno zmienić przypis? #define greenLed 8 #define yellowLed 9 #define redLed 10 #define startButton 13 int generatedNumber = 0; String stringNumber = ""; int intNumber = 0; int tryCounter = 0; void setup() { Serial.begin(9600); pinMode(greenLed, OUTPUT); pinMode(yellowLed, OUTPUT); pinMode(redLed, OUTPUT); pinMode(startButton, INPUT_PULLUP); digitalWrite(greenLed, LOW); digitalWrite(yellowLed, LOW); digitalWrite(redLed, LOW); } void loop() { //generatedNumber = analogRead(A5); // if (digitalRead(startButton) == LOW) { Serial.println("Enter the number"); if (Serial.available() > 0) { stringNumber = Serial.readStringUntil('\n'); // intNumber = stringNumber.toInt(); // convert string to int Serial.println(intNumber); } } delay(250); } Edytowano Lipiec 25, 2019 przez Rakragul
Treker (Damian Szymański) Lipiec 27, 2019 Udostępnij Lipiec 27, 2019 Dnia 25.07.2019 o 23:22, Rakragul napisał: Czy zadanie 4.5 w ogóle da się zrobić wykorzystując wiedzę TYLKO zaczerpniętą z tego kursu? Bo na moje to wychodzi, że nie.... Tak masz rację, jest tutaj mały podstęp, bo trzeba wygooglać jak zamienić odebrany tekst na liczbę Dnia 25.07.2019 o 23:22, Rakragul napisał: Kolejne pytanko, zanim włączę grę przyciskiem, wpisuje sobie losowo jakieś liczby do terminala(niech będzie, że 5 różnych liczb). Dlaczego po naciśnięciu przycisku 5 razy, Arduino wszystkie je "wypluwa", gdzie i w jaki sposób je przechowuje? Skoro wartość podana przez terminal jest przypisywana zmiennej, to każde nowe wprowadzenie powinno zmienić przypis? Wszystkie dane trzymane są w buforze (to działa "w tle"). Więc faktycznie, Arduino zapamiętuje wartości wysłane do niego przed rozpoczęciem gry. Ten problem można jednak rozwiązać bardzo prosto. Wystarczy, że po rozpoczęciu gry odczytasz szybko wszystkie dane z bufora i zwyczajnie nic z nimi nie zrobisz
emBeb0n Sierpień 26, 2019 Udostępnij Sierpień 26, 2019 @Treker, chyba powinno być: "Uruchomienie komunikacji przez UART" (a nie USART)? 1
Treker (Damian Szymański) Sierpień 26, 2019 Udostępnij Sierpień 26, 2019 @emBeb0n nie jest to błędem, ale przy najbliższej okazji będę ujednolicał ten zapis. Dzięki za zwrócenie uwagi Tutaj masz przykład z dokumentacji Arduino: Cytat All Arduino boards have at least one serial port (also known as a UART or USART), and some have several. Źródło: https://www.arduino.cc/reference/en/language/functions/communication/serial/
husadam5 Wrzesień 19, 2019 Udostępnij Wrzesień 19, 2019 "Jeśli wysłana do Arduino liczba będzie zgadzała się z odczytem ADC o +/- 50, to gracz wygrywa. W przeciwnym wypadku włącza się żółta dioda i gracz ma jeszcze 2 próby. Gdy za każdym razem zostanie wpisana zła liczba, to na płytce stykowej włącza się czerwona dioda. Natomiast w przypadku wygranej zielona." Nie do końca rozumiem jak zinterpretować ten tekst. Gdy podam złą liczbę, nie mieszczącą się w zakresie to ma zapalić się żółta i czerwona, czy raz żółta a raz czerwona, czy obie na raz? Może po 3 próbach ma się zapalić czerwona, ale czy wtedy ma się zapalić też żółta?
Treker (Damian Szymański) Wrzesień 20, 2019 Udostępnij Wrzesień 20, 2019 @husadam5 czerwona dioda powinna włączać się w momencie, gdy gracz przegra (czyli za każdym razem wpisze złą wartość). Dioda pomarańczowa ma sygnalizować błędne podanie wartości, może (ale nie musi) świecić się po trzeciej złej odpowiedzi. To nie jest tutaj kluczowe
Xanatos Wrzesień 26, 2019 Udostępnij Wrzesień 26, 2019 Cześć, Napisałem taki program w którym jedna z diod (skrajna lewa - 12) nie chce się zapalać. Pozostałe 4 działają superaśnie. Czy ktoś jest w stanie mi pomóc z tym probemem? #define LF A0 #define PF A5 int roznica=0; int fotoLewy=0; int fotoPrawy=0; String fotoPrawy_Str=""; String fotoLewy_Str=""; String roznica_Str=""; void setup() { Serial.begin(9600); //Uruchomienie komunikacji z PC pinMode(8,OUTPUT); //Konfiguracja wyjść diod pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(11,OUTPUT); pinMode(12,OUTPUT); } void loop(){ fotoLewy=analogRead(LF); fotoPrawy=analogRead(PF); delay(1000); fotoPrawy_Str=fotoPrawy; fotoLewy_Str=fotoLewy; Serial.println("Lewy " + fotoLewy_Str + " Prawy " + fotoPrawy_Str); roznica = analogRead(LF)-analogRead(PF); roznica_Str = roznica; Serial.println(" Różnica" + roznica_Str); roznica = map(roznica, -1000, 1000, 1, 5);//Przeskalowanie wartości if (roznica == 1) { //Skrajna prawa dioda digitalWrite(8, HIGH); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); } else if (roznica == 2) { //prawa dioda digitalWrite(8, LOW); digitalWrite(9, HIGH); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); } else if (roznica == 3) { //środkowa dioda digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, HIGH); digitalWrite(11, LOW); digitalWrite(12, LOW); } else if (roznica == 4) { //lewa dioda digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, LOW); } else if (roznica == 5){ //skrajna lewa dioda digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); } delay(50); }
Treker (Damian Szymański) Wrzesień 26, 2019 Udostępnij Wrzesień 26, 2019 @Xanatos witam na forum A sprawdziłeś czy zmienna różnica przyjmuje kiedykolwiek taką wartość, która powinna włączyć tę diodę? Jakie maksymalnie różnice odczytów fotorezystorów uzyskujesz? PS Kody programów należy umieszczać za pomocą odpowiedniego narzędzia dostępnego w edytorze (przycisk "Wstaw kod"). Programy są wtedy prezentowane w czytelny sposób, a ich składania jest kolorowana. Tym razem poprawiłem to za Ciebie, ale pamiętaj o tej opcji w przyszłości. Z góry dziękuję za zrozumienie
Xanatos Wrzesień 26, 2019 Udostępnij Wrzesień 26, 2019 7 minut temu, Treker napisał: @Xanatos witam na forum A sprawdziłeś czy zmienna różnica przyjmuje kiedykolwiek taką wartość, która powinna włączyć tę diodę? Jakie maksymalnie różnice odczytów fotorezystorów uzyskujesz? PS Kody programów należy umieszczać za pomocą odpowiedniego narzędzia dostępnego w edytorze (przycisk "Wstaw kod"). Programy są wtedy prezentowane w czytelny sposób, a ich składania jest kolorowana. Tym razem poprawiłem to za Ciebie, ale pamiętaj o tej opcji w przyszłości. Z góry dziękuję za zrozumienie Ok, będę pamiętał Dzięki za pomoc. Problem rozwiązała zmiana wartości wyjściowej z 1 , 5 na 1, 6
Treker (Damian Szymański) Wrzesień 26, 2019 Udostępnij Wrzesień 26, 2019 @Xanatos to nie jest rozwiązanie problemu tylko jego obejście Podejrzyj jakie warto pojawiają się w tych zmiennych i zmień odpowiednio zakres danych wejściowych.
Xanatos Wrzesień 26, 2019 Udostępnij Wrzesień 26, 2019 Ok pozmieniałem zakres danych wejściowych na wartości trochę mniejsze od tych pojawiających się w zmiennych i też działa 1
Itap88 Październik 3, 2019 Udostępnij Październik 3, 2019 int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC int prog = 0; float napiecie = 0; bool asis = 0; void setup() { pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED Serial.begin(9600); } void loop() { odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC prog = analogRead(A4); if (odczytanaWartosc < prog) { digitalWrite(8, HIGH);//Włączenie diody if (asis == 0) { napiecie = odczytanaWartosc * 5.0 / 1023.0; Serial.println("Napięcie wynosi "+(napiecie)+" Voltów"); } asis = 1; } else { digitalWrite(8, LOW);//Wyłączenie diody asis = 0; } delay(50); } Zastanawia mnie, dlaczego 'Serial.println("Napięcie wynosi "+(napiecie)+" Voltów");' zostaje uznane za błąd.
Treker (Damian Szymański) Październik 4, 2019 Udostępnij Październik 4, 2019 @Itap88 witam na forum 11 godzin temu, Itap88 napisał: Zastanawia mnie, dlaczego 'Serial.println("Napięcie wynosi "+(napiecie)+" Voltów");' zostaje uznane za błąd. Taki zapis nie działa, ponieważ nie można w takim przypadku łączyć operatorem plusa 3 wartości. Możesz to rozpisać na dwie linijki lub wykorzystać bardziej zaawansowaną funkcję sprintf (ale to na początku może wydawać się trochę trudne). Więcej na ten temat znajdziesz w dokumentacji Arduino: https://forum.arduino.cc/index.php?topic=324733.0 PS Kody programów należy umieszczać za pomocą odpowiedniego narzędzia dostępnego w edytorze (przycisk "Wstaw kod"). Programy są wtedy prezentowane w czytelny sposób, a ich składania jest kolorowana. Tym razem poprawiłem to za Ciebie, ale pamiętaj o tej opcji w przyszłości. Z góry dziękuję za zrozumienie i pomoc w utrzymaniu porządku na forum
Itap88 Październik 4, 2019 Udostępnij Październik 4, 2019 int lives; int right; int guess; String sent; 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); } 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 - 50) < guess < (right + 50)){ digitalWrite(8, HIGH); return; }else{ digitalWrite(9, HIGH); lives = lives - 1; } } } Próbowałem zrobić zadanie 4.5. Wydaje mi się, że ten kod powinien działać, ale zielona(8) i żółta(9) dioda nie zapalają się w ogóle, a czerwona(10) włączyła się tylko raz po podaniu 3 błędnych odpowiedzi. Potencjometr jest podłączony do A5, a jako przycisk postanowiłem użyć tego już wbudowanego w płytkę. Co zrobiłem źle?
Treker (Damian Szymański) Październik 4, 2019 Udostępnij Październik 4, 2019 2 minuty temu, Itap88 napisał: Potencjometr jest podłączony do A5, a jako przycisk postanowiłem użyć tego już wbudowanego w płytkę. Co zrobiłem źle? @Itap88 zacznijmy od najważniejszego... Na Arduino UNO nie ma żadnego przycisku, który można wykorzystać we własnych programach. Jest tam ewentualnie tylko RESET... Co dokładnie wykorzystałeś w roli przycisku? Po drugie w Arduino nie można tworzyć warunków tego typu: if((right - 50) < guess < (right + 50)){ Jest wiele sposobów na rozwiązanie tego problemu (np. najprostszy to rozbicie tego na dwa warunki), ale na pewno nie można robić tego tak, jak w cytowanym tutaj fragmencie. 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ę »