MatByk Napisano Marzec 15, 2019 Udostępnij Napisano Marzec 15, 2019 Witam, Mam problem ze sterowaniem silnika. Chciałbym aby przy pewnych prędkościach silników zapalała się odpowiednia dioda LED celem sygnalizacji osiągnięcia pewnej prędkości ( coś jak w samochodzie sygnalizacja zmiany biegów gdy prędkość jest nie adekwatna do numeru biegu). void loop() { for (int i = 200; i >= 50; i--) { analogWrite(silnik, i); //zmniejszamy V if (i == 180 ) { digitalWrite(led1, HIGH); //Zasygnalizuj zmiane biegu } else if (i == 100 ) { digitalWrite(led2, HIGH); //Zasygnalizuj zmiane biegu } else{ digitalWrite(led1, LOW); digitalWrite(led2, LOW); delay(50); } } } Powyższy kod jest moją modyfikacją kodu z kursu Arduino I #8. Mój problem polega na tym że sygnalizacja działa prawidłowo tylko dla ścisłego określenia jednej wartości iterowanej ,, if (i == 180 )'' natomiast gdy chcę aby dioda świeciła się przez np. ,, if ( i > 180 && i < 160) '' zauważalne są skoki prędkości. Nie wiem jak sobie z tym poradzić. Czy jest jakaś możliwość zaradzenia temu? Link do komentarza Share on other sites More sharing options...
ethanak Marzec 16, 2019 Udostępnij Marzec 16, 2019 7 godzin temu, MatByk napisał: if ( i > 180 && i < 160) Podaj mi przykład wartości i która jest jednocześnie większa od 180 i mniejsza od 160... Przy okazji: podziel prędkości na zakresy i zapalaj diodę przy zmianie zakresu (czyli musisz pamiętać jaki był poprzedni). Link do komentarza Share on other sites More sharing options...
MatByk Marzec 16, 2019 Autor tematu Udostępnij Marzec 16, 2019 Wybacz. Mój błąd w warunku. Oczywiście chodziło o " if ( i <180 && i > 160) " Podział prędkości? Jak miałbym to wykonać? Link do komentarza Share on other sites More sharing options...
ethanak Marzec 16, 2019 Udostępnij Marzec 16, 2019 Czekaj bo ja też trochę nie tak napisałem (trochę za wcześnie siadłem do kompa). Ale i tak podział by się przydał bo program będzie czytelniejszy. Niestety - podałeś przykład kodu który działa a wstydziłeś się pokazać niedziałający... więc jak mamy Ci pomóc? 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
MatByk Marzec 16, 2019 Autor tematu Udostępnij Marzec 16, 2019 (edytowany) Zdjęcie przyrządu nad którym ma być wykonany kod. Przyrząd działa jak dwa woltomierze analogowe( odchylanie wskazówek od centrum). Może nie tyle że kod działa poprawnie ale zmiany nie są zauważalne przy dużych wartościach zmiennej iterowanej (200-50, a np przy 20-2 widać przeskoki napięć). Błędny kod poniżej: void loop() { for (int i = 200; i >= 50; i--) { analogWrite(silnik, i); //zmniejszamy V if (i < 180 && i > 160 ) { digitalWrite(led1, HIGH); //Zasygnalizuj zmiane biegu } else if (i < 100 && i > 80 ) { digitalWrite(led2, HIGH); //Zasygnalizuj zmiane biegu } else{ digitalWrite(led1, LOW); digitalWrite(led2, LOW); delay(50); } } } Edytowano Marzec 16, 2019 przez MatByk Link do komentarza Share on other sites More sharing options...
ethanak Marzec 16, 2019 Udostępnij Marzec 16, 2019 Zmiany czego... bo nic z tego nie rozumiem, gdzie silnik a gdzie dwa woltomierze, jakie woltomierze, do czego je podłączasz? Jeśli zmienna i osiągnie 180 to przyrząd nawet nie zdąży zasygnalizować, prawda? Bo przecież za chwilę będziesz miał 160 (pętla w zakresie od 180 do 160 idzie bez żadnych opóźnień). Jakbyś tego delaya wstawił we właściwe miejsce (tzn. na koniec pętli for a nie w else) to może by było lepiej... Link do komentarza Share on other sites More sharing options...
MatByk Marzec 16, 2019 Autor tematu Udostępnij Marzec 16, 2019 (edytowany) Pojedynczy Woltomierz jest oznaczony w kodzie jako ,,silnik''( takie oznaczenie ma w angielskiej dokumentacji). Woltomierz VDC o zakresie 0-3V. Poprawiony kod poniżej. Faktycznie pomogło 🙂 Zmiany prędkości(jakby przeskok z jednej wartości do drugiej bez płynnego przejścia). void loop() { for (int i = 200; i >= 50; i--) { analogWrite(silnik, i); //zmniejszamy V if (i < 180 && i > 160 ) { digitalWrite(led1, HIGH); //Zasygnalizuj zmiane biegu } else if (i < 100 && i > 80 ) { digitalWrite(led2, HIGH); //Zasygnalizuj zmiane biegu } else{ digitalWrite(led1, LOW); digitalWrite(led2, LOW); } delay(50); } } Edytowano Marzec 16, 2019 przez MatByk Link do komentarza Share on other sites More sharing options...
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ę »