HTX Frederikshavn & Hjørring

Det har aldrig været sjovere at være nørd

Brugerværktøjer

Webstedsværktøjer


teknologi:cond_statements

Betingede sætninger (Conditional statements)


  • „Hvis du er over 18 år gammel må du komme ind“ .. er en betinget sætning.
  • Hvis noget er sandt, sker noget hvis ikke ..sker noget andet.

Vi bruger betingede sætninger i programmering for at styre vores program 'flow' ell. programmets 'opførsel'.


if

I Arduino C/C++ (og mange andre sprog) bruges nøgleordet 'if' til at undersøge om noget er sandt eller falsk. f.eks.:

if( age > 18 ){
  //
  // do stuff that only 18 year olds are allowed to.
  //
}

Hvis udtrykket i parentesen er sandt udføres de statements som er i kroppen af if sætningen. (dvs. mellem '{' og '}' )


float temp;
 
setup(){
  temp = 0;
}
 
void loop(){
  temp = readTemperature(); // fiktiv funktion.
 
  if( temp > 21.5 ){
    // OPEN WINDOW CODE !
  }
}

Vil vi nu lukke vinduet vinduet hvis temperaturen ikke var over 21.5 grader celcius, kunne vi skrive endnu en if-sætning, som testede om temp $\leq$ 21.5 og lukke vindue hvis dette var sandt.
Eller vi kunne bruge en „if-else“ sætning.


If-else

  • „Hvis temperaturen er over 25 grader så åben vinduet, hvis ikke .. så luk vinduet.“

float temp;
 
setup(){
  temp = 0;
}
 
void loop(){
  temp = readTemperature(); // fiktiv funktion.
 
  if( temp > 21.5 ){
    // ÅBEN VINDUE PROGRAM KODE.
  } else {
    // LUK VINDUE PROGRAM KODE.
  }
}

Digital input

En digital pin aflæses med digitalRead( pinNr )

bool status;
 
void setup(){
  pinMode(4, INPUT);
}
 
void loop(){
  status = digitalRead(4);
  if ( status == HIGH ){
    // PIN 4 is HIGH (as a kite) (BUTTON IS PRESSED ... DO SOMETHING)
  }
}

Først konfigureres pin 4 til at være et INPUT. (i setup) I loop, læses pin 4's tilstand med digitalRead, dvs vi aflæser om pin 4 er sat til HIGH( 5V) eller LOW (0V).
Resultat af digitalRead gemmes i variabel 'status' , af typen bool.
Med en betinget sætning, tester vi om variabel status er HIGH, og udfører en „handling“ hvis dette er tilfældet.

I ovenstående gemmes resultat af digitalRead i variablen status. Skal man ikke senere bruge status variabel, kan man med fordel blot skrive:

if ( digitalRead(4) == HIGH ) {
  // Do something
}

Opgav 1e: LED toggle

Det (måske) simpleste digitale input vi kan registere er tryk på en knap.

I denne øvelse skal du styre en enkelt lysdiode (LED) med en trykknap. Hver gang du trykker på knappen skal du skiftevis tænde og slukke dioden. Dvs. du skal ”toggle” LED’ens status ved hvert tryk.

Udover at tænde og slukke LED, skriv da også en tekst til serial monitor der viser at LED har skiftet tilstand som vist nedenstående:

LED ON
LED OFF
LED ON
LED OFF

Breadboard setup

Materialer

  • 1 x 10K $\Omega$ resistor.
  • 1 x 330 $\Omega$ resistor.
  • 1 x Tryk-knap
  • 1 x LED Rød
  • 5 x Dupont wire. (jumper-wire)
  • Hint:
    • For at holde styr på lysdiodens tilstand, dvs. om den er tændt eller slukket, kan du gøre brug af en variabel af typen bool.
    • Du kan få brug for indlejre if-sætninger inden i hinanden, som vist nedenstående.
if ( ? ) {
  if ( ? ) {
    // do something
  }
}

Button bounce

Opfører dit 'LED toggle' program altid som du forventer?

Når en mekanisk tryk-knap presses ned, sluttes kontakten ikke 100% med det samme. Spændings potentiale vil flukturere mellem 0 og 5 volt. indtil der er „fuld-kontakt“ mellem de to metaller i kontakten.
Dette fænomen kaldes for 'button bounce', eller på dansk 'prel. Button bounce er noget, der kan ske ved alle former for mekaniske kontakter. Når man tænder og slukker for mekaniske kontakter såsom relæer og vippeomskiftere osv. -så er skiftet ikke perfekt. Der vil blive tændt og slukket mange mange inden for et par mikrosekunder.

Arduino'en kan læse fra en digital pin flere tusinde gang i sekundet, og vil derfor opfange flere af disse skift i spændingspotentiale som adskillige tryk på knappen. Dette kan forårsage at din program ikke opfører sig som du forventer.

..ye sux.
Men heldigvis kan vi råde bod på dette problem i software.
Der er flere teknikker til at modvirke button bounce. Den nemmeste og mest lavpraktiske teknik er blot at vente ca. 100ms ved det først registrerede knap tryk. (denne teknik vil vi bruge, indtil videre)

if ( digitalRead(4) == true ){
   delay(100);
   // do something..
}
  • Kan dette afhjælpe den nondeterministiske opførsel i foregående opgave? Afprøv dette i din programkode.

Ogave 2 : Død mands knap

Når du har lavet øvelsen 'dødmandsknappen' vil du opdage, at knappen ikke altid er reagerer på dit input. Dette har noget at gøre med den møde vi udmåler tid på i arduinon. En bedre måde at udmåle tid på er ved brug af funktionen millis(). Læs om funktionen millis() er rediger din dødmandsknap således at den nu anvender millis() istedet for delay().


page_tid_og_arduino

teknologi/cond_statements.txt · Sidst ændret: af admin