radekwrc Styczeń 27, 2020 Udostępnij Styczeń 27, 2020 Tak wcześniej pisałem to sobie w notatniku. Wydaje mi się że program powinien działać, tylko jakbym nie kombinował z nawiasami to albo nie reaguje na przycisk/wpisanie wartości (jak pisałem {delay(25);} ), albo wykonuje wszystko bez względu na to czy coś wcisnę, napiszę ( jak piszę {delay(25); ...} , jak wyżej ).
Screwdriv Styczeń 27, 2020 Udostępnij Styczeń 27, 2020 (edytowany) void loop() { Serial.println("Ustaw potencjometr i wciśnij przycisk"); // drukujesz komunikat ok odczytanaWartosc = analogRead(A5); // odczytujesz wartość z potencjometru po co? Serial.println(odczytanaWartosc); // drukujesz jego warość po co? No chyba że chwilowo do testów while (odczytanaWartosc >= 0) // dopóki warunek jest prawdziwy (odczytana wartość jest większa/równa 0 ??) taki warunek jest zawsze spełniony i co on niby ci daje?? { // to wykonuje się pętla delay(25); // czekaj 25 while (digitalRead(11) == LOW) // kiedy przycisk wciśnięty { Serial.println("Podaj liczbe od 20 do 1023:"); // drukuj Podaj liczbę... while (Serial.available() == 0) // kiedy nic nie wpisałeś w terminalu... { delay(25); // czekaj 25 while (proby < 3) { na pewno tak to miało wyglądać? Edytowano Styczeń 27, 2020 przez Screwdriv
radekwrc Styczeń 28, 2020 Udostępnij Styczeń 28, 2020 { delay(25); tutaj już nie mają już sensu, wcześniej stosowałem je z nawiasem z obu stron {delay(25);} ,po to żeby program w tym miejscu wpadał w pustą pętlę, do momentu aż gracz wciśnie przycisk lub wpisze liczbę. Nie chciało mi to działać, ponieważ program się zatrzymywał i nie reagował. To jest cały mój problem, żeby program w tych miejscach zatrzymał się, a po otrzymaniu sygnału od gracza (wciśnięty przycisk, wpisana liczba), działał dalej.
radekwrc Styczeń 28, 2020 Udostępnij Styczeń 28, 2020 Wszystko co było jest nieaktualne. W końcu i ja zrozumiałem o co chodzi Teraz już działa zad 4.5 String liczbastring = ""; int odczytanaWartosc = 0; int liczba = 0; int roznica = 0; int proby = 0; int poczatek = 0; void setup() { Serial.begin(9600); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, INPUT_PULLUP); pinMode(A5, INPUT); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); } void loop() { if (poczatek == 0) { poczatek = 1; Serial.println("Ustaw potencjometr i wciśnij przycisk"); odczytanaWartosc = analogRead(A5); while (digitalRead(11) == HIGH) { delay(25); } } if (digitalRead(11) == LOW) { Serial.println("Podaj liczbe od 20 do 1023: (możesz sie pomylić o +/-50"); while (digitalRead(11) == LOW) { delay(25); } } else { if (proby < 3) { if (Serial.available() > 0) { liczbastring = Serial.readStringUntil('\n'); liczba = liczbastring.toInt(); Serial.println(liczba); roznica = liczba - odczytanaWartosc; if (roznica <= 50 && roznica >= -50) { Serial.println("WYGRAŁEŚ"); digitalWrite(9, LOW); digitalWrite(8, HIGH); delay(3000); digitalWrite(8, LOW); poczatek = 0; proby = 0; } else { proby = proby + 1; if (proby < 3) { Serial.println("błędna odpowiedz, spróbuj jeszcze raz"); digitalWrite(9, HIGH); } } } } else { Serial.println("PRZEGRAŁEŚ"); digitalWrite(9, LOW); digitalWrite(10, HIGH); delay(3000); digitalWrite(10, LOW); poczatek = 0; proby = 0; } } } 2
Vova Styczeń 30, 2020 Udostępnij Styczeń 30, 2020 (edytowany) Zadanie 4.4 Może być? int odczytanaWartosc = 0;//Zmienna do przechowania odczytu z ADC int prog = 0;//Próg włączenia światła - ustawiany potencjometrem float napiecie = 0;//Wartość przeliczona na napiecie void setup() { Serial.begin(9600);//Uruchomienie komunikacji przez USART pinMode(8, OUTPUT); //Konfiguracja wyjść pod diode LED if (8,HIGH) {//Gdy dioda swieci napiecie = analogRead(A5);//Odczytujemy wartosc napięcia napiecie = napiecie * (5.0/1024.0);//Przeliczenie wartosci odczytanej w napiecie Serial.println(napiecie);//Wysyłamy zmierzone napiecie } } void loop() { odczytanaWartosc = analogRead(A5);//Odczytane wartośći z ADC prog = analogRead(A4);//Odczytanie wartości z ADC if (odczytanaWartosc < prog) {//Czy jest ciemniej od ustawionego progu? digitalWrite(8, HIGH);// Włączenie diody } else { digitalWrite(8, LOW); //Wyłączenie diody } delay(50); } Edytowano Styczeń 30, 2020 przez Vova
Treker (Damian Szymański) Styczeń 31, 2020 Udostępnij Styczeń 31, 2020 @Vova oj tutaj chyba jest coś źle, nie "zjadłeś czegoś"? if (8,HIGH) {//Gdy dioda swieci Ten warunek będzie zawsze prawdziwy (w obecnej formie).
spider_pajak Styczeń 31, 2020 Udostępnij Styczeń 31, 2020 (edytowany) Moje rozwiązanie zadania 4.5 int losowa=0; String odpowiedz=""; int licznik=0; void setup() { Serial.begin(9600); pinMode(5,INPUT_PULLUP); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(A4, INPUT); } void loop() { if (digitalRead(5)==LOW){ losowa=analogRead(A4); Serial.println("Podaj liczbe:"); digitalWrite(6,LOW); digitalWrite(7,LOW); digitalWrite(8,LOW); licznik=2; delay(200); Serial.println(losowa); //kontrolne wyswietlenie wylosowanej liczby } if (Serial.available() > 0) { odpowiedz=Serial.readStringUntil('\n'); if ((odpowiedz.toInt()>losowa-50) & (odpowiedz.toInt()<losowa+50)) { digitalWrite(6,HIGH); Serial.println("BRAWO!"); licznik=licznik-1; } else if (licznik>=1) { digitalWrite(7,HIGH); Serial.println("ZLE! pozostalo prob: " + String(licznik)); licznik=licznik-1; digitalWrite(7,LOW); } else { digitalWrite(8,HIGH); Serial.println("ZLE! Przegrales. Prawidlowa odpowiedz to "+ String(losowa)); } } } W konsoli wygląda to tak: Podaj liczbe: 737 ZLE! pozostalo prob: 2 ZLE! pozostalo prob: 1 ZLE! Przegrales. Prawidlowa odpowiedz to 733 Podaj liczbe: 532 ZLE! pozostalo prob: 2 BRAWO! Edytowano Styczeń 31, 2020 przez spider_pajak 1
Treker (Damian Szymański) Styczeń 31, 2020 Udostępnij Styczeń 31, 2020 @spider_pajak witam na forum! Fajnie, że udało się rozwiązać zadanie - powodzenia podczas dalszych eksperymentów if ((odpowiedz.toInt()>losowa-50) & (odpowiedz.toInt()<losowa+50)) { Ale tutaj masz chyba mały błąd - widzisz o co chodzi?
BHBmacieg Styczeń 31, 2020 Udostępnij Styczeń 31, 2020 Odpowiednikiem spójnika logicznego 'AND' jest '&&' a nie '&'. Pewnie o to chodzi 1
BHBmacieg Styczeń 31, 2020 Udostępnij Styczeń 31, 2020 Trzeba by to na spokojnie przeanalizować. Spójnik & działa tuaj pewnie jako Bitwise AND, czyli działa jako operator bitowy. Mądrzejsze głowy muszą się wypowiedzieć, bo ja też dopiero zaczynam przygodę z programowaniem w c++ 1
Treker (Damian Szymański) Luty 1, 2020 Udostępnij Luty 1, 2020 @spider_pajak w tym przypadku "&" robi u Ciebie za operator bitowy. Może to działać, ale to przypadek i nie działa tak jak sobie wyobrażasz, bo operator ten nie służy do łączenia warunków. Gdyby warunki były były trochę inne to już by nie działało Nie ma co zagłębiać się w ten temat na samym początku - na razie najlepiej przyjąć, że przy łączeniu warunków trzeba tam wpisać "&&" lub po prostu można rozbić to na 2 osobne warunki. 2
kristof900 Luty 1, 2020 Udostępnij Luty 1, 2020 (edytowany) Witam, chciałbym się też pochwalić zadaniem 4.5 zadziałało, ale musiałem trochę przy tym poświęcić czasu i trochę się wspomóc forum #define zolta 8 // przypisanie nazw do pinów #define zielona 9 #define czerwona 10 #define przycisk 3 #define pin_odczyt A4 int odczyt = 0; // zmienna potrzebna do odczytu z potencjometru String podana_liczba = ""; // zmienna typu string podawana na terminalu int podana_liczba_int = 0; // zmienna potrzebna do zmiany liczby ze stringa na int int proby = 2; // ilosc prob boolean jeszcze_raz = true; // zmienna potrzebna do zagrania jeszcze raz w gre void setup() { pinMode (przycisk, INPUT_PULLUP); // ustawienia początkowe ledów pinMode (zolta, OUTPUT); pinMode (zielona,OUTPUT); pinMode ( czerwona, OUTPUT); Serial.begin(9600); } void loop() { if (jeszcze_raz == true) { // jesli jeszcze raz jest w stanie wysokim to wykonaj: proby = 2; digitalWrite (zolta, LOW); digitalWrite (zielona,LOW); digitalWrite (czerwona, LOW); while(!Serial) delay(10); // czekam na otwarcie okna dialogowego Serial.println ( "Przekrec potencjometr i nacisnij przycisk"); while(digitalRead(przycisk) == HIGH) delay(20); // czekam na wcisniecie przycisku odczyt = analogRead(pin_odczyt); // odczyt wartosci z potencjometru Serial.println ("podaj liczbe \n powinna byc w zakresie od 0 - 1023"); Serial.println ( " Wygrasz jeżeli pomylisz się nie więcej niż o 50"); Serial.println ( "Powodzenia"); } while (Serial.available() == 0); // czekamy na podanie liczby podana_liczba = Serial.readStringUntil('\n'); podana_liczba_int = podana_liczba.toInt(); // przeksztalcenie liczby typu string na int if ( odczyt - podana_liczba_int <=50 && odczyt-podana_liczba_int >= -50) { // jesli liczba mieści sie w zakresie to wygrałeś Serial.println (" Wygrałes, ustawiona liczba to: " ); Serial.println (odczyt); digitalWrite( zielona, HIGH); digitalWrite( zolta, LOW); Serial.println( "Jesli chcesz grac jeszcze raz nacisnij przycisk"); while(digitalRead(przycisk) == HIGH) delay(20); delay(500); // opóźnienie dla przycisku żeby nie przeskoczył do kolejnej linijki kodu zbyt szybko jeszcze_raz = true; // zaczynamy od nowa } else { if (proby > 0){ jeszcze_raz = false; // nie zaczynamy od nowa digitalWrite ( zolta, HIGH); digitalWrite ( czerwona, LOW); //proby = proby -1; Serial.println (" niestety liczba jest z poza zakresu zostało Ci: "); Serial.println (proby); Serial.println ( "prob, podaj liczbe"); proby = proby -1; // przypisanie nowej wartosci dla proby } else { // bez prób digitalWrite(czerwona, HIGH); digitalWrite(zolta, LOW); Serial.println ( " przegrales, ustawiona liczba to:"); Serial.println (odczyt); Serial.println ("jesli chcesz zagrac jeszcze raz, nacisnij przycisk"); while(digitalRead(przycisk) == HIGH) delay(20); jeszcze_raz = true; } delay (500); // opóźnienie do wciskania przycisku gdy wartosc byla mniejsza przechodzil odrazu za daleko w programie } } Edytowano Luty 1, 2020 przez kristof900 źle wstawiony kod
spider_pajak Luty 2, 2020 Udostępnij Luty 2, 2020 @Treker rozumiem. Chciałbym jednak wiedzieć jaka jest różnica w stosowaniu i w jakim przypadku by to nie zadziałało
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ę »