Skocz do zawartości

Arduino i drgania styków.


Pomocna odpowiedź

Napisano

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; 
} 
}

Jesteś pewien? Po pierwsze po co dwie pętle? Po drugie - to czekanie nie zależy od liczby 2000 bo zamiast porównania z zerem masz przypisanie

Nie rozumiem....,
według mnie:

pierwsza pętla czeka po naciśnięciu przycisku, druga po jego puszczeniu, pętla for dekrementuje się od 2000 do 0, a while czeka tak długo jak i>0...

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

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?

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

Ma być tak?:

 while(i>0){ 
  for(i=2000; i==0; i--){} 
}

W sumie to logiczne, przypisujemy 2000, i porównujemy kiedy będzie 0... ok

zdaje się, że znowu masz rację 😅 ,

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.... 😋

Trochę lepiej, ale chyba nawiasy domykające się popsuły.

No i przeczytaj jeszzce raz na spokojnie jak działa pętla for, bo na razie nie działa.

#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)....

tzn. że pętla for działa jak while?, no niby pętla... wiem... ale...

tzn. że for to taki while(z argumentami skąd, dokąd[jak długo] i o ile)... tak?

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