06. Styr lysdiod med knapp

Detta projekt visar grunderna i hur man får sin Arduino att reagera på yttre händelser. I detta fall använder vi oss av en tryckknapp för att växla en lysdiod mellan tänd och släckt. Kopplingen liknar den för projektet där vi blinkade med en lysdiod, men vi har här även en tryckknapp.

Kopplingen

Precis som när vi bara blinkade med lysdioden så behöver vi koppla in lysdioden på rätt håll, dvs det långa benet kopplas till motståndet och det korta till minus (GND).

Vid uppstart

Vi börjar programmet med att ställa in in- och utgången. Ingången sätts till ”INPUT_PULLUP” vilket innebär att man aktiverar det så kallade pull-up-motståndet för just den ingången. Detta är helt enkelt ett motstånd på några kiloohm kopplat mellan ingången och plus (Vcc) vilket garanterat att ingången alltid är hög (logisk etta). Arduinons ingångar är oerhört känsliga och om inget är inkopplat på dem kommer de att fånga upp störningar från lampor, radiosändare och annat och ingången kommer att växla mellan hög och låg av sig självt. Pull-up-motståndet hindrar detta genom att tvinga ingången till att alltid vara etta om inget annat är inkopplat. I vår koppling så är ingången kopplad till en tryckknapp, men när knappen inte är intryckt så finns det ingen spänning på ingången och utan pull-up-motståndet skulle alltså ingången fånga upp  störningar. När knappen väl trycks in kommer ingången dras ner till minus och bli låg. Detta skulle man kunna tycka skulle innebära en kortslutning eftersom ingången ju är tvingad upp till plus, men eftersom det görs med ett ganska stort motstånd så kommer väldigt lite ström att gå igenom motståndet och kretsen kommer inte att bli skadad.

Huvudprogrammet

Resten av programmet består av Arduinos vanliga loop()-funktion som kör sin kod om och om igen så snabbt det går. Loopen läser in tryckknappens tillstånd och om knappen trycks ner kommer ingången att bli låg. Att ingången blir låg kan kanske verka lite omvänt men det är en konsekvens av pull-up-motståndet som alltid tvingar upp ingången till plus (hög) och att tryckknappen därför behöver kopplas till minus. Om ingången är låg så kontrollerar koden om variabeln lysdiodstatus är hög eller låg. lysdiodstatus ändras därefter till motsatt värde och utgången för lysdioden sätts antingen till hög eller låg. Det sista som händer är att koden väntar 250ms innan den fortsätter. Denna korta fördröjning krävs eftersom mikrokontrollern är otroligt snabb och kommer hinna köra koden i loop() tusentals gånger i sekunden och om knappen trycks ner så kommer lysdioden växla läga mellan tänd och släckt så snabbt att det är omöjligt att se. Fördröjningen skyddar oss även mot ett annat fenomen som är en vanlig fälla för nybörjare: kontaktstuds. När en tryckknapp trycks ner, eller en strömbrytare slås till så sker detta inte snyggt och prydligt utan kontaktelementen kommer att studsa mot varandra lite. För mänskliga ögat sker detta så snabbt att vi inte märker det, men för en mikrokontroller som kan läsa av knappen många tusen gånger i sekunden så kommer det se ut som att man trycker ner och släpper knappen många gånger väldigt snabbt. Detta går att lösa med elektronik, men om man använder en mikrokontroller brukar man istället göra det med kod eftersom det är billigare. Det finns många sätt att lösa det på och en fördröjning som i vårt exempel är ett av de enklaste.

Koden

// Reservera minne för variabler att lagra data i
int lysdiodstatus = LOW;
int knappstatus;

void setup() {
  // Ställ om pinne 2 till till att vara en utgång.
  pinMode(2, OUTPUT);
  // Ställ om pinne 3 till att vara en ingång med pull-up motstånd
  pinMode(3, INPUT_PULLUP);
}

void loop() {
  // Läs in tryckknappens tillstånd.
  knappstatus = digitalRead(3);
  // När knappen trycks ner blir ingången låg (LOW)
  if (knappstatus == LOW) {
    // Om lysdiodens status är låg så sätter vi den till hög, annars tvärtom
    if (lysdiodstatus == LOW) {
      lysdiodstatus = HIGH;
    }
    else {
      lysdiodstatus = HIGH;
    }
    // Sätt lysdiodens utgång till aktuell status
    digitalWrite(2, lysdiodstatus); 
    // Vänta 250ms innan vi fortsätter så att användaren hinner släppa knappen
    delay(250);
  }
}

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *