Skocz do zawartości

Spowolniony program


Neeeds

Pomocna odpowiedź

Witam, zauważyłem w swoim arduino jeden problem, który nie wiem jak rozwiązać. Napisałem prosty programik w którym jeden warunek ma sie wykonywać bez przerwy(if(val >400 && val <600)). Dołożyłem dwa przyciski, które po wciśnięciu zapalają diodę 1 lub 2. Z tego co zauważyłem (na serial porcie) to gdy wciskam jeden przycisk to wykonuje się warunek i jedna dioda świeci, gdy dwa wcisne to obie świecą, ale już nie tak jasno jak powinny świecić. Zapewne to dlatego, że skoro wykonują sie 3 warunki naraz to ogólna pętla zwalnia 3 krotnie bo musi wykonać 3 if'y po kolei. I tu moje pytanie, czy da się zrobić tak by świeciły maksymalnie jak powinny? Później mam zamiar podłączyć tam silniki więc nie moge mieć takich opóźnień. Załączam poglądowy kod:

int val;
void setup()
{
Serial.begin(9600);
pinMode(2, OUTPUT);
digitalWrite(2, HIGH);
pinMode(7,OUTPUT);
digitalWrite(7, HIGH);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
}
void loop()
{
val = (analogRead(A1));
if(val >400 && val <600)
{
Serial.println(1);
Serial.println(2);
Serial.println(3);

}
if(val >600)
{
Serial.println(4);
Serial.println(5);
Serial.println(6);
delay(500);
}
if(val <400)
{
Serial.println(7);
Serial.println(8);
Serial.println(9);
delay(500);
}
if(digitalRead(2) == LOW)
{
Serial.println(10);
Serial.println(11);
Serial.println(12);
digitalWrite(4, HIGH);
}
else
{
Serial.println(100000);
digitalWrite(4, LOW);
}
if(digitalRead(7) == LOW)
{
Serial.println(13);
Serial.println(14);
Serial.println(15);
digitalWrite(5, HIGH);
}
else
{
Serial.println(9999999);
digitalWrite(5, LOW);
}
}

Chciałbym aby warunek po wciśnięciu przycisku się wykonywał tak długo jak jest on wciśnięty.

Link do komentarza
Share on other sites

Jeśli diody świecą się słabiej to nie dlatego, że coś się wykonuje wolniej tylko dlatego, że je bez sensu wyłączasz. Nie mam zamiaru analizować Twojego kompletnie nieczytelnego programu więc nie wskażę palcem miejsca błędu. Być może nie istnieje takie jedno, bo cała kompozycja kodu jest zła - niestety nikt tego w powyższym nie odkryje. Wygląda, że Ty sam masz z nim kłopoty. Tak, styl zapisu jest jednym z narzędzi wspierających powstawanie poprawnych programów, zacznij od teraz.

Jeśli spełniasz jakieś warunki zapalania diod, to je zapalaj na stałe - wtedy będą świecić poprawnie. Jeśli jednocześnie gasisz je w innych warunkach, to zaczynają przygasać lub mrugać. Sformatuj program tak (wcięcia!), by było widać co z czego wynika i co kiedy się wykonuje a kiedy nie.

A dodatkowo weź pod uwagę czasy nadawania znaków przez UART - to nie jest bezkarne. Gdy zapełnisz bufor wyjściowy, każde wysłanie bajtu przy 9600 to milisekunda. A Ty ślesz na monitor jakieś dziwne ciągi wielu liczb, które procesor musi dodatkowo konwertować na znaki. Nie wpadłeś na pomysł pisania prostych, ale coś znaczących komunikatów tekstowych typu "S1", "Stan A", "Switch 1" itp?

Link do komentarza
Share on other sites

Zgodze się w zupełności, że mogłem napisać np S1,S2, nie sądziłem że UART może na to jakoś wpłynąć. Nie jestem specjalistą więc tak na szybko chciałem napisać tylko poglądowy programik by zobaczyć co się kiedy wysyła. Ale jednego w Twojej wypowiedzi nie rozumiem. Chcę aby diody paliły się tak długo jak trzymam przycisk więc musze je wyłączać chyba że masz coś innego na myśli.

Link do komentarza
Share on other sites

Zamiast używać "magicznych liczb" lepiej jest zdefiniować odpowiednie stałe - inaczej pozostaje się domyślać, że np. pin 2 to pewnie przycisk:

if(digitalRead(2) == LOW)

Mam więc pytanie - czy przypadkiem nie ustawiasz tego pinu jako wyjścia?

pinMode(2, OUTPUT); 
digitalWrite(2, HIGH); 
pinMode(7,OUTPUT); 
digitalWrite(7, HIGH); 
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

Nie rozumiejąc Twojego programu podejrzewam/łem, że diody możesz zapalać i gasić w sposób delikatnie niekontrolowany. Jeżeli będziesz robił to wystarczająco często, np. w jakiejś pętli to możesz odnieść wrażenie przygasania, bo średnia jasność spada wraz z wydłużaniem przerw w świeceniu.

Przyczyną Twoich problemów może być też to o czym napisał Elvis: jeżeli pin zaprogramujesz na wyjście, wystawisz tam stan wysoki a potem przyciskiem zewrzesz to do masy i wczytasz stan, to w pewnym sensie to zadziała. Program będzie czytał stany 1 i 0, ale zwarcie takiego wyjścia przyciskiem do masy przywiera (przez tranzystor wyjściowy pinu) linię zasilania. To może spowodować spadek napięcia zasilającego i w skrajnym przypadku spalenie tego pinu procesora. A obniżenie napięcia to także spadek jasności wszystkich diodek LED.

Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.