LieutenantDan Napisano Czerwiec 10, 2022 Udostępnij Napisano Czerwiec 10, 2022 Witam, Wczoraj rozpocząłem kurs arduino 1 i stworzyłem program, który włącza diodę co sekundę na 30ms(i tak się dzieje cały czas), a jeżeli przycisk w układzie jest wciśnięty to dioda ma zapalić się na 3sek a następnie wykonać sygnał SOS. (po tej operacji dioda powraca do swojego pikania co sekundę) I teraz backstory: Lampka migała jak należy i po wciśnięciu przycisku włączała się "procedura" SOS, tyle że w momencie wciśnięcia przycisku ten SOS nie włączał się od razu lecz należało poczekać, aż lampka sobie mignie jeszcze 0-1-2 razy (bardzo dziwne). Spowodowane to było tym: else { //jak nic nie klika to miganie pik pik co sekunde digitalWrite(8, HIGH); //wlacz diode delay(30); //wlacz na 0,03sek digitalWrite(8, LOW); //wylacz diode delay(970); digitalWrite(8, HIGH); //wlacz diode delay(30); //wlacz na 0,03sek digitalWrite(8, LOW); //wylacz diode delay(970); digitalWrite(8, HIGH); //wlacz diode delay(30); //wlacz na 0,03sek digitalWrite(8, LOW); //wylacz diode delay(970); } zorientowałem się, że nie ma takie coś sensu no i zmieniłem na: else { //jak nic nie klika to miganie pik pik co sekunde digitalWrite(8, HIGH); //wlacz diode delay(30); //wlacz na 0,03sek digitalWrite(8, LOW); //wylacz diode delay(970); } teraz zakładam, że przycisk powinien włączyć procedurę SOS maksymalnie po jednym piknięciu. Jednakże, nie mogę wgrać nowego poprawionego programu, wyskakuje błąd: Arduino:1.8.19 (Windows 10), Płytka:"Arduino Uno" Szkic używa 1458 bajtów (4%) pamięci programu. Maksimum to 32256 bajtów. Zmienne globalne używają 9 bajtów (0%) pamięci dynamicznej, pozostawiając 2039 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów. avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x4e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x4e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x4e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x4e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x4e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x4e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x4e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x4e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x4e avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x4e Problem uploading to board. See https://support.arduino.cc/hc/en-us/sections/360003198300 for suggestions. Ten raport powinien zawierać więcej informacji jeśli w File -> Preferencje zostanie włączona opcja "Pokaż szczegółowe informacje podczas kompilacji" Pytanie co poradzić, proszę o sugestię jak rozwiązać problem. Proszę o wyrozumiałość, to dopiero mój 2. dzień pracy z arduino, z góry dziękuję. Cały program wygląda tak: void setup() { pinMode(8, OUTPUT);//Dioda wyjście pinMode(7, INPUT_PULLUP);//przycisk jako wejście digitalWrite(8, LOW); //wyłączenie diody // put your setup code here, to run once: } void loop() { if (digitalRead(7) == LOW) { //if przycisk wcisniety digitalWrite(8, HIGH); //wlacz diode delay(3000); //wlacz na 3sek (swieci ciagle) digitalWrite(8, LOW); //wylacz diode delay(1000); //tutaj zaczyna S.O.S. digitalWrite(8, HIGH); //Włączenie diody delay(60); //odczekanie 0,06 sekundy digitalWrite(8, LOW); //Wyłączenie diody delay(180); //Odczekanie jednej sekundy digitalWrite(8, HIGH); //Włączenie diody delay(60); //odczekanie 0,06 sekundy digitalWrite(8, LOW); //Wyłączenie diody delay(180); //Odczekanie jednej sekundy digitalWrite(8, HIGH); //Włączenie diody delay(60); //odczekanie 0,06 sekundy digitalWrite(8, LOW); //Wyłączenie diody //S ^^^ delay(700); //Odczekanie przerwa miedzy literami //przerwa ^^^ digitalWrite(8, HIGH); //Włączenie diody delay(700); //odczekanie 0,7 sekundy digitalWrite(8, LOW); //Wyłączenie diody delay(180); //Odczekanie 0,18 sekundy digitalWrite(8, HIGH); //Włączenie diody delay(700); //odczekanie 0,7 sekundy digitalWrite(8, LOW); //Wyłączenie diody delay(180); //Odczekanie jednej sekundy digitalWrite(8, HIGH); //Włączenie diody delay(700); //odczekanie 0,7 sekundy digitalWrite(8, LOW); //Wyłączenie diody //O^^^ delay(700); //Odczekanie przerwa miedzy literami //przerwa^^^ digitalWrite(8, HIGH); //Włączenie diody delay(60); //Odczekanie 0,18 sekundy digitalWrite(8, LOW); //Wyłączenie diody delay(180); //odczekanie 0,06 sekundy digitalWrite(8, HIGH); //Włączenie diody delay(60); //Odczekanie 0,18 sekundy digitalWrite(8, LOW); //Wyłączenie diody delay(180); //odczekanie 0,06 sekundy digitalWrite(8, HIGH); //Włączenie diody delay(60); //odczekanie 0,06 sekundy digitalWrite(8, LOW); //Wyłączenie diody //S^^^ delay(700); //Odczekanie koncowe 0,7 sekundy } else { //jak nic nie klika to miganie pik pik co sekunde digitalWrite(8, HIGH); //wlacz diode delay(30); //wlacz na 0,03sek digitalWrite(8, LOW); //wylacz diode delay(970); } } Link do komentarza Share on other sites More sharing options...
Gieneq Czerwiec 10, 2022 Udostępnij Czerwiec 10, 2022 14 minut temu, LieutenantDan napisał: zorientowałem się, że nie ma takie coś sensu no i zmieniłem na @LieutenantDan tak, zgadza się. Sprawdź czy najprostszy program się wgrywa. Jeżeli się nie wgrywa to coś wystąpiło przy programowatorze. Miewam taki błąd gdy wgram coś gdzie na Serial idzie natłok komunikatów - u ciebie tego nie ma, albo gdy coś się stanie przy USB. Odłącz, podłącz. Jak nie zadziała odłącz, zrestartuj kompa, podłącz 🙂 1 Link do komentarza Share on other sites More sharing options...
LieutenantDan Czerwiec 10, 2022 Autor tematu Udostępnij Czerwiec 10, 2022 (edytowany) jeszcze jedno jeśli można, jak robi tego delaya(970) w else to wtedy nawet jak nacisnę przycisk to trzeba poczekać do momentu aż się załaduje od nowa faza migania i trzeba do tego momentu trzymać (te niecałą sekundę), wnioskuję więc, że podczas delaya wogóle nie można się komunikować z urządzeniem ani nic zrobić bo zasypia całkowicie na te 970ms w takim stanie jaki był zadany przed delayem i nie reaguje? Zgadza się? Więc jak bym miał przerwę 3000ms między tymi miganiami to on się nie obudzi od razu jak wcisnę przycisk? Czy da się zrobić tak żeby mimo delaya reagował od razu? Edytowano Czerwiec 10, 2022 przez LieutenantDan Link do komentarza Share on other sites More sharing options...
ethanak Czerwiec 10, 2022 Udostępnij Czerwiec 10, 2022 Pewnie że się da, tyle że bez stosowania funkcji typu "a teraz nie reaguj na nic przez godzinę". Czyli nie "mimo delaya" bo to bez sensu: każesz procesorowi nic nie robić, a jednocześnie chcesz aby coś robił. Poczytaj o maszynie stanów i o funkcji millis. Ogólnie robisz tak, żeby procek nie siedział w durnym delayu, tylko periodycznie sprawdzał stan wejścia (w tym przypadku wciśniecie klawisza) oraz czas który minął od jakiegoś wydarzenia (np. zapalono diodę, czy trzeba ją już zgasić?) 1 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
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ę »