Belferek Luty 14, 2019 Udostępnij Luty 14, 2019 Zakończenie linii czyli NL to przejście kursora do nowego wiersza, a powrót karetki CR to przejście na początek wiersza.
CharlesX Luty 14, 2019 Udostępnij Luty 14, 2019 9 godzin temu, Treker napisał: @CharlesX, czyli kolejny raz mamy dowód na to, że można sobie dorobić dodatkowych problemów niewłaściwym sprzętem To czemu wersja z potencjometrem działa jak najbardziej poprawnie? Trochę dziwne mi się to wydaje.
Treker (Damian Szymański) Luty 17, 2019 Udostępnij Luty 17, 2019 @CharlesX jeśli wersja z potencjometrem działa to właśnie oznacza, że masz jakiś problem z innym sprzętem (np. fototranzystorem lub rezystorami) i właśnie to miałem na myśli. Nie ma tam żadnej magii, układ ten jest tak prosty, że przy odpowiednich elementach po prostu musi od razu działać. Więc gdybyś miał odpowiednie elementy, to po wpięciu ich zamiast potencjometru wszystko by działało poprawnie. Wina na 99,9% leży u Ciebie właśnie w części sprzętowej. 1
piotr_1998-09 Luty 21, 2019 Udostępnij Luty 21, 2019 Witam! To mój pierwszy post na forum. Oto moja propozycja do zadania 4.5. Co sądzicie o moim rozwiązaniu? #define zolta 10 //Zdefiniowanie pinów #define czerwona 9 #define zielona 8 #define przycisk 7 //Wartosci poczatkowe int wartoscOdczytana = 0; //odczytana z wejscia analogowego String wartoscPodana = ""; //podana przez uzytkownika int naszaLiczba = 0; //podana przez uzytkownika zamieniona na inta int proba = 1; //ilosc prob boolean reset = true; //wartosc do kontynuowania gry String kontynuacja = ""; //string otrzymujacy odpowiedz tak lub nie do kontynuacji gry void setup() { Serial.begin(9600); //rozpoczecie transmisji //Okrelenie trybow odpowiednich pinow pinMode(zolta, OUTPUT); pinMode(czerwona, OUTPUT); pinMode(zielona, OUTPUT); pinMode(przycisk, INPUT_PULLUP); digitalWrite(zolta, LOW); digitalWrite(czerwona, LOW); digitalWrite(zielona, LOW); } void loop() { if (reset) { Serial.print("Proba nr. "); //Wyswietlanie numeru proby Serial.println(proba); if (proba == 1) { //Przekrecenie potencjometru i wcisniecie przycisku tylko dla pierwszej proby Serial.println("Przekrec potencjometr i wcisnij przycisk"); while (digitalRead(przycisk) == HIGH) {}; //dopoki nie wcisniemy przycisku if (digitalRead(przycisk) == LOW) { //jesli wcisniemy przycisk wartoscOdczytana = analogRead(A5); //odczytanie wartosci napiecia z dzielnika //Serial.println("Wartosc Odczytana: "); (tylko dla testow) //Serial.println(wartoscOdczytana); Serial.println('\n'); //dla przejrzystosci programu } } Serial.println("Podaj liczbe: "); while (!Serial.available()) {}; //dopoki nie podamy znaku if (proba != 4) { // tylko jesli to 1, 2 lub 3 proba if (Serial.available() > 0) { wartoscPodana = Serial.readStringUntil('\n'); //podajemy liczbe naszaLiczba = wartoscPodana.toInt(); //liczba ze stringa zamieniana na inta } Serial.println(naszaLiczba); //wysietlnie naszej liczby Serial.println('\n'); //dla przejrzystosci if ((wartoscOdczytana - 50) <= naszaLiczba and (wartoscOdczytana + 50) >= naszaLiczba) //jesli naszaLiczba jest z zakresu <wartoscOdczytana-50;wartoscOdczytana+50> { digitalWrite(czerwona, LOW); digitalWrite(zolta, LOW); digitalWrite(zielona, HIGH); //zapala sie zielona dioda Serial.println("WYGRALES!!!"); delay(1000); //Kontynuacja gry Serial.println("Chcesz grac dalej? Wpisz 'tak' lub 'nie' "); while (!Serial.available()) {}; //dopoki nie podamy naszej odpowiedzi kontynuacja = Serial.readStringUntil('\n'); //nasza odpowiedz if (kontynuacja == "tak") //jeśli chcemy kontynuowac { reset = true; //warunek kontynuowania gry proba = 1; //ustawiamy zmienna proba na 1, aby program działał poprawnie digitalWrite(zielona, LOW); //wylaczamy zielona diode Serial.println('\n'); } else { reset = false; //warunek kończący grę } } else //w przeciwnym wypadku gdy nie trafilismy liczby { digitalWrite(zolta, HIGH); //zapala sie żółta dioda,ktora caly czas swieci i oznacza ze zostaly 2 proby digitalWrite(czerwona, HIGH); //zapala sie czerwona dioda sygnalizujaca zle trafienie delay(1000); digitalWrite(czerwona, LOW); //dioda czerwona gasnie proba = proba + 1; //liczba prob maleje o jedna } } if (proba == 4) //jesli to byla ostatnia proba { digitalWrite(zolta, LOW); //dioda żółta gaśnie Serial.println("Przegrales!!!"); delay(1000); //Warunek kontynuacji, tak samo jak wyżej w przypadku wygranej Serial.println("Chcesz grac dalej? Wpisz 'tak' lub 'nie' "); while (!Serial.available()) {}; kontynuacja = Serial.readStringUntil('\n'); if (kontynuacja == "tak") { reset = true; proba = 1; Serial.println('\n'); } else { reset = false; } } } else //w przypadku gdy konczymy gre { Serial.println("Koniec!"); //wszystkie diody sa wylaczone digitalWrite(zielona, LOW); digitalWrite(zolta, LOW); digitalWrite(czerwona, LOW); while (true); //petla nieskonczona, ktora powoduje zakonczenie programu } } 1
Treker (Damian Szymański) Luty 22, 2019 Udostępnij Luty 22, 2019 @piotr_1998-09, witam na forum Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start: Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników. Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć? Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości. Dnia 21.02.2019 o 18:41, piotr_1998-09 napisał: Oto moja propozycja do zadania 4.5. Co sądzicie o moim rozwiązaniu? Kod ładnie sformatowany, do tego dobre komentarze - oby tak dalej!
jogaszu Marzec 1, 2019 Udostępnij Marzec 1, 2019 Zadanie 4.5 GRA Na tą chwilę kod wygląda tak: int odczyt = 0; //odczytana wartosc z potencjometru int proba = 0; //licznik odpowiedzi bool komunikat = 0; //kontrolka komunikatu o roczpoczeciu gry #define zielona 9 //definiowanie pinow #define czerwona 10 #define zolta 11 #define przycisk 3 #define potencjometr A5 void setup() { Serial.begin(9600); while (!Serial) { ; //bylo w tutorialu Arduino to dodalem :) } pinMode (zielona, OUTPUT); pinMode (zolta, OUTPUT); pinMode (czerwona, OUTPUT); pinMode (przycisk, INPUT_PULLUP); } void loop() { odczyt = analogRead(potencjometr); //odczyt z potencjometru Serial.println("Zakrec potencjometrem i wciśnij przycisk"); while (digitalRead(przycisk) == HIGH) {}//czekamy na wciśnięcie przycisku if (digitalRead(przycisk) == LOW) {} //jeżeli wciśnięty if (komunikat != 1) { //jeżeli komunikat nie został wywietlony digitalWrite(zielona, LOW); //gasimy LEDY digitalWrite(zolta, LOW); digitalWrite(czerwona, LOW); Serial.println("Zaczynamy grę"); Serial.println("Odgadnij wartość z zakresu 0-1023"); komunikat = 1; //oznaczenie ze komunikat zostal wyswietlony proba = 0; //zerowanie licznika prob delay(50); } while (proba < 3) { //powtorka do 3 prob Serial.println("Podaj liczbę"); while (Serial.available() == 0) {} String tekst = Serial.readStringUntil('\n'); int liczba = tekst.toInt(); //string na int int roznica = odczyt - liczba; //wyliczenie roznicy if (abs(roznica) <= 50) { //roznica jako modół, żeby sprawdzić Serial.println("Wygrałes"); proba = 3; digitalWrite(zielona, HIGH); delay(2000); } else { Serial.println("Pudlo"); digitalWrite(zielona, LOW); digitalWrite(zolta, HIGH); digitalWrite(czerwona, LOW); delay(800); digitalWrite(zolta, LOW); } komunikat = 0; //zezwolenie na komunikat proba++; //kolejna proba } Serial.println("Koniec Gry"); digitalWrite(zielona, LOW); digitalWrite(zolta, LOW); digitalWrite(czerwona, HIGH); } Trochę się namęczyłem, żeby to działo. Niektórzy użytkownicy mogą znaleźć tutaj swoje fragmenty kodu Największe problemy miałem z przekształceniem string i int. Poszukując rozwiązania w pomocy Arduino natknąłem się na taki fragment przy konfikurowaniu: void setup() { //Initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB } } i mam teraz kilka pytań: Do czego służy ten while(!Serial){;} ? W moim kodzie na początku w terminalu pojawia się komunikat: Zakrec potencjometrem i wciśnij przycisk. I niby program czeka na wciśnięcie przycisku. Ale zaobserwowałem, że wpisując liczby i zatwierdzając je program rejestruje je w tle i po wciśnięciu przycisku gra toczy się automatycznie na wprowadzonych liczbach. Jak poprawić kod, żeby czekał na wciśnięcie przycisku i dopiero po tym fakcie można było wprowadzać liczby? 1
Krakers007 Marzec 1, 2019 Udostępnij Marzec 1, 2019 Witam wszystkich serdecznie, zainspirowany zadaniem 4.6 w połączeni z kursem dot. serwa wymyśliłem sobie zadanie polegające na stworzeniu układu, który ma obracać ramie serwa w kierunku źródła światła. Cały układ fajnie działa, natomiast zastanawia mnie jedna linijka. Dotyczy przeskalowania wartości, a dokładnie wartości wejściowych (-550, 550), które wpisuje "z ręki" i które dobrałem doświadczalnie, tak że zakrywałem kolejno fotorezystory i wpisałem skrajne wartości odczytanej sumy. Moje pytanie - jak można to prze edytować, żeby przy użyciu światła o różnym natężeniu ramię serwa obracało się +/- w kierunku źródła światła? Czy na tym etapie jest to w ogóle możliwe? W układzie takim jak poniżej, gdy zbliżam latarkę do danego fotorezystora, serwo odkręca się w skrajną pozycję. #include <Servo.h> //Biblioteka odpowiedzialna za serwa Servo serwomechanizm; //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa int czuj_1 = 0; // Czujnik prawy złącze A4 int czuj_2 = 0; // Czujnik lewy złącze A5 int suma = 0; // Suma z czujników int kat = 0; // Kat ustawienia serwo void setup() { Serial.begin(9600);//Uruchomienie komunikacji przez USART serwomechanizm.attach(3); //Serwomechanizm podłączony do pinu 3 } void loop() { czuj_1 = analogRead(A4);//Odczytujemy wartość Czujnik prawy złącze A4 Serial.println("Czujnik prawy"); Serial.println(czuj_1);//Wysyłamy wartość Czujnik prawy złącze A4 czuj_2 = -analogRead(A5);//Odczytujemy wartość Czujnik lewy złącze A5 ZAMIANA NA WARTOŚĆ PRZECIWNĄ Serial.println("Czujnik lewy"); Serial.println(czuj_2);//Wysyłamy wartość Czujnik lewy złącze A5 Serial.println(""); suma = czuj_1+czuj_2; // Sumowanie odczytanych wartości Serial.println("SUMA"); Serial.println(suma);//Wysyłamy wartość sumy Serial.println(""); kat = map(suma, -550, 550, 0, 180); //przeskalowanie skrajnych wartości sumy na kąt serwa Serial.println("KAT"); Serial.println(kat);//Wysyłamy wartość kąta Serial.println(""); serwomechanizm.write(kat);//obrót serwa delay(500); }
Treker (Damian Szymański) Marzec 2, 2019 Udostępnij Marzec 2, 2019 Dnia 1.03.2019 o 21:55, jogaszu napisał: Do czego służy ten while(!Serial){;} ? Wstrzymuje działanie programu do czasu nawiązania połączenia przez UART. Dnia 1.03.2019 o 21:55, jogaszu napisał: W moim kodzie na początku w terminalu pojawia się komunikat: Zakrec potencjometrem i wciśnij przycisk. I niby program czeka na wciśnięcie przycisku. Ale zaobserwowałem, że wpisując liczby i zatwierdzając je program rejestruje je w tle i po wciśnięciu przycisku gra toczy się automatycznie na wprowadzonych liczbach. Jak poprawić kod, żeby czekał na wciśnięcie przycisku i dopiero po tym fakcie można było wprowadzać liczby? Możesz trochę dokładniej to opisać? Jak dokładnie wygląda przebieg takiej "wadliwej" gry? @Krakers007, witam na forum Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start: Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników. Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć? Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości. Dnia 1.03.2019 o 22:07, Krakers007 napisał: Cały układ fajnie działa, natomiast zastanawia mnie jedna linijka. Dotyczy przeskalowania wartości, a dokładnie wartości wejściowych (-550, 550), które wpisuje "z ręki" i które dobrałem doświadczalnie, tak że zakrywałem kolejno fotorezystory i wpisałem skrajne wartości odczytanej sumy. Moje pytanie - jak można to prze edytować, żeby przy użyciu światła o różnym natężeniu ramię serwa obracało się +/- w kierunku źródła światła? Czy na tym etapie jest to w ogóle możliwe? Tak, powinieneś mieć możliwość stworzenia takiego programu. Może łatwiej będzie Ci, jeśli rozbijesz sobie to zadanie na dwa mniejsze. Najpierw określaj, po której stronie jest jaśniej (po lewej, czy po prawej), a dopiero później odpowiednio dobieraj kąt wychylenia serwa
ethanak Marzec 3, 2019 Udostępnij Marzec 3, 2019 11 godzin temu, Treker napisał: Wstrzymuje działanie programu do czasu nawiązania połączenia przez UART. Dokładniej: do czasu, aż Serial będzie gotowy do nawiązania połączenia. Dotyczy praktycznie tylko Leonardo i Micro/Pro Micro. 1
jogaszu Marzec 3, 2019 Udostępnij Marzec 3, 2019 15 godzin temu, Treker napisał: Możesz trochę dokładniej to opisać? Jak dokładnie wygląda przebieg takiej "wadliwej" gry? Chciałem uzyskać taki efekt, żeby nic program nie rejestrował dopóki nie wcisnę przycisku na plytce. Teraz jak włączę aplikację i przed przyciśnięciem przycisku wprowadzę dane, to na ekranie widnieje komunikat "Zakrec potencjometrem i wciśnij przycisk" i do póki go nie wcisnę komunikat z ekranu nie zniknie. I teraz jeżeli przed wciśnięciem przycisku wprowadzę dane, to na ekranie nie widać, że je wprowadziłem ale po wciśnięciu przycisku są one automatycznie odbierane przez program. Chciałem uzyskać taki efekt, że jeżeli program czeka na wciśnięcie przycisku jest "zamrożony" to z mogę wpisywać co chcę i nie były to dane odbierane przez program. Jak nie piszę zbyt jasno to trudno, uczymy się dalej
Treker (Damian Szymański) Marzec 3, 2019 Udostępnij Marzec 3, 2019 @jogaszu teraz rozumiem. W takim razie najprościej będzie tuż po wciśnięciu przycisku odczytać wszystkie dane, które są w buforze i nic z nimi nie zrobić (tylko pobrać z bufora, aby go wyczyścić). Spróbuj pójść w tym kierunku
arek2007100 Marzec 5, 2019 Udostępnij Marzec 5, 2019 int odczytanaWartosc=0; int prog=0; float napiecie=0; //Napiecie w V void setup() { Serial.begin(9600); //Uruchamiamy transmisję pinMode(8, OUTPUT); //Dioda niebieska, wyjscie } void loop() { odczytanaWartosc=analogRead(A5); prog=analogRead(A4); napiecie=odczytanaWartosc*(5.0/1024.0); if(odczytanaWartosc < prog) { digitalWrite(8, HIGH); Serial.println(napiecie); while(odczytanaWartosc<prog) { odczytanaWartosc=analogRead(A5); prog=analogRead(A4); delay(50); } } else { digitalWrite(8, LOW); } delay(50); } zad 4.4 nauka programowania idzie mi bardzo ciężko. podejrzewam ze zadania 4.5 i 4.6 zabiorą mi mnóstwo czasu. To są moje początki i nigdy nie miałem z tym do czynienia ale liczę na to ze trening czyni mistrza. Pozdrawiam 1
Treker (Damian Szymański) Marzec 5, 2019 Udostępnij Marzec 5, 2019 1 godzinę temu, arek2007100 napisał: podejrzewam ze zadania 4.5 i 4.6 zabiorą mi mnóstwo czasu. Spokojnie na wszystko przyjdzie czas - tak jak sam napisałeś: trening czyni mistrza! Powodzenia w dalszych eksperymentach. W razie problemów pytaj tutaj lub załóż osobny temat na forum 1
arek2007100 Marzec 5, 2019 Udostępnij Marzec 5, 2019 @Treker Czy do zad 4.6 wykorzystanie funkcji map (), pomoże czy też wydłuży moją pracę? Pytam bo nie chce się męczyć na marne i nie potrzebnie pójść w tą stronę.
jogaszu Marzec 5, 2019 Udostępnij Marzec 5, 2019 Dnia 3.03.2019 o 23:54, Treker napisał: @jogaszu teraz rozumiem. W takim razie najprościej będzie tuż po wciśnięciu przycisku odczytać wszystkie dane, które są w buforze i nic z nimi nie zrobić (tylko pobrać z bufora, aby go wyczyścić). Spróbuj pójść w tym kierunku Hmm jako początkujący teraz ja nie do końca rozumiem. Czy jest jakieś specjalne polecenie pobrania z bufora? Czy po prostu trzeba dopisać jakąś funkcję, która zabierze dane i nic z nimi nie zrobi?
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ę »