tarkki Grudzień 29, 2015 Udostępnij Grudzień 29, 2015 Witam, na podstawie poprzednich kursów złożyłem cos takiego i o ile w poprzednim kursie to działało przy użyciu pętli while to tu nie do końca. Napięcie jest wysyłane 1 raz po zaświeceniu się diody ale dioda nie chce zgasnąć tak jakby program nie mógł wyjść z tej ostatniej części mimo iż czujnik jest naświetlany. Co jest tego powodem ? int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC int prog = 0; //Próg włączenia światła - ustawiany potencjometrem float napiecie = 0; void setup() { Serial.begin(9600); //rozpoczęcie komunikacji przez USART pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED } void loop() { odczytanaWartosc = analogRead(A5); prog = analogRead(A4); napiecie = odczytanaWartosc *(5.0/1023.0); if(odczytanaWartosc > prog){ digitalWrite(8, LOW); } else{ digitalWrite(8, HIGH); Serial.println(napiecie); delay(50); while(odczytanaWartosc < prog){ } } } Cytuj Link do komentarza Share on other sites More sharing options...
Chumanista Grudzień 29, 2015 Udostępnij Grudzień 29, 2015 while(odczytanaWartosc < prog){} A tak konkretnie to jak ma się zmienić wartość zmiennej odczytanaWartosc? Magicznie? Wewnątrz pętli powinieneś jeszcze odczytywać ADC mam wrażenie. Cytuj Link do komentarza Share on other sites More sharing options...
tarkki Grudzień 29, 2015 Udostępnij Grudzień 29, 2015 ale po naświetleniu czujnika światła odczytanaWartość już nie jest < niż prog dopisałem "odczytanaWartosc = analogRead(A5);" do tej pętli i jakoś magicznie działa 😋 pytanie tylko po co 2 raz to trzeba pisać Cytuj Link do komentarza Share on other sites More sharing options...
Chumanista Grudzień 29, 2015 Udostępnij Grudzień 29, 2015 tarkki, Jak jest inna? Gdzie się ona zmienia? odczytanaWartosc jest zmienia w kodzie z pierwszego postu tylko raz, tutaj: odczytanaWartosc = analogRead(A5); w pierwszej linijce pętli głównej. W tym while o którym mówimy nie jest wykonywany żaden kod, nie ma więc co zmieniać wartości zmiennej. Może powinieneś powtórzyć sobie podstawy C a później brać się za Arduino? I proszę, pisz poprawnie po polsku. Wielkie litery oraz interpunkcja są ważne dla przejrzystości przekazu. [ Dodano: 30-12-2015, 01:10 ] Zauważ drobną różnicę pomiędzy: while (digitalRead (10 ) == HIGH) { a while(odczytanaWartosc < prog) { W pierwszym przykładzie wywołujesz funkcję która dokonuje odczytu, w drugim sprawdzasz jedynie wartość zmiennej. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
tarkki Grudzień 30, 2015 Udostępnij Grudzień 30, 2015 to skoro to jest źle to czemu działa poprawnie ? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Grudzień 30, 2015 Udostępnij Grudzień 30, 2015 tarkki, w poniższym przypadku: while(odczytanaWartosc < prog){ /*************/ } Jeśli przed wejściem do pętli odczytanaWartosc jest mniejsza od progu, to program utyka w miejscu gdzie wstawiłem gwiazdki. Cała reszta programu nie jest wykonywana. Aby działało to cały czas, w najprostszej wersji, musisz po prostu w pętli aktualizować zawartość zmiennej odczytanaWartosc. Cytuj Link do komentarza Share on other sites More sharing options...
Chumanista Grudzień 30, 2015 Udostępnij Grudzień 30, 2015 Treker, Albo jeszcze prościej użyć odczytywania w warunku pętli: while(analogRead(A5) < prog) { 1 Cytuj Link do komentarza Share on other sites More sharing options...
PatrykOSK Styczeń 3, 2016 Udostępnij Styczeń 3, 2016 Witam zatrzymałem się w martwym punkcie mianowicie mój program z zad 4.4 on stop przesyła wynik do terminalu bez względu na to czy dioda się świeci czy nie int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC int prog = 0; //Próg włączenia światła - ustawiany potencjometrem float napiecie = 0; void setup() { pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED Serial.begin(9600); } void loop() { odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC prog = analogRead(A4);//Odczytanie wartości z ADC napiecie = odczytanaWartosc * (5.0/1023.0); //Przeliczenie wartości na napięcie if (odczytanaWartosc < prog) { //Czy jest ciemniej od ustawionego progu? digitalWrite(8, HIGH);//Włączenie diody } else { digitalWrite(8, LOW);//Wyłączenie diody } if (digitalRead (8),HIGH);{ Serial.println(napiecie);} delay(50); } Ktoś pomoże ? 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
draghan Styczeń 3, 2016 Udostępnij Styczeń 3, 2016 if (digitalRead (8),HIGH);{ Serial.println(napiecie);} Nie powinieneś umieszczać średnika po nawiasie warunku. Średnik oznacza zakończenie instrukcji. Taki "if" nie posiada ciała, które się wykona w razie prawdziwości warunku, a punkt wykonania programu bezwarunkowo przejdzie do kolejnej instrukcji. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Styczeń 3, 2016 Udostępnij Styczeń 3, 2016 PatrykOSK, tak jak wspomniał draghan, masz problem z jednym if'em. Zarówno, jeśli chodzi o formatowanie wcięć jak i zbędny średnik. Sprawdź bez niego 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
PatrykOSK Styczeń 3, 2016 Udostępnij Styczeń 3, 2016 Niestety nawet i bez średnika jest i to samo :/ Dodam że robiąc to na początku udało mi się chociaż spowodować to że wartość napięcia była przesyłana do terminalu,co prawda nie raz ale to zawsze krok dalej. Udało mi się wrócić do lepszego ustawienia if (digitalRead(8) == HIGH){ Serial.println(napiecie);} Zmieniłem z (digitalRead(8),HIGH) Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Styczeń 3, 2016 Udostępnij Styczeń 3, 2016 PatrykOSK, ok to zacznijmy od początku. Pokaż cały aktualny kod i powiedz, co się dzieje 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
PatrykOSK Styczeń 4, 2016 Udostępnij Styczeń 4, 2016 int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC int prog = 0; //Próg włączenia światła - ustawiany potencjometrem float napiecie = 0; void setup() { pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED Serial.begin(9600); } void loop() { odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC prog = analogRead(A4);//Odczytanie wartości z ADC napiecie = odczytanaWartosc * (5.0/1023.0); //Przeliczenie wartości na napięcie if (odczytanaWartosc < prog) { //Czy jest ciemniej od ustawionego progu? digitalWrite(8, HIGH);//Włączenie diody } else { digitalWrite(8, LOW);//Wyłączenie diody } if (digitalRead (8)== HIGH){ Serial.println(napiecie);} delay(50); } Oto cały poprawiony kod i działa w ten sposób że gdy zasłonie fotorezystor info o napięciu jest przesyłne lecz nie raz a kilka/kilkanaście.Nie mogę wymyślić niczego żeby info. była wysłana tylko raz. 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Styczeń 4, 2016 Udostępnij Styczeń 4, 2016 PatrykOSK, ok teraz wszystko jasne. Program działa poprawnie. Nie napisałeś nic, co miałoby sprawić, że wysłanie komunikatu nastąpi raz. Wysyłasz go, gdy tylko dioda świeci. Musisz dorobić mechanizm pamiętający, czy wysłano już komunikat. Sprawdź jak zrobiłem to w tej części kursu Arduino: Kurs Arduino – #3 – UART (komunikacja z PC), zmienne Masz tam rozwiązany prawie identyczny przykład wraz z opisem 🙂 Dodatkowo traktowanie pinu z diodą jako wejście (bo sprawdzasz jego stan) nie jest zbyt eleganckim rozwiązaniem. Warto byłoby to zmienić. Cytuj Link do komentarza Share on other sites More sharing options...
PatrykOSK Styczeń 4, 2016 Udostępnij Styczeń 4, 2016 Kombinowałem kombinowałem i nic nie wychodzi. Dodałem pętle While ale program zawsze mi w tej pętli zostaje diod nie gaśnie a napiecie na terminalu się zatrzymuje. int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC int prog = 0; //Próg włączenia światła - ustawiany potencjometrem float napiecie = 0; void setup() { pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED Serial.begin(9600); } void loop() { odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC prog = analogRead(A4);//Odczytanie wartości z ADC napiecie = odczytanaWartosc * (5.0/1023.0); //Przeliczenie wartości na napięcie if (odczytanaWartosc < prog) { //Czy jest ciemniej od ustawionego progu? digitalWrite(8, HIGH);//Włączenie diody } else { digitalWrite(8, LOW);//Wyłączenie diody Serial.println(napiecie); } while (digitalRead (8)== HIGH){ delay(50); }} Rozumiem idee tego że wysłanie wartości do terminala ma być przed pętlą while i że jak wejdzie do niej ma tam zostać dopóki nie zostanie spełiony odpowiedni warunek ale nie potrafie tego zrealizować i zaczeło mnie to wkurzć :/ Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!