Treker (Damian Szymański) Luty 16, 2017 Udostępnij Luty 16, 2017 Behem, witam na forum Program wygląda bardzo ładnie - duży plus za komentarze i ładne wcięcia w kodzie! spwr, przy większej ilości diod warto byłoby pokusić się o wykorzystanie funkcji map (jeśli dobrze pamiętam pojawia się trochę dalej w kursie) oraz ustawianie stanów na wyjściach za pomocą pętli for
feniks_ Luty 16, 2017 Udostępnij Luty 16, 2017 Witam, pisze w zasadzie nie wiedzac czy jeszcze mozna tu podpytywać cos Kurs juz troche ma a ja dopiero teraz jadez temattem stad dopiero zagaduje. Widzialem wiele rozwiazan ale mimo wszystko chce swoje wymyslec i ...oczywiscie mam problem . Chciałęm rozwiazac warunek mozliwosc pomylki o 50 działaniem - if(liczbaPodana -liczbaUstawiona = +-50) itd... ew . if(liczbaPodana - liczbaUstawiona = 50||-50) ale z racji iż musimy sie komunikować poprzez port seregowy to musze liczbePodana uzyc jak zmienna String , natomiast liczbeUstawiona jako zmienna int . Tyle , że nie moge na takich dwoch zmiennych wykonać takiego działania ....String to ciag znaków a int to liczby całkowite....co porponujecie w takiej sytuacji , by można to w ten sposob rozwiazac ? Będe bardzo wdzięczny za jakakolwiek pomoc
Treker (Damian Szymański) Luty 19, 2017 Udostępnij Luty 19, 2017 feniks_, oczywiście - cały czas można podpytywać Rozwiązaniem Twojego problemu będzie funkcja toInt(), która konwertuje string na int. Więcej informacji na jej temat znajdziesz w dokumentacji Arduino: https://www.arduino.cc/en/Reference/StringToInt
feniks_ Luty 19, 2017 Udostępnij Luty 19, 2017 feniks_, oczywiście - cały czas można podpytywać Rozwiązaniem Twojego problemu będzie funkcja toInt(), która konwertuje string na int. Więcej informacji na jej temat znajdziesz w dokumentacji Arduino: https://www.arduino.cc/en/Reference/StringToInt Dzięki seredeczne za pomoc Znaczy chcesz powiedzieć , że zmienną String trzeba zapisać jako toInt ? Czy zostawić zapis i w funkcji loop zapisać toInt i dopiero jakoś zmienić String na toInt? Wybacz , że tak podpytuje ale ze str wytlumaczenie jest dosyć cieżkie jeszcze dla mnie A chce jak najszybciej rozwiązać problem bo widze ciekawe artykuly w dalszej cz. kursu o serwomechanizmach a powiedziałęm sobie , że dopóki nie rozwiąze wszystkiego to dalej nie ide z kursem
Treker (Damian Szymański) Luty 19, 2017 Udostępnij Luty 19, 2017 feniks_, na stronie, którą podałem jest odnośnik do przykładowego kodu: https://www.arduino.cc/en/Tutorial/StringToIntExample Funkcji toInt() musisz użyć tylko tam, gdzie chcesz mieć zamienioną wartość ze String na int, a to już zależy od Ciebie
feniks_ Luty 20, 2017 Udostępnij Luty 20, 2017 Tzn to akurat rozumiem tylko funkcja jako toInt sama w sobie jest konwersją tzn jakby dodatkiem do nazwy zmiennej a samej funkcji nie mogę przykładowo użyć toInt(nazwa_zmiennej....)no włąsnie i co dalej :X sam zapis jest dla mnie jasny jednak na przykłądzie wrzucają dodatkową funkcje char i to zaczyna komplikować cały przykład tak naprawdę :X albo klasycznie wychodze na słabo kumatego [ Dodano: 20-02-2017, 20:57 ] Tak wygląda mój kod na etapie odejmowania String i int oczywiscie po konwertowaniu String na int w "podanejLiczbie" ale coś sie dalej nie konwertuje....:X co w nim jest nie tak przy tym zapisie ?:/ String podanaLiczba = ""; //liczba podana w porcie szereg int liczbaUstawiona = ""; //liczba ustawiona na pokretle void setup() { Serial.begin(9600); } void loop() { liczbaUstawiona = analogRead(A5); //odczyt z portu analogowego A5 if (Serial.available() > 0) { podanaLiczba = Serial.readStringUntil('\n'); podanaLiczba = podanaLiczba.toInt(); if (podanaLiczba - liczbaUstawiona = 50||-50) { Serial.println("wygrales"); } } }
feniks_ Luty 21, 2017 Udostępnij Luty 21, 2017 rozbudowałem swoj kod juz troche dalej , by nie tracic czasu i jak kolega powyzej postanowilem się wzorować na nim gdyż widze jak przekształcił funkcje String na int ale ...u mnie siłą rzeczy nadal to nei funguje nie wiedząc czemu ... String podanaLiczba = ""; //liczba podana w porcie szereg int podanaLiczba_int = 0; //zmienna przerobiona z "podanaLiczba" int liczbaUstawiona = 0; //liczba ustawiona na pokretle int zielonaLed = 8; int czerwonaLed = 9; int zoltaLed = 10; int przycisk = 11; bool losowanie = false; bool start =false; void setup() { Serial.begin(9600); pinMode(zielonaLed, OUTPUT); // ustawienie diody jako wyjscia pinMode(czerwonaLed, OUTPUT); // ustawienie diody jako wyjscia pinMode(zoltaLed, OUTPUT); // ustawienie diody jako wyjscia pinMode(przycisk, INPUT); // ustawienie przycisku jako sygnalu wejscia digitalWrite(przycisk, INPUT_PULLUP); //przycisk sterowany w momencie gdy pojawi sie na nim stan wysoki digitalWrite(zielonaLed, LOW); // sstan niski poczatkowo diody digitalWrite(czerwonaLed, LOW); // sstan niski poczatkowo diody digitalWrite(zoltaLed, LOW); // sstan niski poczatkowo diody Serial.println("Witaj w grze Losowych Liczb"); Serial.println("Ustaw liczbe pokretlem i nacisnij przycisk"); start =true; while (start = true) { delay(20); } } void loop() { liczbaUstawiona = analogRead(A5); //odczyt z portu analogowego A5 podanaLiczba_int = podanaLiczba.toInt(); //podana liczba przeksztalcona na int losowanie =true; if(digitalRead(przycisk)==HIGH)// po nacisnieciu przycisku ruszy mechanizm gry { if (Serial.available() > 0) { podanaLiczba = Serial.readStringUntil('\n'); if (podanaLiczba > liczbaUstawiona + 50 ) // Przypadek wykonania mechanizmu gdy odp nie miesci sie w zadanym przedziale { Serial.println("przegrales"); while(losowanie = false) { delay(20); } digitalWrite(zielonaLed, HIGH); delay(5000); digitalWrite(zielonaLed, LOW); [ Dodano: 21-02-2017, 23:05 ] postanowilem pojechac dalej z tematem , bo nie ma co marudzic tylko trzeba jechac z tematem Rozwiazalem zadanie 4.6 w miedzy czasie Wiem wiem , można by stany ustawić petlą for ...ale nie było jeszczee tego w kursie int odczytGora = 0; //zmienna portu A4 int odczytDol = 0; //zmienna portu A5 void setup() { Serial.begin(9600); pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); pinMode(10, OUTPUT); pinMode(9, OUTPUT); pinMode(8, OUTPUT); pinMode(7, OUTPUT); //ustawienie wskaznikow jako wyjscia digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, LOW); // ustawienie wskaznikow w stan wyjsciowy } void loop() { odczytGora = analogRead(A4); // odczyt z portu analogowego fotorezystora gornego odczytDol = analogRead(A5);// odczyt z portu analogowego fotorezystora dolnego odczytGora = map(odczytGora, 450, 760 , 1, 4); // ustwienie zakresow podswietlenia (moj fotorezyst. njalepiej dzialal przy tym) odczytDol = map(odczytDol, 450, 760, 1, 4);// ustwienie zakresow podswietlenia if (odczytGora < odczytDol) { // warunek podswietlenia do gory wskaznika if (odczytGora == 4) { digitalWrite(10, HIGH); //jedna dioda zapalona digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); } if (odczytGora == 3) { digitalWrite(10, HIGH); // dwie diody zapalone digitalWrite(11, HIGH); digitalWrite(12, LOW); digitalWrite(13, LOW); } if (odczytGora == 2) { digitalWrite(10, HIGH); // trzy diody zapalone digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, LOW); } if (odczytGora == 1) { digitalWrite(10, HIGH); // cztery diody zapalone digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); } } if (odczytGora > odczytDol) {// warunek podswietlenia do dolu wskaznika if (odczytDol == 4) { digitalWrite(10, HIGH); //jedna dioda zapalona digitalWrite(9, LOW); digitalWrite(8, LOW); digitalWrite(7, LOW); } if (odczytDol == 3) { digitalWrite(10, HIGH); //dwie diody zapalone digitalWrite(9, HIGH); digitalWrite(8, LOW); digitalWrite(7, LOW); } if (odczytDol == 2) { digitalWrite(10, HIGH); // trzy diody zapalone digitalWrite(9, HIGH); digitalWrite(8, HIGH); digitalWrite(7, LOW); } if (odczytDol == 1) { digitalWrite(10, HIGH); // cztery diody zapalone digitalWrite(9, HIGH); digitalWrite(8, HIGH); digitalWrite(7, HIGH); } } }
Rutusowiec Luty 22, 2017 Udostępnij Luty 22, 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? Marku, źle zadałem pytanie. Przy pomocy Serial.read() nie da się tego zrobić nie korzystając z funkcji toInt() ale poszło tak: long x; long y; void setup() { Serial.begin(9600); } void loop() { Serial.println("Podaj liczbe"); while (Serial.available() == 0) {} x = Serial.parseInt(); Serial.print("Twoja liczba to "); Serial.println(x); y=++x; Serial.println(y); }
Tenshuchiyu Marzec 18, 2017 Udostępnij Marzec 18, 2017 Świetny kurs ! Czy w przykładzie z pięcioma diodami nie ma błędu? Napisałeś " (...) void loop() { odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC odczytanaWartosc = map(odczytanaWartosc, 0, 1023, 1, 5);//Przeskalowanie wartości if (odczytanaWartosc == 1) { //Pierwszy zakres (...) Czy jednak nie powinno być : (...) void loop() { odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC wartoscPrzeskalowana = map(odczytanaWartosc, 0, 1023, 1, 5);//Przeskalowanie wartości if (wartoscPrzeskalowana == 1) { //Pierwszy zakres (...) ?
Treker (Damian Szymański) Marzec 18, 2017 Udostępnij Marzec 18, 2017 Tenshuchiyu, kawałek wyżej użyłem nazwy "wartoscPrzeskalowana", aby od razu było wiadomo, że funkcja map zwraca wartość przeskalowaną. W programie skorzystałem z "odczytanaWartosc", bo nie chciałem dodatkowo tworzyć nowej zmiennej. Kod działa poprawnie, ponieważ w poniższej linii następuje zastąpienie wartości zmiennej "doczytanaWartosc", tą nową, przeskalowaną wartością: odczytanaWartosc = map(odczytanaWartosc, 0, 1023, 1, 5);//Przeskalowanie wartości
Robur Kwiecień 17, 2017 Udostępnij Kwiecień 17, 2017 Widzę, że dawno tu nikogo nie było Niedawno zacząłem zabawę z kursem. Poniżej mój kod do zadania 4.6 Wszelkie kometarze mile widziane /* Dwa fotorezystory, linijka diodowa pokazuje, z ktorej strony jest zrodlo swiatla*/ #define FRLeft A4 //linia analogowa z podlaczonym lewym fr #define FRRight A5 //linia analogowa z podlaczonym prawym fr int Left=0; //wartosc z lewego fr int Right=0; //wartosc z prawego fr int Dioda=0; //numer diody do zapalenia int DiodaOld=0; //dioda poprzednio zapalona void setup() { Serial.begin(9600); Serial.println("Start pracy"); for (int i=2;i<=6;i++){ //inicjacja linijki diodowej oraz test zapalenia diod pinMode(i, OUTPUT); digitalWrite(i, HIGH); delay(300); digitalWrite(i, LOW); } } void loop() { Left=analogRead(FRLeft); //odczytanie lewego fotorezystora Right=analogRead(FRRight); //odczytanie prawego fotorezystora Serial.print("Lewy: "); //wartosci testowe wysylane na terminal Serial.print(Left); Serial.print(" Prawy: "); Serial.print(Right); Serial.print(" Roznica: "); Serial.print(Left-Right); Dioda=map(Left-Right,-200, 200, 2, 6); //Przemapowanie roznicy miedzy dwoma fr na numery diod do zapalenia. Wartosci -200 i 200 zostaly wyznaczone empirycznie podczas oswietlania latarka. Serial.print(" Dioda do zapalenia: "); Serial.println(Dioda); //Koniec wysylania wartosci testowych do terminala if (Dioda!=DiodaOld){ //Weryfikacja, czy potrzebna zmiana zapalenia diody digitalWrite(DiodaOld, LOW); //jesli tak to stara jest gaszona a nowa zapalana digitalWrite(Dioda, HIGH); DiodaOld=Dioda; //zapamietania jaka dioda byla poprzednio zapalona } delay(100); }
Treker (Damian Szymański) Kwiecień 18, 2017 Udostępnij Kwiecień 18, 2017 Robur, super - wygląda bardzo fajnie Sprytne rozwiązanie - wręcz wzorowa robota!
orbit6 Kwiecień 25, 2017 Udostępnij Kwiecień 25, 2017 Chciałem napisać komentarz, ale potem podczas palenia sobie (na szczęscie tylko jednego) portu w ardu poznałem odpowiedź
KrzysioJerzyna Maj 3, 2017 Udostępnij Maj 3, 2017 Witam, jest to mój pierwszy komentarz na tym forum i prawdopodobnie bardzo głupi. Chciałbym się spytać jak skleić te 3 linie kodu w 1. Zmienna napięcie jest typu float. Gdy piszę to następująco: Serial.println("Napiecie wynosi:" + napiecie + "V"); kompilator wyrzuca mi błąd. Poniżej jest poprawnie, jednak program wypisuje mi to w 3 liniach, a chciałbym osiągnąć taki rezultat: Napiecie wynosi: 4.20V Serial.println("Napiecie wynosi:"); Serial.println(napiecie); Serial.println("V"); Z góry dziękuję za pomoc.
Lukaszm Maj 3, 2017 Udostępnij Maj 3, 2017 Nie możesz zrobić tej pierwszej opcji bo napisy są typu char*,a napięcie masz pewnie w int lub float i kompilator nie wie jak połączyć ze sobą te dwa typy danych. Jedną z prostszych opcji rozwiązania tego problemu to właśnie to co zaproponowałeś (trzy wywołania funkcji print). Możesz też ręcznie zamieniać float na ciąg znaków, łączyć ze sobą trzy ciągi i wysyłać je jednym wywołaniem funkcji, ale to raczej nie ma sensu. Trzecia opcja to wykorzystanie klasy String (mówiąc szczerze na Arduino nie korzystałem, więc nie wiem jaki jest zakres zastosowania) i konwertować float na string (jeśli jest taka metoda w bibliotece Arduino) i dla stringów już jest określona operacja '+'. EDIT: ups, nie do końca zrozumiałem o co chodzi (że nie ma być nowych linii). Myślałem, że autor pytania chce koniecznie zmieścić wszystko w jednym wywołaniu Serial.print().
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ę »