lleymann Listopad 16, 2020 Udostępnij Listopad 16, 2020 (edytowany) Cześć, Mam problem ze swoim kodem co do zadania 4.5. Mianowicie działa OK, ale nie wiem, gdzie powinienem wkleić linijkę, która wyświetla napis "Podaj liczbę"? Teraz Arduino wyświetla mi ten napis przy każdorazowym kliknięciu i niestety wyświetla go również przy ostatniej próbie, co dziwnie wygląda, bo wyświetlane są napisy: Podaj liczbę koniec gry Nowa gra A powinno być wyświetlane bez linijki podaj liczbę. Z kolei jak przeniosę linijkę kodu odpowiedzialną za wyswietlanie tego napisu, pod warunek liczniknac to po kliknięciu guzika Arduino cały czas wysyła do komputera napis Podaj liczbę, co wygląda jeszcze gorzej niż w poprzednim wypadku. Prosze wytłumaczcie mi gdzie powinienem wpisać tą linijkę wyświetlająca napis, aby została wyświetlona tylko raz i dlaczego? Mój kod: #define diodac 8 // dioda czerwona #define diodazo 9 // dioda zolta #define diodaz 10 // dioda zielona #define guzik 11 // Przycisk int losowanie = 0; String liczba = ""; // Pusty ciag odebranych danych int intliczba = 0; int liczniknac = 0; void setup() { Serial.begin(9600); // uruchomienie transmisji z UART pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako wyjscie digitalWrite(diodac, LOW); // wylaczenie diod digitalWrite(diodazo, LOW); digitalWrite(diodaz, LOW); liczniknac=0; } void loop() { losowanie=analogRead(A4); // Odczytujemy losową liczbę na potencjometrze while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk liczniknac = liczniknac + 1; // zwieksz licznik nac o 1 delay(1000); Serial.println("Podaj liczbe"); } if(liczniknac == 1) { if(Serial.available() > 0) { //Czy Arduino odebrało dane liczba = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba intliczba = liczba.toInt(); // konwersja slowa na liczbe if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { Serial.println("Wygrana!!"); digitalWrite(diodaz, HIGH); digitalWrite(diodac, LOW); digitalWrite(diodazo, LOW); } if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) { Serial.println("Spróbuj jeszcze raz"); digitalWrite(diodazo, HIGH); digitalWrite(diodac, LOW); digitalWrite(diodaz, LOW); } } } if(liczniknac == 2) { if(Serial.available() > 0) { //Czy Arduino odebrało dane liczba = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba intliczba = liczba.toInt(); // konwersja slowa na liczbe if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { Serial.println("Wygrana!!"); digitalWrite(diodaz, HIGH); digitalWrite(diodac, LOW); digitalWrite(diodazo, LOW); } if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) { Serial.println("Spróbuj jeszcze raz"); digitalWrite(diodazo, HIGH); digitalWrite(diodac, LOW); digitalWrite(diodaz, LOW); } } } if(liczniknac == 3) { if(Serial.available() > 0) { //Czy Arduino odebrało dane liczba = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba intliczba = liczba.toInt(); // konwersja slowa na liczbe if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { Serial.println("Wygrana!!"); digitalWrite(diodaz, HIGH); digitalWrite(diodac, LOW); digitalWrite(diodazo, LOW); } if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) { Serial.println("Spróbuj jeszcze raz"); digitalWrite(diodazo, HIGH); digitalWrite(diodac, LOW); digitalWrite(diodaz, LOW); } } } if(liczniknac >3) { Serial.println("Koniec Gry"); digitalWrite(diodaz, LOW); digitalWrite(diodac, HIGH); digitalWrite(diodazo, LOW); liczniknac=0; Serial.println("Nowa gra."); } } Edytowano Listopad 16, 2020 przez lleymann
Treker (Damian Szymański) Listopad 17, 2020 Udostępnij Listopad 17, 2020 @lleymann witam na forum Zacznijmy od tego, że trzeba tu zrobić jakiś mały porządek w tym programie - dlaczego masz tam zmienną "liczniknac" i spora część programu jest powielona 3 razy. Jak to miało działać? Opisz słownie proszę co chciałeś osiągnąć.
lleymann Listopad 17, 2020 Udostępnij Listopad 17, 2020 (edytowany) #define diodac 8 // dioda czerwona #define diodazo 9 // dioda zolta #define diodaz 10 // dioda zielona #define guzik 11 // Przycisk int losowanie = 0; // zdefiniowanie zmiennej losowanie String liczba = ""; // Pusty ciag odebranych danych inaczej podana liczba int intliczba = 0; // konwersja podanej liczby na wartosc liczbowa, zaczerpnalem to z forum int liczniknac = 0; // licznik nacisniec guzika, zeby zliczac 3 proby void setup() { Serial.begin(9600); // uruchomienie transmisji z UART pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako guzika digitalWrite(diodac, LOW); // wylaczenie diod digitalWrite(diodazo, LOW); digitalWrite(diodaz, LOW); liczniknac=0; // ustawienie licznika nacisniec na 0 } void loop() { losowanie=analogRead(A4); // Odczytujemy losową liczbę na potencjometrze while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk liczniknac = liczniknac + 1; // zwieksz licznik nac o 1 delay(1000); // czekamy 1 sekunde, aby guzik nie naciskal sie wiecej razy Serial.println("Podaj liczbe"); // wyswietlamy napis podaj liczbe } if(liczniknac == 1) { // Jesli licznik nac bedzie rowny 1 wtedy realizujemy ponizsze warunki if(Serial.available() > 0) { //Czy Arduino odebrało dane w zsensie wpisana liczbe liczba = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba intliczba = liczba.toInt(); // konwersja slowa na liczbe if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek Serial.println("Wygrana!!");// Wyswietlany jest napis wygrana digitalWrite(diodaz, HIGH); // I zapalana zielona dioda digitalWrite(diodac, LOW); digitalWrite(diodazo, LOW); } if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) { // Jesli wpisana liczba nie miesci sie w przedziale Serial.println("Spróbuj jeszcze raz"); // wyswietlany napis sprobuj jeszcze raz digitalWrite(diodazo, HIGH); // I zapala się dioda zolta digitalWrite(diodac, LOW); digitalWrite(diodaz, LOW); } } } if(liczniknac == 2) { // Jesli licznik nac bedzie rowny 2 wtedy realizujemy ponizsze warunki if(Serial.available() > 0) { //Czy Arduino odebrało dane liczba = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba intliczba = liczba.toInt(); // konwersja slowa na liczbe if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek Serial.println("Wygrana!!"); // Wyswietlany jest napis wygran digitalWrite(diodaz, HIGH);// I zapalana zielona dioda digitalWrite(diodac, LOW); digitalWrite(diodazo, LOW); } if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) {// Jesli wpisana liczba nie miesci sie w przedziale Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz digitalWrite(diodazo, HIGH);// I zapala się dioda zolta digitalWrite(diodac, LOW); digitalWrite(diodaz, LOW); } } } if(liczniknac == 3) { // Jesli licznik nac bedzie rowny 3 wtedy realizujemy ponizsze warunki if(Serial.available() > 0) { //Czy Arduino odebrało dane liczba = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba intliczba = liczba.toInt(); // konwersja slowa na liczbe if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) {// Jesli wpisana liczba spelnia podany warunek Serial.println("Wygrana!!"); // Wyswietlany jest napis wygran digitalWrite(diodaz, HIGH);// I zapalana zielona dioda digitalWrite(diodac, LOW); digitalWrite(diodazo, LOW); } if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) {// Jesli wpisana liczba nie miesci sie w przedziale Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz digitalWrite(diodazo, HIGH);// I zapala się dioda zolta digitalWrite(diodac, LOW); digitalWrite(diodaz, LOW); } } } if(liczniknac >3) { // Jesli guzik jest już naciskany 4 raz Serial.println("Koniec Gry"); // wyswtielany ma byc napis Koniec gry digitalWrite(diodaz, LOW); digitalWrite(diodac, HIGH); // Zapalana jest czerwona dioda digitalWrite(diodazo, LOW); liczniknac=0; // licznik naciśnięć jest zerowany Serial.println("Nowa gra."); // wyswietlany jest napis nowa gra i mozna grać od nowa } } Uzupełniłem kod o opis poszczególnych linii. W trakcie opisywania zauważyłem, że trochę "łopatologicznie" podszedłem do tego. Ponieważ łatwo można skrócić kod używając tylko 2-óch warunków (liczniknac < lub =3 i liczniknac > 3), zamiast wpisywać 4 warunki ( liczniknac = 1; =2; =3; >3). Ale to nie rozwiązuje mojego problemu z tym napisem podaj liczbę. Nie wiem dlaczego, ale w poprzednich programach też miałem problem z ciągłym powielaniem jakiejś czynności. Wiem dlaczego tak się dzieje (ponieważ program wykonuje to w pętli), ale nie wiem jak sobie z tym poradzić. Jeszcze taki krótki opis słowny, jak program miał działać: Chciałem, żeby przy każdorazowym kliknięciu guzika wyświetlany był napisa podaj liczbę. Podajemy liczbę, program sprawdza, czy mieści się w przedziale, jesli tak wyświetlany jest napis wygrana i zielona dioda, jesli nie to żółta i napis sprubuj jeszcze raz. Po 4-tym kliknięciu guzika zapala sie czerwona dioda napis koniec gry i nowa gra, a oprócz tego wyświetla mi się jeszcze nad nimi napis Podaj liczbę, który chciałbym zlikwidować Pochwalę się, że jak miałem 14 lat (teraz 30) to udało mi się napisać cały kalkulator w takim programie Delphi6 (nie wiem, czy to jeszcze istnieje i jaki tam był język, ale tez były finkcje takie jak tutaj, oprócz tego void loop i void setup). A teraz mam problem z napisaniem takiej wydawałoby się łatwej rzeczy. Edytowano Listopad 17, 2020 przez lleymann
Treker (Damian Szymański) Listopad 17, 2020 Udostępnij Listopad 17, 2020 @lleymann proponuję w takim razie najpierw zrobić porządek z tym programem i go skrócić. Pokombinuj jak to zrobić, aby nie trzeba było tego wszystkiego powielać - zrób tak, aby pozbyć się tego kodu, który jest powielony 3 razy (powinien być tylko raz). Wiem, że nie o to pytasz, ale zaufaj, że tak będzie lepiej - najpierw trzeba to "zwinąć" do krótszej, poprawnej formy
lleymann Listopad 17, 2020 Udostępnij Listopad 17, 2020 Poprawiłem, sprawdziłem, działa, tylko nie wiem jak się pozbyć tego napisu: Podaj liczbę po zakończeniu gry. #define diodac 8 // dioda czerwona #define diodazo 9 // dioda zolta #define diodaz 10 // dioda zielona #define guzik 11 // Przycisk int losowanie = 0;// zdefiniowanie zmiennej losowanie String liczba = ""; // Pusty ciag odebranych danych int intliczba = 0;// konwersja podanej liczby na wartosc liczbowa, zaczerpnalem to z forum int liczniknac = 0;// licznik nacisniec guzika, zeby zliczac 3 proby void setup() { Serial.begin(9600); // uruchomienie transmisji z UART pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako przycisku digitalWrite(diodac, LOW); // wylaczenie diod digitalWrite(diodazo, LOW); digitalWrite(diodaz, LOW); liczniknac=0; // ustawienie licznika nacisniec na 0 } void loop() { losowanie=analogRead(A4); // Odczytujemy losową liczbę na potencjometrze while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk liczniknac = liczniknac + 1; // zwieksz licznik nac o 1 delay(1000); // Czekamy 1 sek Serial.println("Podaj liczbe"); // Wyswietlamy Podaj Liczbę } if((liczniknac == 3) or (liczniknac < 3)) { // Jesli licznik nac bedzie równy lub mniejszy 3 wtedy realizujemy ponizsze warunki if(Serial.available() > 0) { //Czy Arduino odebrało dane liczba = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba intliczba = liczba.toInt(); // konwersja slowa na liczbe if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek Serial.println("Wygrana!!");// Wyswietlany jest napis wygrana digitalWrite(diodaz, HIGH);// I zapalana zielona dioda digitalWrite(diodac, LOW); digitalWrite(diodazo, LOW); } if (losowanie < (intliczba - 50) or (losowanie > (intliczba + 50))) {// Jesli wpisana liczba nie miesci sie w przedziale Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz digitalWrite(diodazo, HIGH);// I zapala się dioda zolta digitalWrite(diodac, LOW); digitalWrite(diodaz, LOW); } } } if(liczniknac >3) {// Jesli guzik jest już naciskany 4 raz Serial.println("Koniec Gry");// wyswtielany ma byc napis Koniec gry digitalWrite(diodaz, LOW); digitalWrite(diodac, HIGH);// Zapalana jest czerwona dioda digitalWrite(diodazo, LOW); liczniknac=0;// licznik naciśnięć jest zerowany Serial.println("Nowa gra.");// wyswietlany jest napis nowa gra i mozna grać od nowa } }
Treker (Damian Szymański) Listopad 17, 2020 Udostępnij Listopad 17, 2020 @lleymann dobrze, ale zwijaj kod dalej Jeszcze możesz pozbyć się tego drugiego, długiego warunku sprawdzającego czy liczba jest poza zakresem.
lleymann Listopad 18, 2020 Udostępnij Listopad 18, 2020 Czy chodzi Ci o takie coś: #define diodac 8 // dioda czerwona #define diodazo 9 // dioda zolta #define diodaz 10 // dioda zielona #define guzik 11 // Przycisk int losowanie = 0;// zdefiniowanie zmiennej losowanie String liczba = ""; // Pusty ciag odebranych danych int intliczba = 0;// konwersja podanej liczby na wartosc liczbowa, zaczerpnalem to z forum int liczniknac = 0;// licznik nacisniec guzika, zeby zliczac 3 proby void setup() { Serial.begin(9600); // uruchomienie transmisji z UART pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako przycisku digitalWrite(diodac, LOW); // wylaczenie diod digitalWrite(diodazo, LOW); digitalWrite(diodaz, LOW); liczniknac=0; // ustawienie licznika nacisniec na 0 } void loop() { losowanie=analogRead(A4); // Odczytujemy losową liczbę na potencjometrze while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk liczniknac = liczniknac + 1; // zwieksz licznik nac o 1 delay(1000); // Czekamy 1 sek Serial.println("Podaj liczbe"); // Wyswietlamy Podaj Liczbę } if((liczniknac == 3) or (liczniknac < 3)) { // Jesli licznik nac bedzie równy lub mniejszy 3 wtedy realizujemy ponizsze warunki if(Serial.available() > 0) { //Czy Arduino odebrało dane liczba = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba intliczba = liczba.toInt(); // konwersja slowa na liczbe if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek Serial.println("Wygrana!!");// Wyswietlany jest napis wygrana digitalWrite(diodaz, HIGH);// I zapalana zielona dioda digitalWrite(diodac, LOW); digitalWrite(diodazo, LOW); } else {// Jesli wpisana liczba nie miesci sie w przedziale Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz digitalWrite(diodazo, HIGH);// I zapala się dioda zolta digitalWrite(diodac, LOW); digitalWrite(diodaz, LOW); } } } if(liczniknac >3) {// Jesli guzik jest już naciskany 4 raz Serial.println("Koniec Gry");// wyswtielany ma byc napis Koniec gry digitalWrite(diodaz, LOW); digitalWrite(diodac, HIGH);// Zapalana jest czerwona dioda digitalWrite(diodazo, LOW); liczniknac=0;// licznik naciśnięć jest zerowany Serial.println("Nowa gra.");// wyswietlany jest napis nowa gra i mozna grać od nowa } }
Treker (Damian Szymański) Listopad 18, 2020 Udostępnij Listopad 18, 2020 @lleymann dobrze, dobrze, to teraz dalej Skróć to: "(liczniknac == 3) or (liczniknac < 3)" - znak mniejszy/większy to nie jedyne operatory porównania w Arduino. Do tego pozbądź się jeszcze tego warunku "if(liczniknac >3) {// Jesli guzik jest już naciskany 4 raz".
lleymann Listopad 18, 2020 Udostępnij Listopad 18, 2020 @Treker czy chodziło o takie poprawki? #define diodac 8 // dioda czerwona #define diodazo 9 // dioda zolta #define diodaz 10 // dioda zielona #define guzik 11 // Przycisk int losowanie = 0;// zdefiniowanie zmiennej losowanie String liczba = ""; // Pusty ciag odebranych danych int intliczba = 0;// konwersja podanej liczby na wartosc liczbowa, zaczerpnalem to z forum int liczniknac = 0;// licznik nacisniec guzika, zeby zliczac 3 proby void setup() { Serial.begin(9600); // uruchomienie transmisji z UART pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako przycisku digitalWrite(diodac, LOW); // wylaczenie diod digitalWrite(diodazo, LOW); digitalWrite(diodaz, LOW); liczniknac=0; // ustawienie licznika nacisniec na 0 } void loop() { losowanie=analogRead(A4); // Odczytujemy losową liczbę na potencjometrze while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk liczniknac = liczniknac + 1; // zwieksz licznik nac o 1 delay(1000); // Czekamy 1 sek Serial.println("Podaj liczbe"); // Wyswietlamy Podaj Liczbę } if(liczniknac <= 3) { // Jesli licznik nac bedzie równy lub mniejszy 3 wtedy realizujemy ponizsze warunki if(Serial.available() > 0) { //Czy Arduino odebrało dane liczba = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba intliczba = liczba.toInt(); // konwersja slowa na liczbe if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek Serial.println("Wygrana!!");// Wyswietlany jest napis wygrana digitalWrite(diodaz, HIGH);// I zapalana zielona dioda digitalWrite(diodac, LOW); digitalWrite(diodazo, LOW); } else {// Jesli wpisana liczba nie miesci sie w przedziale Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz digitalWrite(diodazo, HIGH);// I zapala się dioda zolta digitalWrite(diodac, LOW); digitalWrite(diodaz, LOW); } } } else {// Jesli guzik jest już naciskany 4 raz Serial.println("Koniec Gry");// wyswtielany ma byc napis Koniec gry digitalWrite(diodaz, LOW); digitalWrite(diodac, HIGH);// Zapalana jest czerwona dioda digitalWrite(diodazo, LOW); liczniknac=0;// licznik naciśnięć jest zerowany Serial.println("Nowa gra.");// wyswietlany jest napis nowa gra i mozna grać od nowa } }
Achtenbob Listopad 18, 2020 Udostępnij Listopad 18, 2020 (edytowany) Przesyłam moje zadania 4.4 #define zielonaD 7 int wartoscFoto = 0; int wartoscPot = 0; boolean powiadomienie = false; void setup() { pinMode(zielonaD, OUTPUT); digitalWrite(zielonaD, LOW); Serial.begin(9600); } void loop() { wartoscPot = analogRead(A4); wartoscFoto = analogRead(A5); if (wartoscFoto < wartoscPot) { digitalWrite(zielonaD, HIGH); if (powiadomienie == false) { Serial.println("wlaczono swiatlo!"); powiadomienie = true; } } else { digitalWrite(zielonaD, LOW); if (powiadomienie == true) { Serial.println("wyłączono swiatlo!"); powiadomienie = false; } } delay(50); } 4.5 int wartoscPot = 0; //Zmienna potencjometru int szukanaWartosc = 0; //Wartość która gracz próbuje zgadnac String podanaLiczba = ""; //Pusty ciąg odebranych danych int podanaLiczba_int = 0; int proba = 0; //Ilosc prób boolean grawlaczona = false; //Zmienna określa stan gry #define przycisk 7 #define zielonaD 8 #define pomaranczowaD1 9 #define pomaranczowaD2 10 #define czerwonaD 11 void setup() { pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode (7, INPUT_PULLUP); //Konfiguracja wejścia przycisku Serial.begin(9600); //Rozpoczęto komunikacje z PC Serial.println("Zagrajmy w grę!"); delay(2000); Serial.println("Przekręć potencjometr w wybrane przec Ciebie miejsce! \nNastępnie wciśnij przycisk aby zacząć gre!"); digitalWrite(zielonaD, LOW); //Wyłączenie zielonej diody digitalWrite(pomaranczowaD1, LOW); //Wyłączenie 1 pomaranczowej diody digitalWrite(pomaranczowaD2, LOW); //Wyłączenie 2 pomaranczowej diody digitalWrite(czerwonaD, LOW); //Wyłączenie czerwonej diody } void loop() { wartoscPot = analogRead(A4);//Odczytanie wartości z potencjometru if (digitalRead(przycisk) == LOW) { szukanaWartosc = wartoscPot; Serial.println("Teraz podaj szukaną wartość w zakresie 0-1023!"); digitalWrite(zielonaD, LOW); //Wyłączenie zielonej diody digitalWrite(pomaranczowaD1, LOW); //Wyłączenie 1 pomaranczowej diody digitalWrite(pomaranczowaD2, LOW); //Wyłączenie 2 pomaranczowej diody digitalWrite(czerwonaD, LOW); //Wyłączenie czerwonej diody grawlaczona = true; //właczono gre delay(500); } if (Serial.available() > 0 && grawlaczona == true) { //Czy arduino odebrało dane? podanaLiczba = Serial.readStringUntil('\n'); //Zapisujemy podana Liczbę podanaLiczba_int = podanaLiczba.toInt (); if (podanaLiczba_int < szukanaWartosc + 50 && podanaLiczba_int > szukanaWartosc - 50 && proba <= 3) { //Określenie przedzialu poprawnej odpowiedzi Serial.print("Brawo! Poprawna odpowiedź! A dokładna wartosć to:"); Serial.println(szukanaWartosc); digitalWrite(zielonaD, HIGH); digitalWrite(pomaranczowaD1, LOW); //Wyłączenie 1 pomaranczowej diody digitalWrite(pomaranczowaD2, LOW); //Wyłączenie 2 pomaranczowej diody digitalWrite(czerwonaD, LOW); //Wyłączenie czerwonej diody delay(5000); digitalWrite(zielonaD, LOW); proba = 0; Serial.println("Przekręć potencjometr potem wcisnij przycisk aby zagrac ponownie!"); grawlaczona = false; //Wylaczono gre } else if (proba <= 2) { Serial.println("Błędna wartość!!"); digitalWrite(pomaranczowaD1, HIGH); if (proba == 1) { digitalWrite(pomaranczowaD2, HIGH); } proba ++; } if (proba == 3) { Serial.print("Wykorzystałeś wszystkie próby! Naciśnij przycisk i spróbuj ponownie! \n Poprawna odpowiedz wynosiła: "); Serial.println(szukanaWartosc); digitalWrite(czerwonaD, HIGH); grawlaczona = false; //Wylaczono gre delay(5000); digitalWrite(pomaranczowaD1, LOW); //Wyłączenie 1 pomaranczowej diody digitalWrite(pomaranczowaD2, LOW); //Wyłączenie 2 pomaranczowej diody digitalWrite(czerwonaD, LOW); //Wyłączenie czerwonej diody proba = 0; } } } Ja trochę inaczej zrozumiałem zadanie niż w poleceniu. U mnie po naciśnięciu przycisku zapisuje szukaną wartość z potencjometru i włącza gre. Pozdrawiam :] Edytowano Listopad 18, 2020 przez Achtenbob 1
Treker (Damian Szymański) Listopad 19, 2020 Udostępnij Listopad 19, 2020 @lleymann tak, już dużo lepiej Tylko dla formalności pamiętaj jeszcze, że zamiast: } else {// Jesli guzik jest już naciskany 4 raz Lepiej jest formatować ten fragment programu w taki sposób: } else {// Jesli guzik jest już naciskany 4 raz To teraz jeszcze raz zobacz na cały swój kod i pomyśl czy wiesz jak rozwiązać swój pierwotny program, jak nie to daj znać - będzie myśleć razem
lleymann Listopad 19, 2020 Udostępnij Listopad 19, 2020 @Treker wybacz, ale poddaje się, już od godziny próbuje. Nawet próbowałem na ślepo wklejać tą komendę w poszczególne miejsca, ale nic z tego. Wydaje mi się, że to nie jest kwestia miejsca, a jakiejś dodatkowej funkcji. Tylko pytanie, czy ma być to funkcja if, while, czy jeszcze jakaś inna, bo widzę, że niektórzy zastosowali u siebie jakieś wartości true/false.
Achtenbob Listopad 19, 2020 Udostępnij Listopad 19, 2020 Siemka, Przesyłam zadanko 4.6 :] #define DiodaCzerwonaLewa 9 #define DiodaZoltaLewa 8 #define DiodaZielona 7 #define DiodaZoltaPrawa 6 #define DiodaCzerwonaPrawa 5 int CzerwonaWl = 125; //wloczenie czerwonej diody int ZoltaWl = 50; //wlaczenie zoltej diody int WartoscFoto1 = 0; //Zmienna 1 fotorezystora int WartoscFoto2 = 0; //Zmienna 2 fotorezystora void setup() { Serial.begin(9600); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); } void loop() { WartoscFoto1 = analogRead (A5); WartoscFoto2 = analogRead (A4); Serial.print(WartoscFoto1); Serial.print(" "); Serial.println(WartoscFoto2); digitalWrite(DiodaCzerwonaLewa, LOW); digitalWrite(DiodaZoltaLewa, LOW); digitalWrite(DiodaZielona, LOW); digitalWrite(DiodaZoltaPrawa, LOW); digitalWrite(DiodaCzerwonaPrawa, LOW); if (WartoscFoto1 - WartoscFoto2 < -CzerwonaWl ) { digitalWrite(DiodaCzerwonaLewa, HIGH); } if (WartoscFoto1 - WartoscFoto2 < -ZoltaWl) { digitalWrite(DiodaZoltaLewa, HIGH); } if (WartoscFoto1 >= WartoscFoto2 - ZoltaWl && WartoscFoto1 <= WartoscFoto2 + ZoltaWl) { digitalWrite(DiodaZielona, HIGH); } if (WartoscFoto1 - WartoscFoto2 > ZoltaWl) { digitalWrite(DiodaZoltaPrawa, HIGH); } if (WartoscFoto1 - WartoscFoto2 > CzerwonaWl) { digitalWrite(DiodaCzerwonaPrawa, HIGH); } }
Treker (Damian Szymański) Listopad 20, 2020 Udostępnij Listopad 20, 2020 @lleymann no dobrze, czyli zakładam, że to jest aktualna wersja Twojego programu (poprawiłem tylko formatowanie): #define diodac 8 // dioda czerwona #define diodazo 9 // dioda zolta #define diodaz 10 // dioda zielona #define guzik 11 // Przycisk int losowanie = 0;// zdefiniowanie zmiennej losowanie String liczba = ""; // Pusty ciag odebranych danych int intliczba = 0;// konwersja podanej liczby na wartosc liczbowa, zaczerpnalem to z forum int liczniknac = 0;// licznik nacisniec guzika, zeby zliczac 3 proby void setup() { Serial.begin(9600); // uruchomienie transmisji z UART pinMode(diodac, OUTPUT); // konf pinu 8 jako wyjscie pinMode(diodazo, OUTPUT); // konf pinu 9 jako wyjscie pinMode(diodaz, OUTPUT); // konf pinu 10 jako wyjscie pinMode(guzik, INPUT_PULLUP); // konf pinu 11 jako przycisku digitalWrite(diodac, LOW); // wylaczenie diod digitalWrite(diodazo, LOW); digitalWrite(diodaz, LOW); liczniknac = 0; // ustawienie licznika nacisniec na 0 } void loop() { losowanie = analogRead(A4); // Odczytujemy losową liczbę na potencjometrze while (digitalRead(guzik) == LOW) { // Jesli wcisniemy przycisk liczniknac = liczniknac + 1; // zwieksz licznik nac o 1 delay(1000); // Czekamy 1 sek Serial.println("Podaj liczbe"); // Wyswietlamy Podaj Liczbę } if (liczniknac <= 3) { // Jesli licznik nac bedzie równy lub mniejszy 3 wtedy realizujemy ponizsze warunki if (Serial.available() > 0) { //Czy Arduino odebrało dane liczba = Serial.readStringUntil('\n'); //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej liczba intliczba = liczba.toInt(); // konwersja slowa na liczbe if (losowanie > (intliczba - 50) and (losowanie < (intliczba + 50))) { // Jesli wpisana liczba spelnia podany warunek Serial.println("Wygrana!!");// Wyswietlany jest napis wygrana digitalWrite(diodaz, HIGH);// I zapalana zielona dioda digitalWrite(diodac, LOW); digitalWrite(diodazo, LOW); } else {// Jesli wpisana liczba nie miesci sie w przedziale Serial.println("Spróbuj jeszcze raz");// wyswietlany napis sprobuj jeszcze raz digitalWrite(diodazo, HIGH);// I zapala się dioda zolta digitalWrite(diodac, LOW); digitalWrite(diodaz, LOW); } } } else {// Jesli guzik jest już naciskany 4 raz Serial.println("Koniec Gry");// wyswtielany ma byc napis Koniec gry digitalWrite(diodaz, LOW); digitalWrite(diodac, HIGH);// Zapalana jest czerwona dioda digitalWrite(diodazo, LOW); liczniknac = 0; // licznik naciśnięć jest zerowany Serial.println("Nowa gra.");// wyswietlany jest napis nowa gra i mozna grać od nowa } } Cały problem polega więc na tym, że poniższa linijka wykonuje się po każdym wciśnięciu przycisku, zgadza się? Serial.println("Podaj liczbe"); // Wyswietlamy Podaj Liczbę A chodzi Ci o to, aby była wykonywana tylko, gdy ktoś naciska przycisk pierwszy, drugi, lub trzeci raz - tak? Czyli napis ten powinien się pokazywać tylko, gdy licznik naciśnięć przycisku wskazuje wartość mniejszą lub równą 3, tak?
Hanna Listopad 21, 2020 Udostępnij Listopad 21, 2020 Dzień dobry, nie wiem czy nie pytam za późno, ale zastanawiam się czy przed zmianą układu powinnam jakoś zatrzymać powtarzający się zadany proces? np po układzie z 5 diodami przed przygotowaniem układu z fotorezystorem? Albo czy jest narzucona kolejność odłączania przewodów od płytki?
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ę »