Wpis z mikrobloga

po wykryciu sygnalu na wejsciu (przycisk) (...) jest w ogole jakas szansa aby mozna bylo tym sposobem zapalac/gasic diode POZA pętlą?

@rosso_corsa: Jasne, szukaj w google: button interupt, ISR. Od razu obczaj też: debounce

zmieni wyjscie innego pinu na odwrotny czy trzeba przez zmienna?

Bez zmiennej to pewnie takie coś: digitalWrite(NUMERPINU, !digitalRead(NUMERPINU))
  • Odpowiedz
@rosso_corsa: No tak, ISR będzie wywoływany w momencie wykrycia opadającego zbocza(przy założeniu że wejście jest podciągnięte i switch zwiera do masy). W środku ISR zmienisz wartość innego pinu i już ta wartość zostanie. Po następnym wciśnięciu znowu na wejściu pojawi się opadające zbocze więc znowu zostanie wywołane ISR. Przy czym będziesz musiał zapobiec wywołaniu się ISR kilka razy w trakcie jednego przyciśnięcia(np ustawić limit, że stan nie może się zmienić częściej
  • Odpowiedz
@rosso_corsa: Łatwiej nam się będzie dogadać jak jednak wpiszesz w google to co zasugerowałem w pierwszym komentarzu (button interupt arduino) i wejdziesz w pierwszy wynik ( ͡° ʖ̯ ͡°) Na tym polega ISR że tego się nie wykonuje w pętli.
  • Odpowiedz
@rosso_corsa: Tak #!$%@?ąc od Twojego zasadniczego problemu, funkcja delay to zło. Należy jej używać tylko w ostateczności. Nie, że jest źle napisana, ale powoduje, że Twój program nie reaguje na nic (prócz przerwań) przez znaczącą chwilę (u Ciebie klika sekund, a to wieczność w świecie mikrokontrolerów). Napisz program bez delay, a wtedy problem odczytania pinu i zmiany stanu innego pozostanie tak banalny jak był zawsze.
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@S0Cool: no właśnie. Tylko jak bez delay jakoś robić licznik iteracji? Bo np jak mój czujnik raz na 2sek może dane wysłać to bym musiał iterowac do 32mln ?
  • Odpowiedz
@rosso_corsa: zrób sobie zmienną globalną o nazwie sekundy, a w loopie:
if (millis()/1000 > sekundy){
sekundy++;
if (sekundy % 2 == 0) { czytajCzujnik(); }
}

i masz odpalaną funkcję czytajCzujnik() co dwie sekundy.
  • Odpowiedz
tak milisekundy dzielisz przez 1000 i masz czas od uruchomienia w sekundach. Jedyny minus tego prostego rozwiązania, to fakt, że po ~49 dniach licznik millis() się przekręci i wystartuje od 0 :D

Jeżeli ten mikrokontroler ma chodzić dłużej to trzeba zastosować inne rozwiązanie, np.:

globalna
unsigned long previousMillis;
unsigned long currentMillis;

currentMillis = millis();

if ( (currentMillis - previousMillis) >= 1000 ){
previousMillis = previousMillis + 1000;
seconds = seconds +1;
if
  • Odpowiedz