Skocz do zawartości

Problem z wgraniem programu- układ dioda-przycisk z kursu arduino 1


LieutenantDan

Pomocna odpowiedź

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

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 🙂 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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

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ć?)

 

  • Lubię! 1
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

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.