Skocz do zawartości

Sygnalizacja zmiany biegu( for, mostek h)


MatByk

Pomocna odpowiedź

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

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

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

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

(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);
    }
    
}
}         

20190316_141644.jpg

Edytowano przez MatByk
Link do komentarza
Share on other sites

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

(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 przez MatByk
Link do komentarza
Share on other sites

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ę »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.