RossiQ Styczeń 5, 2017 Udostępnij Styczeń 5, 2017 Witam. Z racji choroby rozpocząłem przygodę z arduino. Po wielu bojach zrobiłem lekcje 4.5 Tak to wygląda u mnie jest OK ?? #define zielona 10 #define zolta 9 #define czerwona 8 #define przycisk 13 String liczba = ""; int s1 = 0; int s2 = 0; int s3 = 0; int liczba_int = 0; int ustawionaliczba = 0; int proba = 0; void setup() { Serial.begin(9600); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(13, INPUT_PULLUP); } void loop() { ustawionaliczba = analogRead(A5); if (s1 == 0) { Serial.println("Witam. Ustaw potencjometr i nacisnij przycisk"); s1 = 1; } if (s3 == 0) { if (Serial.available() > 0) { liczba = Serial.readStringUntil('\n'); Serial.println("Nie nacisneles przycisku"); s3 = 1; } } if (digitalRead(13) == LOW) { Serial.println("Podaj Liczbe od 1 do 1000"); s2 = 1; delay(1000); } if (s2 == 1) { if (Serial.available() > 0) { liczba = Serial.readStringUntil('\n'); liczba_int = liczba.toInt(); if (liczba_int - 50 <= ustawionaliczba && liczba_int + 50 >= ustawionaliczba) { Serial.println("Wygrales"); digitalWrite(zielona, HIGH); digitalWrite(zolta, LOW); digitalWrite(czerwona, LOW); s1 = 0; } else if (proba == 0) { Serial.println("Zly wynik masz jeszcze 2 proby"); digitalWrite(zolta, HIGH); digitalWrite(zielona, LOW); proba = proba + 1; } else if (proba == 1) { Serial.println("Zly wynik masz jeszcze 1 proby"); digitalWrite(zolta, HIGH); proba = proba + 1; } else if (proba == 2) { Serial.println("Zly wynik masz ostatnia probe"); digitalWrite(zolta, HIGH); proba = proba + 1; } else if (proba == 3) { Serial.println("PRZEGRALES !!! Chcesz zagrac jeszcze raz nacisnij reset"); digitalWrite(zolta, LOW); digitalWrite(czerwona, HIGH); } } } }
Treker (Damian Szymański) Styczeń 5, 2017 Udostępnij Styczeń 5, 2017 RossiQ - witam na forum Przydałoby się dodać komentarze, aby cały program był bardziej przejrzysty. Do tego niektóre fragmenty możesz trochę skrócić przykładowo inkrementację można zapisać tak: proba++;
RossiQ Styczeń 5, 2017 Udostępnij Styczeń 5, 2017 Fakt o komentarzach zapomniałem . Nie bardzo rozumiem o co miało by chodzić z tym proba++;
Treker (Damian Szymański) Styczeń 5, 2017 Udostępnij Styczeń 5, 2017 RossiQ, zapis: proba = proba + 1; Można skrócić właśnie do takiej wersji jak: proba++; Zabieg czysto estetyczny, działanie będzie takie same
RossiQ Styczeń 5, 2017 Udostępnij Styczeń 5, 2017 Tego nie wiedziałem ale bazowałem na wiedzy zdobytej w kursie nie pokazałeś nie wiedziałem. z opcją "toInt" też trochę nie fair ale inaczej nie umiałem. Oczywiście to nie moja wiedza tylko podglądałem u innych
Treker (Damian Szymański) Styczeń 5, 2017 Udostępnij Styczeń 5, 2017 RossiQ, wybacz mój błąd - faktycznie informacja o skróconym zapisie inkrementacji pojawia się w kursie później W takim razie będziesz już na przyszłość wiedział
RossiQ Styczeń 5, 2017 Udostępnij Styczeń 5, 2017 No i mam problem z zadaniem 4.6. Bazując na zdobytej wiedzy zrobiłem coś takiego ale nie wiem jak mam sprawic aby skraje diody sie swiecily. Potrzebuje zrobić tak aby prawyfoto różnił się o 2 od lewyfoto. Jak to zrobić. int prawyfoto = 0; int lewyfoto = 0; void setup() { pinMode(8, OUTPUT); // ustawienie pinow pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); } void loop() { prawyfoto = analogRead(A5); //odczytanie wartosci z fotorezystorow lewyfoto = analogRead(A4); //odczytanie wartosci z fotorezystorow prawyfoto = map(prawyfoto, 30, 970, 1, 5); //zmiana wartosci z fotorezystorow na 1 do 5 lewyfoto = map(lewyfoto, 30, 970, 1, 5); //zmiana wartosci z fotorezystorow na 1 do 5 if (prawyfoto == lewyfoto) { digitalWrite(10, HIGH); }else{ digitalWrite(10, LOW); } if (prawyfoto > lewyfoto) { digitalWrite(11, HIGH); }else{ digitalWrite(11, LOW); } if (prawyfoto < lewyfoto) { digitalWrite(9, HIGH); }else{ digitalWrite(9, LOW); } if (prawyfoto > lewyfoto) { //to wlasnie tu mam problem digitalWrite(12, HIGH); }else{ digitalWrite(12, LOW); } } [ Dodano: 05-01-2017, 18:03 ] Dobra zrobiłem to tak ale nie wiem czemu ale diody 9 i 11 przy zapalonych 8 i 12 się żarzą. int prawyfoto = 0; int lewyfoto = 0; void setup() { pinMode(8, OUTPUT); // ustawienie pinow pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); } void loop() { prawyfoto = analogRead(A5); //odczytanie wartosci z fotorezystorow lewyfoto = analogRead(A4); //odczytanie wartosci z fotorezystorow prawyfoto = map(prawyfoto, 30, 970, 1, 6); //zmiana wartosci z fotorezystorow na 1 do 7 lewyfoto = map(lewyfoto, 30, 970, 1, 6); //zmiana wartosci z fotorezystorow na 1 do 7 if (prawyfoto == lewyfoto) { digitalWrite(10, HIGH); }else{ digitalWrite(10, LOW); } if (prawyfoto < lewyfoto) { digitalWrite(11, HIGH); }else{ digitalWrite(11, LOW); } if (prawyfoto > lewyfoto) { digitalWrite(9, HIGH); }else{ digitalWrite(9, LOW); } if ((prawyfoto - lewyfoto)>2) { digitalWrite(8, HIGH); digitalWrite(9, LOW); }else{ digitalWrite(8, LOW); } if ((lewyfoto - prawyfoto)>2) { digitalWrite(12, HIGH); digitalWrite(11, LOW); }else{ digitalWrite(12, LOW); } }
Rutusowiec Luty 1, 2017 Udostępnij Luty 1, 2017 Witam. Czy można liczbę wprowadzoną z klawiatury przez Serial.read przypisac do typu int bez przekształcania typu String na int?
marek1707 Luty 1, 2017 Udostępnij Luty 1, 2017 No ale przecież z klawiatury dostajesz osobne znaki, które razem tworzą właśnie String, który to z kolei dla procesora nie ma żadnej sensownej wartości przydatnej do jakichś obliczeń. W pamięci RAM wygląda to zupełnie inaczej niż binarny integer. Musisz dokonać konwersji tekstu na liczbę dwójkową. A dlaczego Cię to boli?
Rutusowiec Luty 1, 2017 Udostępnij Luty 1, 2017 Dzięki za odpowiedź. Nie boli, pytam bo myślałem, że mozna
Pakos Luty 3, 2017 Udostępnij Luty 3, 2017 Mam kilka uwag do funkcji map(). W artykule zwracasz uwagę, że poprawne działanie "Wskaźnik na diodach" uzyskałeś zmieniając wartość z 1023 na 1021. Zgodnie z kodem funkcji map() long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } dla map(x, 0, 1023, 1, 5); piaty warunek zachodzi tylko gdy x=1023. Czyli sygnał analogowy podzielony jest na 4 przedziały i wystąpienie wartości max. Lepsze działanie kodu uzyskamy poprzez: map(x, 0, 1023, 0, 5); i zmieniając warunki lub map(x, 0, 1023, 1, 6); 1
Treker (Damian Szymański) Luty 4, 2017 Udostępnij Luty 4, 2017 Pakos, dziękuję za sugestię przyjrzę się temu podczas aktualizacji kursu
spwr Luty 11, 2017 Udostępnij Luty 11, 2017 Witam napisałem taki oto kod, ale czy da się to jakoś napisać prościej, bo jakby było np 30 diod, to pisać tyle komend było by bardzo czasochłone. Myslalem nad switch/case, ale nie wiem jak sie do tego zabrać, moglby ktoś rzucic okiem ? Dzięki z góry ! Zadanie 4.6 void setup() { pinMode(12, OUTPUT); pinMode(11, OUTPUT); pinMode(10, OUTPUT); pinMode(9, OUTPUT); pinMode(8, OUTPUT); Serial.begin(9600); } void loop() { int LEWY_FOTOREZYSTOR = analogRead(A5); //Odczytywana wartość z lewego fotorezystora int PRAWY_FOTOREZYSTOR = analogRead(A4);//Odczytywana wartość z prawego fotorezystora Serial.print("Odczyt (L): "); Serial.print(LEWY_FOTOREZYSTOR); Serial.print(" Odczyt (R): "); Serial.println(PRAWY_FOTOREZYSTOR); delay(100); if (LEWY_FOTOREZYSTOR<30 && PRAWY_FOTOREZYSTOR <30) { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, HIGH); digitalWrite(11, LOW); digitalWrite(12, LOW); } else if (LEWY_FOTOREZYSTOR > 30 && LEWY_FOTOREZYSTOR <= 60) { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, LOW); } else if (LEWY_FOTOREZYSTOR > 60) { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); } else if (PRAWY_FOTOREZYSTOR > 30 && PRAWY_FOTOREZYSTOR <= 60 ) { digitalWrite(8, LOW); digitalWrite(9, HIGH); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); } else if (PRAWY_FOTOREZYSTOR > 60) { digitalWrite(8, HIGH); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); } }
Behem Luty 14, 2017 Udostępnij Luty 14, 2017 Pewnie jest jakaś możliwość jeszcze jakoś to poprawić Zadanie 4.5 #define RED1 8 //Definicja czerwonej diody na pinie 8 #define RED2 9 //Definicja czerwonej diody na pinie 9 #define YELLOW 10 //Definicja żółtej diody na pinie 10 #define GREEN1 11 //Definicja zielonej diody na pinie 11 int odczytanaWartosc = 0; // Zatrzaśnięta wartość od 0 - 1023 odczytana z potencjometru String odpowiedz = ""; // Odpowiedź wprowadzona przez interfejs szeregowy int odpowiedz_int = 0; // Zmienna przerobiona z "odpowiedz" bool losowanie = false; // Zmienna pomocnicza pozwalająca odczytać w którym momencie programu jesteśmy byte licznik = 0; //zmienna pomocnicza do określenia ilości szans bool wygrana = false; // Zmienna mówiąca czy się wygrało void setup() { Serial.begin(9600); pinMode(7, INPUT_PULLUP); //Konfiguracja przycisku pinMode(RED1, OUTPUT); //Konfiguracja wyjść pod diody LED pinMode(RED2, OUTPUT); pinMode(YELLOW, OUTPUT); pinMode(GREEN1, OUTPUT); } void loop() { // Ustawienie wszystkich parametrów w pozycji początkowej digitalWrite(YELLOW, LOW); digitalWrite(GREEN1, LOW); digitalWrite(RED1, LOW); digitalWrite(RED2, LOW); licznik = 0; // Wyświetlenie w interfejsie poleceń dla gracza Serial.println("Przekrec potencjometr i wcisnij przycisk"); /* do puki nie wciśniemy przycisku możemy zmieniać wartość na potencjometrze potem każda zmiana nie będzie miała wpływu na wartość zatrzaśniętą w programie*/ while (digitalRead(7) == HIGH){ odczytanaWartosc = analogRead(A4); //Odczytanie wartości potencjometru delay(20); } losowanie = true; while (digitalRead(7) == LOW){ //pętla odpowiedzi while (losowanie == true) { digitalWrite(YELLOW, LOW); Serial.println("Podaj liczbę +/- 50 od wskazywanej przez potencjometr"); while (Serial.available() == 0){} odpowiedz = Serial.readStringUntil ('\n'); //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebrane dane odpowiedz_int = odpowiedz.toInt(); Serial.println("Twoja odpowiedz to " + odpowiedz + "!"); //Wyświetl komunikat Serial.println(licznik); //Jeżeli odpowiedź jest mniejsza o 50 niż zatrzaśnięta wartość z potencjometru if (odczytanaWartosc > odpowiedz_int + 50) { Serial.println(" jest zła"); digitalWrite(YELLOW, HIGH); } //Jeżeli odpowiedź jest o 50 większa niż zatrzaśnięta wartość z potencjometru else if (odczytanaWartosc < odpowiedz_int - 50) { Serial.println(" jest zła"); digitalWrite(YELLOW, HIGH); } //Jeżeli zmienna mieści się w przedziale +/- 50 else { Serial.println(" jest dobra"); digitalWrite(GREEN1, HIGH); digitalWrite(RED1, LOW); digitalWrite(RED2, LOW); losowanie = false; wygrana = true; } //Zapalanie diod odpowiedzialnych za pokazanie ilości szans if (licznik == 1){ digitalWrite(RED1, HIGH); } if (licznik == 2){ digitalWrite(RED2, HIGH); } Serial.println(licznik); delay(100); //Jeżeli się nie powiedzie i licznik dojdzie 3 wychodzimy z pętli if (licznik == 3){ losowanie = false; } //Zwiększenie licznika przy którego pomocą w końcu wyjdziemy z pętli wyjdziemy z pętli licznik++; } if (wygrana == true){ Serial.println("Gratulacje wygrales"); //Wyświetl komunikat o wygranej } else { Serial.println("Niestety przegrales"); //Wyświetl komunikat o przegranej } Serial.println(odczytanaWartosc); //Wyświetl komunikat } delay(1000); //Opóźnienie, aby nie odczytywać ADC zbyt szybko }
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ę »