Skocz do zawartości

Arduino i drgania styków.


SOYER

Pomocna odpowiedź

Witam, przenoszę tu temat o którym zająknąłem się w komentarzach do kursu FPGA.

Poniżej wklejam ostatni mój post z tamtego tematu i proszę fachowców o wypowiedzenie się o poprawności lub nie, poniższego sketchu, sugestie co do poprawek lub całkowitej zmiany i odpowiedź na poniższe pytania:

Sketch:

#define PinP 10
#define led 13
boolean wcisnieto=false;
boolean przycisk=false;
boolean stanled=false;
int i;

void setup() {
 pinMode(led, OUTPUT);
 pinMode(PinP, INPUT_PULLUP);

}

void loop() {
 // put your main code here, to run repeatedly:
deb();
}

void deb(){

 if(digitalRead(PinP) == LOW){
  while(i>0){
   for(i=2000; i=0; i--){}
  }
 }
  if(digitalRead(PinP) == LOW){
   wcisnieto=true;
  }
  if((wcisnieto==true) && (digitalRead(PinP)== HIGH)){
   while(i>0){
   for(i=2000; i=0; i--){}
   }
  }
if((wcisnieto==true) && (digitalRead(PinP)== HIGH)){
 wcisnieto=false;
 przycisk=true;
}
if(przycisk==true){
 digitalWrite(led, stanled);
 stanled = !stanled;
 przycisk=false;
}
}

Czy teraz drgania są eliminowane?

Niestety nie wiem ile powinno wynosić "i" w pętli for dla powiedzmy 80ms. 2000 wpisałem tak sobie, żeby coś było. Jak to policzyć?

Pozdrawiam 😃

EDIT

Niestety w tej chwili nie mam dostępu do arduino więc kombinuję teoretycznie, może ta wersja jest lepsza? Pozmieniałem trochę nawiasy:

#define PinP 10 
#define led 13 
boolean wcisnieto=false; 
boolean przycisk=false; 
boolean stanled=false; 
int i; 

void setup() { 
 pinMode(led, OUTPUT); 
 pinMode(PinP, INPUT_PULLUP); 

} 

void loop() { 
 // put your main code here, to run repeatedly: 
deb(); 
} 

void deb(){ 

if(digitalRead(PinP) == LOW){ 
 while(i>0){ 
  for(i=2000; i=0; i--){} 
 }  
  if(digitalRead(PinP) == LOW){ 
 wcisnieto=true; 
  } 
}
if((wcisnieto==true) && (digitalRead(PinP)== HIGH)){ 
 while(i>0){ 
  for(i=2000; i=0; i--){} 
 } 
 if((wcisnieto==true) && (digitalRead(PinP)== HIGH)){ 
 wcisnieto=false; 
 przycisk=true; 
 } 
}
if(przycisk==true){ 
 digitalWrite(led, stanled); 
 stanled = !stanled; 
 przycisk=false; 
} 
}
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

Pisałem Ci kiedyś że do nauki programowania lepiej używać platform, które dostarczają debugger. Wtedy moża "zobaczyć" jak działa program linijka-po-linijce i łatwiej zrozumieć co się dzieje. Wiec po pierwsze - i jest zmienną globalną, więc jej wartość początkowa to zero.

Więc warunek while jest od początku fałszywy i cała jej zawartość nie wykonuje się ani razu. Ale nawet gdyby, to for też jest źle napisane...

Link do komentarza
Share on other sites

Napisz do Trekera, że do nauki programowania nie nadaje się Arduino 😉, wiem o tym, że debugger znacznie by mi ułatwił życie jak bym sam widział co się dzieje w programie... 😤, ale uczę się na FORBOCIE programowania arduino, więc jak się nie ma co się lubi....

#define PinP 10 
#define led 13 
boolean wcisnieto=false; 
boolean przycisk=false; 
boolean stanled=false; 
int i = 2000; 

a teraz?

Dlaczego for jest źle napisane?

Link do komentarza
Share on other sites

Po pierwsze wytlumacz mi po co dwie pętle? Masz zagnieżdżoną pętlę for wewnątrz pętli while.

W petli for masz przypisanie = zamiast porównania ==, ale to i tak byłoby źle... to jest po prostu wszystko źle

Link do komentarza
Share on other sites

if(digitalRead(PinP) == LOW){ 
  for(i=2000; i==0; i--){} 
 }  
  if(digitalRead(PinP) == LOW){ 
 wcisnieto=true; 
  } 
} 

tak wystarczy?

nie wiem czemu zafiksowałem się że do czekania użyć while, pamiątka z kursu.... 😋

Link do komentarza
Share on other sites

#define PinP 10 
#define led 13 
boolean wcisnieto=false; 
boolean przycisk=false; 
boolean stanled=false; 
int i = 2000; 

void setup() { 
 pinMode(led, OUTPUT); 
 pinMode(PinP, INPUT_PULLUP); 

} 

void loop() { 
 // put your main code here, to run repeatedly: 
deb(); 
} 

void deb(){ 

if(digitalRead(PinP) == LOW){  
  for(i=2000; i>0; i--){}   
  if(digitalRead(PinP) == LOW){ 
 wcisnieto=true; 
  } 
}
if((wcisnieto==true) && (digitalRead(PinP)== HIGH)){ 
  for(i=2000; i>0; i--){}  
 if((wcisnieto==true) && (digitalRead(PinP)== HIGH)){ 
 wcisnieto=false; 
 przycisk=true; 
 } 
}
if(przycisk==true){ 
 digitalWrite(led, stanled); 
 stanled = !stanled; 
 przycisk=false; 
} 
}

Przypomniałem sobie czemu użyłem wtedy while...

moim zdaniem bez while program ciągle będzie sprawdzał (w ciągu tych 2000), stan przycisku w czasie domniemanych drgań, jeśli uda mu się wstrzelić akurat w HIGH, kiedy sprawdza LOW, to nie będzie już dalej liczył w dół... i wszystko się posypie

mylę się...?...

Co do for, mój błąd 😳 , pętla wykonuje się tak długo jak długo jest spełniony warunek czyli teraz powinno być dobrze w sketchu(i>0)....

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.