If- och switch-satser

If- och switch-satser

I detta kapitel ska vi undersöka hur if, else och switch kan användas för att låta olika saker hända i ett program.

If-sats

If-satsen används frekvent i Arduino-sketcher. Den låter programmeraren bestämma vad som ska ske om ett visst villkor är uppfyllt. Villkoret är oftast att en variabel jämförs med ett förutbestämt värde, en konstant eller en annan variabel. 

Här följer exempel på vad som ofta jämförs med if-satser:

  • om en int-variabel överstiger/understiger ett visst värde
  • om en boolean-variabel är sann eller falsk
  • om en char-variabel är ett specifikt tecken.

Jämförelseoperatorer

För att utföra jämförelserna används förutbestämda tecken (jämförelseoperatorer). Om variabeln x ska jämföras med variabeln y kan följande operatorer användas.

KodInnebörd
x==y x är lika med y
x!=y x är inte lika med y
x<y x är mindre än y
x<=y x är mindre än eller lika med y
x>y x är större än y
x>=y x är större än eller lika med y

Lägg märke till att dubbelt likhetstecken används för att jämföra om x är lika med y. Ett enkelt likhetstecken används i APL för att tilldela variabler värden. Om ett enkelt likhetstecken används i en if-sats kommer inte x att jämföras med y utan tilldelas värdet på y.

I följande exempel vill vi undersöka om vi har flest äpplen eller bananer. Vi skapar därför en ny sketch (QuantityFruit) och deklarerar två nya int-konstanter: quantityApples och quantityBananas. Vi initierar dem också genom att tilldela dem valfria värden. 

Del 1/3 av QuantityFruit.ino

I setup-funktionen startar vi en seriell kommunikation för att få svar från vår Arduino.

Del 2/3 av QuantityFruit.ino

I loop-funktionen vill vi jämföra mängden äpplen och bananer. Sedan ska Arduinon skriva ut vilken frukt vi har flest av i Serial monitor. För detta skriver vi tre if-satser eftersom det finns tre tänkbara scenarion:

void loop() {
  
  // Compare amounts of apples and bananas and print info
  if(quantityApples > quantityBananas) {
    Serial.println("We've got more apples than bananas.");
  }
if(quantityApples < quantityBananas) {    Serial.println("We’ve got less apples than bananas."); }
if( quantityApples == quantityBananas) {    Serial.println("We've got the same amount of apples and bananas.");  }  delay(1000); }

Del 3/3 av QuantityFruit.ino

Else-if-sats

Koden som är uppdelad i tre if-satser fungerar, men det finns ett mer elegant sätt att skriva den. "Else-if" gör det möjligt att låta olika saker hända beroende på vilket villkor som är sant.

För att snygga upp koden skriver vi om den på följande sätt.

// Declare global constants for quantities
const int quantityApples = 1337;
const int quantityBananas = 42;

void setup() {
  
  // Open serial connection at 9600 Bd.
  Serial.begin(9600);
}

void loop() {
  
  // Compare amounts of apples and bananas and print info
  if(quantityApples > quantityBananas) {
    Serial.println("We've got more apples than bananas.");
  }
  else if(quantityApples < quantityBananas) {
    Serial.println("We’ve got less apples than bananas.");
  }
  else {
    Serial.println("We've got the same amount of apples and bananas.");
  }

  delay(1000);
}

KOD QuantityFruit2.ino

Programmet undersöker först om vi har fler äpplen än bananer. Om vi har det kommer programmet att skriva ut den tillhörande texten och sedan lämna if-satsen. Om vi där­emot inte har fler äpplen än bananer hoppar programmet över den första texten och undersöker i stället om vi har färre äpplen än bananer. Om vi har det kommer programmet att skriva ut den tillhörande texten och sedan lämna if-satsen. 

Om vi varken har fler äpplen eller fler bananer kommer programmet att köra instruktionerna som hör ihop med else

Lägg märke till att vi inte behöver ha med villkoret quantityApples == quantityBananas på slutet. Om programmet kommer hela vägen dit har inget av de andra villkoren uppfyllts. Det enda tänkbara är då att vi har lika många äpplen och bananer.

Logiska operatorer

Ibland räcker det inte med att ett villkor uppfylls för att något ska ske (och ibland är det tvärtom tillräckligt om ett av flera villkor uppfylls för att något ska ske). Då kan logiska operatorer användas för att kombinera två eller flera villkor. För det används följande symboler.

KodInnebörd
&& och
|| eller
! inte

Tips! De två vertikalstrecken skrivs på Windows-tangentbord genom att hålla ned alt-gr och trycka på tangenten bredvid Z. I Mac OS skrivs de två vertikalstrecken genom att hålla ned alt och trycka på 7. 

I följande exempel vill vi veta vilken frukt du föredrar. Vi skapar därför en ny sketch och två konstanter av boolean-typ som vi kallar likeApples respektive likeBananas. Sätt värdena till true eller false beroende på huruvida du gillar frukterna. 

Del 1/3 av FavouriteFruit.ino

I setup-funktionen startar vi en seriell kommunikation för att få svar från vår Arduino.

Del 2/3 av FavouriteFruit.ino

I loop-funktionen skriver vi följande if-satser för att veta vilken frukt vi bör servera.

Del 3/3 av FavouriteFruit.ino

Nästlad if-sats

Ibland finns det anledning att ha if-satser inuti andra if-satser. Det kallas att nästla if-satser. I det föregående exemplet föreslogs fruktsallad till den som tycker om både äpplen och bananer. Vissa fruktsalladsälskare tycker om att ha russin i sin sallad medan andra inte föredrar det. För att garanterat föreslå rätt fruktsallad lägger vi till ytterligare en konstant boolean (likeRasins) längst upp i sketchen. 

Sedan nästlar vi in en if-sats i den befintliga if-satsen, så att den färdiga sketchen ser ut på följande vis.

Switch-sats

Med många olika alternativ blir det snabbt svåröverskådligt att använda if- och else-if-satser. Ibland är det mer praktiskt att använda en switch-sats. En switch-sats utgår från en variabel och kan utföra olika instruktioner beroende på vilket värde variabeln har. 

I följande exempel vill vi demonstrera användning av switch-satsen och skapa en sketch som slumpar ut vilken frukt vi bör äta. Vi börjar därför med att skapa en ny sketch (PickAFruit) och starta en seriell kommunikation i setup-funktionen. 

Del 1/4 av PickAFruit.ino

I loop-funktionen deklarerar vi en byte-variabel vid namn value. Sedan anropar vi funktionen random för att få ett pseudoslumpvist utvalt nummer mellan 0 och 9. Pseudoslumpvist innebär att värdet inte är slumpvist valt på riktigt (det är uträknat), men för detta exempel är värdet tillräckligt slumpvist valt.

Del 2/4 av PickAFruit.ino

I loop-funktionen skapar vi också en sträng (pickedFruit) som vi lagrar fruktnamnet i inför att det ska skrivas ut.

Del 3/4 av PickAFruit.ino

Avslutningsvis skapar vi vår switch-sats. Den kommer att lagra olika fruktnamn i picked­Fruit beroende på vilket värde som slumpats till value. Om värdet är 0 blir det en banan, om värdet är 1 blir det en klementin och så vidare. Lägg märke till att switch-satsen avslutas med default. Default är det som händer om värdet inte är något av de uttryckligen valda. Eftersom 5-9 inte är uttryckligen valda kommer slumpen hamna på default i 50 % av fallen. Tur att ananas är gott.

Del 4/4 av PickAFruit.ino

Senast ändrad: 2017-01-23