Dawiddk1 Grudzień 15, 2017 Udostępnij Grudzień 15, 2017 Racja był błąd tak powinno być: if(od_nowa==true) //jesli rozpoczynamy gre od nowa Jednak nie zmieniło to faktu że w momencie w którym popełnie błąd 2 raz odrazu czyta mi też nastepnego if i zgasza wszstkie diody bez mozliwosci odpowiedzenia drugi raz :/
Treker (Damian Szymański) Grudzień 15, 2017 Udostępnij Grudzień 15, 2017 Dawiddk1, no to lecimy dalej, skoro to nie było to, to spróbuj ładniej sformatować kod, wyrównać wcięcia, nawiasy itd. Będzie łatwiej analizować całość - teraz kod jest trochę rozsypany
Dawiddk1 Grudzień 15, 2017 Udostępnij Grudzień 15, 2017 Już wszystko odkryłem! Troche to zaplątałem w if ... Napewno można łatwiej ale ja nie wiem jak :/ //przypisane pinów #define led_czerwona1 9 #define led_czerwona2 10 #define led_czerwona3 11 #define led_zielona 8 #define przycisk 7 #define pin_odczyt A5 int adc = 0; // odczyt z potecjonometru String podana_liczba = ""; //liczba podana przez gracza int podana_liczba_int = 0; // przskalowanie na int ? byte proby = 3; //ilosc prob boolean od_nowa = true; void setup() { pinMode(przycisk, INPUT_PULLUP); pinMode(led_zielona, OUTPUT); pinMode(led_czerwona1, OUTPUT); pinMode(led_czerwona2, OUTPUT); pinMode(led_czerwona3, OUTPUT); Serial.begin(9600); } void loop() { if (od_nowa == true) //jesli rozpoczynamy gre od nowa { proby = 3; digitalWrite(led_zielona, LOW); //zgaszamy wszystkie diody digitalWrite(led_czerwona1, HIGH); digitalWrite(led_czerwona2, HIGH); digitalWrite(led_czerwona3, HIGH); while (!Serial)delay(10); //czekamy na otwarcie serial monitora Serial.println("pokreć potencjonometrem"); adc = analogRead(pin_odczyt); // szczytujemy wartosc z potecjonometru } while (Serial.available() == 0); //czekamy na podanie liczby podana_liczba = Serial.readStringUntil('\n'); podana_liczba_int = podana_liczba.toInt(); // zamieniamy ze String na int if (adc - podana_liczba_int <= 50 && adc - podana_liczba_int >= -50) { Serial.println("trafiłeś! udało ci sie wygrać"); digitalWrite(led_zielona, HIGH); digitalWrite(led_czerwona1, LOW); digitalWrite(led_czerwona2, LOW); digitalWrite(led_czerwona3, LOW); od_nowa = true; Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk"); while (digitalRead(przycisk) == HIGH); delay(20); } else { if (proby == 3) { if (adc - podana_liczba_int <= 50 && adc - podana_liczba_int >= -50) { Serial.println("trafiłeś! udało ci sie wygrać"); digitalWrite(led_zielona, HIGH); digitalWrite(led_czerwona1, LOW); digitalWrite(led_czerwona2, LOW); digitalWrite(led_czerwona3, LOW); od_nowa = true; Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk"); while (digitalRead(przycisk) == HIGH); delay(20); } else { od_nowa = false; digitalWrite(led_czerwona1, LOW); proby --; Serial.println("nie udało ci się trafić ale masz jeszcze szanse"); Serial.println("ilosc szans: "); Serial.println(proby); Serial.println("podaj kolejna liczbe"); } } while (Serial.available() == 0); //czekamy na podanie liczby podana_liczba = Serial.readStringUntil('\n'); podana_liczba_int = podana_liczba.toInt(); // zamieniamy ze String na int if (proby == 2) { if (adc - podana_liczba_int <= 50 && adc - podana_liczba_int >= -50) { Serial.println("trafiłeś! udało ci sie wygrać"); digitalWrite(led_zielona, HIGH); digitalWrite(led_czerwona1, LOW); digitalWrite(led_czerwona2, LOW); digitalWrite(led_czerwona3, LOW); od_nowa = true; Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk"); while (digitalRead(przycisk) == HIGH); delay(20); } else { od_nowa = false; digitalWrite(led_czerwona1, LOW); digitalWrite(led_czerwona2, LOW); proby--; Serial.println("nie udało ci się trafić ale masz jeszcze szanse"); Serial.println("ilosc szans: "); Serial.println(proby); Serial.println("podaj kolejna liczbe"); } } while (Serial.available() == 0); //czekamy na podanie liczby podana_liczba = Serial.readStringUntil('\n'); podana_liczba_int = podana_liczba.toInt(); // zamieniamy ze String na int if (proby == 1) { if (adc - podana_liczba_int <= 50 && adc - podana_liczba_int >= -50) { Serial.println("trafiłeś! udało ci sie wygrać"); digitalWrite(led_zielona, HIGH); digitalWrite(led_czerwona1, LOW); digitalWrite(led_czerwona2, LOW); digitalWrite(led_czerwona3, LOW); od_nowa = true; Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk"); while (digitalRead(przycisk) == HIGH); delay(20); } else { digitalWrite(led_czerwona1, LOW); digitalWrite(led_czerwona2, LOW); digitalWrite(led_czerwona3, LOW); proby --; od_nowa = true; Serial.println("nie udało ci się trafić"); Serial.println("wykorzystales wszystkie swoje szanse"); Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk"); while (digitalRead(przycisk) == HIGH); delay(20); } } } delay(20); } Dzięki wielkie!
Treker (Damian Szymański) Grudzień 15, 2017 Udostępnij Grudzień 15, 2017 Dawiddk1, super - nauczka na przyszłość - od razu warto ładnie formatować kod
mistus Styczeń 2, 2018 Udostępnij Styczeń 2, 2018 zadanie 4.2 Proste następuje branie sygnału analogowego z powietrza(tak zwana Elektro statyczność) i co złapie to takie dane poda dlatego układy typu mos fet są bardzo czułe i można łatwo uszkodzić zadanie 4.4 ja to bym zrobił tak int dane = 0; int prog = 0; float napiecie = 0; int wyswietl = 0; void setup() { Serial.begin(9600);// połącz sie z komputerem pinMode(8, OUTPUT);// ustaw pin 8 jako wyjście } void loop() { dane = analogRead(A5);// pobieramy sygnał analogowy napiecie = dane*(5.0/1023.0);// zamieniamy sygnały analogowe na napięcie prog = analogRead(A4); // ustawiamy czułość diody if(dane < prog){// jeśli ustawimy sygnał mniejszy od rezystancji digitalWrite(8, HIGH);// włącz diodę if(wyswietl == 0){// jeśli wyświetli diodę Serial.println(napiecie);//wypisz w monitorze wyswietl = 1;// zamień dane wyświetl by pokazać raz napięcie } } else{// jeśli sygnał jest większy od rezystancji digitalWrite(8, LOW);// wyłącz diodę wyswietl = 0;// zamień dane by znów moc wyświetlić dane diody } delay(50);// odczekaj by wszystko fajnie fungowało :) zadanie 4.5 jeszcze myślę __________ Komentarz dodany przez: Treker Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.
Treker (Damian Szymański) Styczeń 2, 2018 Udostępnij Styczeń 2, 2018 mistus, witam na forum Dzięki za podzielenie się Twoimi kodami - pamiętaj na przyszłość, aby wszystkie programy wklejone w post obejmować tagami . Będą one wtedy czytelniejsze
mistus Styczeń 5, 2018 Udostępnij Styczeń 5, 2018 Trochę się na męczyłem nad zadaniem 4.5 i niestety przyznam się ze musiałem skorzystać z pomocy forum dokładnie z dwóch funkcji nie znałem ich toINT() i && tej drugiej funkcji nie rozumie jak by mógł ktoś mi ja wytłumaczyć był bym wdzięczny ps. tam gdzie plus w komentarzu trzeba wykasować #define przycisk 8// nadanie pina nazw #define czerwona 7 #define zolta 6 #define zielona 5 int wcisniety = 0; int potencjometr = 0; String wpis = ""; int zapis = 0; int pruba = 3; int tekst = 0; int informacja = 3; void setup() { Serial.begin(9600); pinMode(przycisk, INPUT_PULLUP); //ustawienie przycisku jako wejście pinMode(czerwona, OUTPUT);// ustawienie diod jako wyjście pinMode(zolta, OUTPUT); pinMode(zielona, OUTPUT); digitalWrite(przycisk, HIGH);// wpisanie przyciskowi stanu wysokiego digitalWrite(czerwona, LOW);// wpisanie dioda stanu niskiego digitalWrite(zolta, LOW); digitalWrite(zielona, LOW); } void loop() { if(tekst == 0){//rozpoczęcie tekstu Serial.println("Część jak masz na imię graczu"); Serial.println("po wpisaniu imienia wciśnij przycisk działa jak enter"); tekst = 1;//zakończenie tekstu } if (digitalRead(przycisk) == LOW){//załączenie gry oraz przywitanie delay (500); digitalWrite(czerwona, LOW);//wyłącz diody po wykonaniu gry digitalWrite(zielona, LOW); if (wcisniety == 0);//jeśli jest wciśnięty przycisk 2 razy i następne potencjometr = analogRead(A5);//wpisz dane potencjometru Serial.println(potencjometr);//+ dodatkowo normalnie nie pokazuje wyniku potencjometru (200); Serial.println("wylosowałeś jaka liczbę");//zapytaj gracza jaka to liczba pruba = 3;// odpal 3 prób } wcisniety = 1;//zakończ wciśniecie przycisku Serial.flush();// kasuj z bufora while(Serial.available() > 0){// sprawdź czy coś jest w buforze wpis = Serial.readStringUntil('\n');// wpisz dane z bufora do wpis Serial.println(wpis);//+ dodatkowe normalnie nie ma pokazuje imię wpisane zapis = wpis.toInt();// zamienia String na Int i wpisuje do zapis } if(informacja > 2){//wciśnięcie raz przycisku if (digitalRead(przycisk) == LOW){ delay(200); Serial.println("Witam ciebie ja nazywam sie Bob"); Serial.println(" Witaj w grze Szczęściarz"); Serial.println("Zasady są proste ustaw potencjometr w jakieś pozycji"); Serial.println("wciśnij enter czyli nasz przycisk i zgadnij jaka jest liczba na potencjometrze"); Serial.println("zakres strzału to od 0 - 1023"); Serial.println("ale nie martw się masz 3 szanse i możesz pomylić się o +/-50"); informacja = informacja -1;// zakończenie działania pierwszego kliknięcia } } if (zapis > 0){// jeśli trafiłeś świeci dioda zielona if(potecjometr-50<=zapis && potencjometr+50>=zapis){ Serial.println("Brawo trafiłeś jeśli jeszcze raz chcesz spróbować szczęścia kliknij przycisk"); digitalWrite(zielona, HIGH); zapis = 0; } else if (zapis > 0){// jeśli nie masz dwie szanse Serial.println("Nie udało się spróbuj jeszcze raz"); if (pruba > 1){ digitalWrite(zolta , HIGH); delay(1000); digitalWrite(zolta, LOW); delay(1000); zapis = 0; pruba = pruba -1; } else if (pruba == 1){// nie udało się zapal czerwona diodę if(zapis > 0){ Serial.println("to nie twój dzień proponuje bys zaczął od nowa"); Serial.println("jeśli chcesz wciśnij przycisk"); digitalWrite(czerwona, HIGH); } zapis = 0; } } } wcisniety = 0;
SOYER Styczeń 6, 2018 Udostępnij Styczeń 6, 2018 && to operator logiczny AND. Muszą być spełnione oba warunki żeby if się wykonywał. Poczytaj kurs techniki cyfrowej. Pozdrawiam. 1
mistus Styczeń 6, 2018 Udostępnij Styczeń 6, 2018 Dzięki znam bramki logiczne nie rozumiałem tylko tego symbolu znam symbol & ale pojedynczy tyczy przynajmniej według książki która polecam "Arduino 65 Praktycznych przykładów arduino" liczb binarnych w systemie dwójkowym czyli mam rozumieć ze dwa operatory tycza liczb dziesiętnych ?
Lukaszm Styczeń 6, 2018 Udostępnij Styczeń 6, 2018 Operator && działa na wartościach logicznych. Działa jak AND w algebrze Boole'a.
krzyska Styczeń 6, 2018 Udostępnij Styczeń 6, 2018 Hejka, to mój pierwszy post tutaj. Zgodnie z zadaniem domowym 4.6 zrobiłem działający czujnik światła określający jego źródło. int lewa = 0; int prawa = 0; int poziom = 0; void setup() { Serial.begin(9600); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); } void loop() { lewa = analogRead(A4); prawa = analogRead(A5); lewa = map(lewa, 400, 850, 1, 5); //wartości ustalone doświadczalnie prawa = map(prawa, 400, 850, 1, 5); poziom = lewa - prawa; poziom = map(poziom, -4, 4, 1, 5); //ustalenie różnicy między stronami Serial.println(poziom); //kontrolnie wyświetlam różnicę delay(50); digitalWrite(8, LOW); //wyłączenie wszystkich diod digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); // włączenie odpowiedniej diody if (poziom == 1) { digitalWrite(12, HIGH); } else if (poziom == 2) { digitalWrite(11, HIGH); } else if (poziom == 3) { digitalWrite(10, HIGH); } else if (poziom == 4) { digitalWrite(9, HIGH); } else if (poziom == 5) { digitalWrite(8, HIGH); } }
Treker (Damian Szymański) Styczeń 7, 2018 Udostępnij Styczeń 7, 2018 krzyska, witam na forum Dzięki za podzielenie się Twoim rozwiązaniem. W przyszłości ostatni, długi warunek warto byłoby zamienić na instrukcję switch...case. Jednak oczywiście w aktualnej formie też jest poprawnie
mistus Styczeń 13, 2018 Udostępnij Styczeń 13, 2018 zadanie 4.6 tyle ze na 6 diodach by pokazać jak robić z wyższa liczba diod zwłaszcza że kolega wyżej pokazał jak zrobić na 5 #define czerwony 10// nadaje nazwy pinom #define zolty #define zielony 8 #define zielona 7 #define zolta 6 #define czerwona 5 int lewa = 0;// ustawiam zmienne dla lewej i prawej strony int prawa = 0; void setup() { pinMode(czerwony, OUTPUT);// ustawiam piny diod jako wyjścia pinMode(zolty, OUTPUT); pinMode(zielony, OUTPUT); pinMode(zielona, OUTPUT); pinMode(zolta, OUTPUT); pinMode(czerwona, OUTPUT); } void loop() { lewa = analogRead(A3);// odczytuje stan na lewej stronie prawa = analogRead(A4);// odczytuje stan na prawej stronie lewa = map(lewa, 50,800,0,3);// nadaje przedziały lewej stronie prawa = map(prawa, 50,800,0,3);// nadaje przedziały prawej stronie digitalWrite(czerwony, LOW);// wyłączam diody lub zmieniam pozycje świecenia digitalWrite(zolty, LOW); digitalWrite(zielony, LOW); digitalWrite(czerwona, LOW); digitalWrite(zolta, LOW); digitalWrite(zielona, LOW); if (lewa > prawa){// porównuje lewa do prawej if (lewa == 1){// zaświecam odpowiednie diody digitalWrite(czerwony, HIGH); } else if (lewa == 2){ digitalWrite(zolty, HIGH); } else if (lewa == 3){ digitalWrite(zielony, HIGH); } } else if (prawa > lewa){// porownuje prawa do lewej if (prawa == 1){// zaswiecam odpowiednie diody digitalWrite(czerwona, HIGH); } else if (prawa == 2){ digitalWrite(zolta, HIGH); } else if (prawa == 3){ digitalWrite(zielona, HIGH); } } } 1
som90 Styczeń 15, 2018 Udostępnij Styczeń 15, 2018 Hej, to mój pierwszy projekt, który wklejam, także chciałem się przywitać Na początku chciałbym podziękować za kurs, bo jest cholernie wciągający i czas przy nim leci jak szalony. A teraz chciałbym się pochwalić działającym zadaniem 4.5. Dodałem kilka ulepszeń od siebie. Przede wszystkim sygnalizację na 3 dodatkowych diodach gasnących w miarę utraty żyć. Zrobiłem też zabezpieczenie przed resetowaniem gry w jej czasie (co dodawało u mnie extra szanse), no i kilka pierdółek świetlnych dla efekciarstwa Jak ogarnę obsługę głośniczka, to może jeszcze dorzucę jakieś efekty dźwiękowe Mam natomiast problem którego nie mogę rozwiązać: jak program oczekuje jeszcze na wciśnięcie przycisku, to wszystkie znaki jakie wtedy wpiszę, po wciśnięciu przycisku wychodzą na monitor i odbierają jedną szansę :/ Jest na to jakieś rozwiązanie? //4.5 //wskazniki #define red 8 //fail #define orange 9 //utrata życia #define green 10 //wygranko //życia #define life1 2 #define life2 3 #define life3 4 //przycisk #define button 6 int proby = 0; //ilosc żyć int wartosc = 0; //wartosc na dzielniku int konwersja = 0; //konwerter odpowiedzi String do konwersja int String odpowiedz = ""; //odpowiedz //pamięci boolean loose = ""; // pamietaj ze przegrana/wygrana boolean reset = ""; //pamietaj że układ był resetowany void setup() { //sygnalizacja stanu pinMode(red, OUTPUT); pinMode(orange, OUTPUT); pinMode(green, OUTPUT); //przycisk pinMode(button, INPUT_PULLUP); //życia pinMode(life1, OUTPUT); pinMode(life2, OUTPUT); pinMode(life3, OUTPUT); //sterowanie wyświetlaczem i komunikacją Serial.begin(9600); Serial.println("Ustaw pozycję potencjometru i zatwierdź przyciskiem"); proby = 0; //pozostałe proby reset = true; //pozwolenie na użycie przycisku } void loop() { if (digitalRead(button) == LOW && reset == true) { //jeśli przycisk wciśnięty a układ ma pozwolenie na reset digitalWrite(red, HIGH); //zamrugaj na powitanie delay(100); digitalWrite(red, LOW); delay(100); digitalWrite(orange, HIGH); delay(100); digitalWrite(orange, LOW); delay(100); digitalWrite(green, HIGH); delay(100); digitalWrite(green, LOW); delay(100); //załaduj życia digitalWrite(life1, HIGH); delay(300); digitalWrite(life2, HIGH); delay(300); digitalWrite(life3, HIGH); delay(300); //początek gry Serial.println("Podaj liczbę!"); //wyślietl pytanie wartosc = analogRead(A5); //zczytaj wartość //Serial.println(wartosc); //TEST: wyswietl wartosc odczytu żeby sprawdzic poprawnosc działania reset = false; //wyłącz pozwolenie na reset if (loose == true) //dodatkowo jeżeli poniesiono porażkę/wygranko proby = 0; //resetuj proby proby = proby + 3; //dodaj 3 życia } if (Serial.available() > 0 && reset == false) { //sprawdź, czy pozwolenie na reset nie jest aktywowane odpowiedz = Serial.readStringUntil('\n'); //odpowiedz z odczytu konwersja = odpowiedz.toInt(); //konwertuj (odpowiedz)string do (odpowiedz)int if (konwersja <= wartosc - 51 || konwersja >= wartosc + 51) { //jeżeli wpisana liczba pomniejszona o 50 jest mniejsza od potencjometrowej proby = proby - 1; Serial.println ("Błędna odpowiedź!"); Serial.println ("pozostałe proby:"); Serial.println (proby); digitalWrite(orange, HIGH); //mrugnij diodą pomarańczową delay(500); digitalWrite(orange, LOW); delay(50); } else if (konwersja >= wartosc + 50 || konwersja <= wartosc + 50) { //gdy wpisalem wartosc poprawną Serial.println ("Wybrałeś liczbę: " + odpowiedz + ""); //jak jest bez "" to wcina ilosc liter którą wpisuję Serial.println("Gratulacje! Prawidłowa odpowiedź!"); Serial.println ("Wylosowana liczba to:"); Serial.println (wartosc); Serial.println("Ustaw potencjometr i naciśnij przycisk, aby rozpocząć ponownie grę!"); digitalWrite(green, HIGH); loose = true; reset = true; } if (proby == 0) { //błąd był- średnik Serial.println("Przegraleś!"); digitalWrite(red, HIGH); loose = true; //zapamiętaj, że przegrana if (loose == true) //a dodatkowo jeżeli przegrana Serial.println ("Wylosowana liczba to: "); //wyświetl to Serial.println (wartosc); Serial.println("Naciśnij przycisk, aby rozpocząć ponownie grę!"); } if (proby == 2) { //sterowanie LEDami żyć3 digitalWrite(life3, LOW); delay(50); digitalWrite(life3, HIGH); delay(50); digitalWrite(life3, LOW); delay(50); digitalWrite(life3, HIGH); delay(50); digitalWrite(life3, LOW); } if (proby == 1) {//sterowanie LEDami żyć2 digitalWrite(life2, LOW); delay(50); digitalWrite(life2, HIGH); delay(50); digitalWrite(life2, LOW); delay(50); digitalWrite(life2, HIGH); delay(50); digitalWrite(life2, LOW); } if (proby == 0) {//sterowanie LEDami żyć1 digitalWrite(life1, LOW); delay(50); digitalWrite(life1, HIGH); delay(50); digitalWrite(life1, LOW); delay(50); digitalWrite(life1, HIGH); delay(50); digitalWrite(life1, LOW); reset = true; //dopiero teraz możesz zrestetowac gre } } }
Treker (Damian Szymański) Styczeń 16, 2018 Udostępnij Styczeń 16, 2018 som90, witam na forum Cieszę się, że kursy się podobają - powodzenia w dalszej nauce! jak program oczekuje jeszcze na wciśnięcie przycisku, to wszystkie znaki jakie wtedy wpiszę, po wciśnięciu przycisku wychodzą na monitorAby uniknąć tego musiałbyś tuż po wciśnięciu przycisku odczytać wszystkie dane z bufora i nic z nimi nie zrobić Przy okazji, czy tutaj się nie pomyliłeś? Taki zapis sprawia, że po przegranej wykonywana jest tylko pierwsza linijka znajdująca się pod instrukcją warunkową. Pozostałe dwie wykonują się zawsze, bo nie zamknąłeś ich w nawiasach klamrowych, aby "spiąć je z warunkiem" if (loose == true) //a dodatkowo jeżeli przegrana Serial.println ("Wylosowana liczba to: "); //wyświetl to Serial.println (wartosc); Serial.println("Naciśnij przycisk, aby rozpocząć ponownie grę!");
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ę »