marek1707 Maj 3, 2017 Udostępnij Maj 3, 2017 println dołącza zawsze na końcu znak nowej linii. Użyj print: Serial.print("Napiecie wynosi: "); Serial.print(napiecie); Serial.println("V"); A w razie kolejnych wątpliwości zawsze zaczynaj od dokumentacji: https://www.arduino.cc/en/reference/serial 1
MrSnowman24688 Czerwiec 21, 2017 Udostępnij Czerwiec 21, 2017 Witam! Dopiero się uczę i potrzebuję pomocy. Próbowałem zrobić zadanie 4.5 ale niestety nie potrafię rozwiązać jednego problemu. [ podany kod służy jedynie do zademonstrowania problemu ] Chciałbym aby po naciśnięciu przycisku program czekał na podanie imienia i dopiero później przechodził do dalszej części programu. Obecnie wygląda to tak, że po wpisaniu imienia nic się nie dzieje. Dopiero po kolejnym naciśnięciu przycisku pojawia się tekst "Podaj imię:" oraz "Witaj " + odebraneDane + "!". String odebraneDane = ""; //Pusty ciąg odebranych danych void setup () { Serial.begin (9600); pinMode(8,INPUT_PULLUP); } void loop () { if (digitalRead(8) == LOW) { delay(300); Serial.println("Podaj imię:"); if(Serial.available() > 0) { odebraneDane = Serial.readStringUntil('\n'); Serial.println("Witaj " + odebraneDane + "!"); } } }
Treker (Damian Szymański) Czerwiec 21, 2017 Udostępnij Czerwiec 21, 2017 MrSnowman24688, witam na forum! Podaję hasło klucz: pętla while Bez tego będzie ciężko. Nie podaję rozwiązania, spróbuj najpierw podziałać coś samodzielnie.
MrSnowman24688 Czerwiec 22, 2017 Udostępnij Czerwiec 22, 2017 Dzięki Treker "while(Serial.available()==0){}" rozwiązało problem. Mam nadzieję, że o to chodziło.
Treker (Damian Szymański) Czerwiec 26, 2017 Udostępnij Czerwiec 26, 2017 MrSnowman24688, tak, dokładnie o to Inna opcja zapisu (z wykorzystaniem wykrzyknika jako negacji): while(!Serial.available()){}
mario321 Lipiec 8, 2017 Udostępnij Lipiec 8, 2017 Witam, Jestem nowy na forum. Zaczynam przygodę z arduino ! Zadanie domowe 4.1 W skrajnej pozycji potencjometru(minimum) , dioda led delikatnie mruga. W drugiej skrajnej pozycji (max) led pali się światłem ciągłym , ale na oscyloskopie widać szpilki, które powstają z tą samą częstotliwością co mruganie leda na w pozycji potencjometru skręconego na minimum. Jak zatem pozbyć się tego efektu ? Tak, aby led był całkowicie wyłączony lub zapalony . Jak umieścić ten kod w pętli wewnętrznej ? Tak aby czas załączania i wyłączenia leda nie wpływał na inne pętle użyte w kodzie? Pozdrawiam.
Treker (Damian Szymański) Lipiec 9, 2017 Udostępnij Lipiec 9, 2017 mario321, witam na forum Pokaż swój program - łatwiej będzie znaleźć rozwiązanie.
mario321 Lipiec 10, 2017 Udostępnij Lipiec 10, 2017 unsigned long currentTime; unsigned long currentLowTime; unsigned long currentMillis; unsigned long currentTimeB; unsigned long currentLowTimeB; unsigned long currentMillisB; int PotPin = A2; // przypisujemy do zmiennej numer wejścia analogowego ANALOG IN - A2 int pot; // zmienna w której będziemy zapisywać "wartość" potencjometru int zalaczanie; // zmienna w której będziemy zapisywać czas załączania int przerwa; // zmienna w której będziemy zapisywać czas przerwy void setup() { Serial.begin(9600); pinMode(8, OUTPUT); currentMillis=millis(); currentTime=0; currentLowTime=0; pinMode(9, OUTPUT); currentMillis=millis(); currentTime=0; currentLowTime=0; pinMode(10, OUTPUT); } int isInRange(long low, long high,long val) { if(val<low || val>high) return 0; return 1; } void loop() { Serial.println(analogRead(A0)); if(isInRange(800,1023,analogRead(A0))) { currentLowTime=0; currentTime+=(millis()-currentMillis); currentMillis=millis(); if(isInRange(0,200,currentTime)) { digitalWrite(8, HIGH); } else if(isInRange(200,1000,currentTime)) { digitalWrite(8, LOW); } else if(isInRange(1000,1400,currentTime)) { digitalWrite(8, HIGH); } else if(isInRange(1400,2000,currentTime)) { digitalWrite(8, LOW); } else if(isInRange(2000,2600,currentTime)){ digitalWrite(8, HIGH); } else if(isInRange(2600,3000,currentTime)) { digitalWrite(8, LOW); } else if(isInRange(3000,3800,currentTime)) { digitalWrite(8, HIGH); } else if(isInRange(3800,4000,currentTime)) { digitalWrite(8, LOW); } else { digitalWrite(8, HIGH); } } else { currentLowTime+=(millis()-currentMillis); currentMillis=millis(); if(currentLowTime>5) { currentTime=0; digitalWrite(8, LOW); } } { Serial.println(analogRead(A1)); if(isInRange(800,1023,analogRead(A1))) { currentLowTimeB=0; currentTimeB+=(millis()-currentMillisB); currentMillisB=millis(); if(isInRange(0,200,currentTimeB)) { digitalWrite(9, HIGH); } else if(isInRange(200,1000,currentTimeB)) { digitalWrite(9, LOW); } else if(isInRange(1000,1400,currentTimeB)) { digitalWrite(9, HIGH); } else if(isInRange(1400,2000,currentTimeB)) { digitalWrite(9, LOW); } else if(isInRange(2000,2600,currentTimeB)) { digitalWrite(9, HIGH); } else if(isInRange(2600,3000,currentTimeB)) { digitalWrite(9, LOW); } else if(isInRange(3000,3800,currentTimeB)) { digitalWrite(9, HIGH); } else if(isInRange(3800,4000,currentTimeB)) { digitalWrite(9, LOW); } else { digitalWrite(9, HIGH); } } else { currentLowTimeB+=(millis()-currentMillisB); currentMillisB=millis(); if(currentLowTimeB>5) { currentTimeB=0; digitalWrite(9, LOW); } } } { // regulacja potencjometru pot = analogRead(PotPin); // odczytujemy A2 i zapisujemy w zmiennej pot if (pot > 800) { pot=800; } if (pot < 150) { pot=150; } zalaczanie = map(pot, 150, 800, 0, 100); przerwa = map(pot, 150, 800, 100, 0); digitalWrite(10, HIGH); delay(zalaczanie); // przerwa zależna od położenia potencjometru digitalWrite(10, LOW); delay(przerwa); // przerwa zależna od położenia potencjometru } } I jeśli zmieniam czas tutaj : zalaczanie = map(pot, 150, 800, 0, 100); przerwa = map(pot, 150, 800, 100, 0); z 0,100 na 0,1000 i z 100, 0 na 1000, 0 to automatycznie miganie diody na pinie 10 jest wolniejsze, tak jak być powinno, ale diody na pinie 8 i 9 tracą swoją sekwencje przez zmianę czasu w załączaniu i przerwie.... Można to umieścić w pętli wewnętrznej ?(najlepiej by było gdyby był drugi loop ) Tak aby zmiany czasu nie miały wpływu na pin 8 i 9 ? I jeszcze jedno : Kiedy skręcę potencjometr (wejscie A2 , wyjscie 10 ) na minimum to dioda lekko się błyska, zarży się na ułamek sekundy z częstotliwością taką, jaką jest zadana czasowo. zalaczanie = map(pot, 150, 800, 0, 100); przerwa = map(pot, 150, 800, 100, 0); czyli : 0, 100 100,0 Natomiast kiedy skręcę potencjometr na max dioda pali się światłem ciągłym, ale na oscyloskopie widać szpilki, też dokładnie z tą samą częstotliwością jak przypadku potencjometru skręconego na minimum. Nie chcę szpilek, ani zarżenia się diody . Jak się tego pozbyć?
Treker (Damian Szymański) Lipiec 11, 2017 Udostępnij Lipiec 11, 2017 mario321, niestety Twój program jest dość nieczytelny (brak wcięć, wybrakowane komentarze). Bardzo ciężko go analizować - nie jestem w stanie na ten moment pomóc, bo nie mam pod ręką Arduino, a analizowanie tego w głowie nie przyniesie niczego dobrego. Korzystasz też z funkcji, które nie były omawiane w kursie (milis) dlatego najlepiej będzie, jeśli w przypadku dalszych problemów założysz osobny temat, w którym opiszesz problem. Dzięki temu nie będziemy "mieszać w głowach" innym czytelnikom tego kursu. Z góry dziękuję za zrozumienie i pomoc w utrzymaniu porządku na forum
sebastian_sl Lipiec 22, 2017 Udostępnij Lipiec 22, 2017 Cześć, mam pytanie odn. zachowania układu - dioda włączana/wyłączana zależnie od stanu fotorezystora i potencjometru. Dla jasności w programie dodałem funkcję,która wyświetla pomiary na A5 oraz A4. W przypadku zaciemnienia fotorezystora,odczyty z potencjometru spadały, natomiast w odwrotnej sytuacji - rosły. przykładowe pary: 136:680; 45:640; 670:850; Można temu jakoś zaradzić?
Treker (Damian Szymański) Lipiec 22, 2017 Udostępnij Lipiec 22, 2017 sebastian_sl, jeśli chcesz, aby odczyty były "odwrotne" możesz zrobić to programowo lub sprzętowo. W drugim wypadku wystarczy zamienić zasilanie dzielnika napięcia: masa do fotorezystora, a 5V (Vcc) do rezystora (lub odwrotnie).
RC95 Sierpień 22, 2017 Udostępnij Sierpień 22, 2017 Witam, jako że to mój pierwszy komentarz, chciałem podziękować za kursy, które są świetne. Przeszedłem elektronikę I i dotychczasowe części Arduino z przyjemnością. Teraz przy zadaniu 4.5 napotkałem problem. Chodzi o przekazywanie liczb do Arduino przez UART. Moja filozofia jest taka że rozwiązuje zadania na bazie informacji z kursu i wydaje mi się że tym razem było ich za mało. Ostatecznie rozwiązałem problem posiłkując się kodem jednego z użytkowników, ale nie miałem pełnej satysfakcji. Stąd moja sugestia, żeby dodać do kursu coś o instrukcji/poleceniu(?) "xxx.toInt()". Kolejną nurtującą mnie rzeczą jest zastosowanie dzielnika napięcia przy fotorezystorze. Skoro jego rezystancja jest zależna od oświetlenia, to czy odczytów z ADC nie można dokonać po prostu "za" szeregowym połączeniem fotorezystora z rezystorem (bez konieczności stosowania dzielnika)?
Treker (Damian Szymański) Sierpień 23, 2017 Udostępnij Sierpień 23, 2017 RC95, witam na forum, dziękuję za miłe słowa! Faktycznie w tej części nie ma informacji o xxx.toInt(), pierwotnie zamysł był taki, aby zmusić czytelników do szukania i główkowania Jeszcze zostawię to w takiej formie, jeśli pojawi się więcej problemów, to zrobię stosowną aktualizację. Niestety nie wiem jak dokładnie chciałbyś inaczej podłączyć fotorezystor. W końcu dzielnik napięcia, to tak naprawdę szeregowe połączenie dwóch rezystorów. Nie rozumiem gdzie dokładnie chciałbyś dokonywać pomiaru. Spróbuj przerysować sobie schemat - może wtedy wszystko się rozjaśni.
Krigare Wrzesień 25, 2017 Udostępnij Wrzesień 25, 2017 Treker Przydało by się poprawić w kursie to co Pakos napisał. Wybacz, że to piszę ale chwilę się męczyłem niczym doszedłem to tego co Pakos. Już myślałem że uszkodziłem Arduino. 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);
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ę »