Når vi skal lese, eller sjekke det digitale nivået på en pinne må vi også bruke pinMode for å forsikre oss om at den aktuelle pinnen er satt opp som inngang.
I Atmel mikrokontrollere er alle pinner satt opp som innganger i utgangspunktet, så vi kan få en krets til å fungere selv om vi glemmer å bruke pinMode. Det er uansett viktig å ta det med, om ikke annet for at programmet skal bli lettere å forstå.
Her har vi to forskjellige muligheter, som vi kommer tilbake til under: INPUT eller INPUT_PULLUP
Eksempel:
pinMode(2, INPUT); //Setter digital pinne 2 som inngang
pinMode(3, INPUT_PULLUP); //Setter digital pinne 3 som inngang, og aktiverer intern pullup-motstand
Funksjonen vi bruke til å lese en digital verdi er digitalRead():
int nivaa;
nivaa=digitalRead(2); //Lagrer verdien lest fra pinne 2 i variabelen nivaa
Koden over lager en variabel med navn nivaa, leser verdien på pinne 2 og lagrer resultatet i variabelen. Vi kan også bruke digitalRead direkte i en logisk test f.eks. på denne måten:
if(digitalRead(2)==1){
//Utfør noe kode her...
}
Som nevnt tidligere, har vi to muligheter når vi definerer en pinne som inngang: INPUT og INPUT_PULLUP.
INPUT_PULLUP aktiverer en motstand internt i mikrokontrolleren, koblet fra pinnen og til Vcc, som "tvinger" nivået på pinnen høyt.
Hvis pinnen skal brukes til å sjekke om en knapp er trykt inn, kan vi gjerne bruke den siste muligheten. På skjemaet under vises hvordan koblingen kan gjøres, på tre forskjellige måter. Koblingen til venstre viser knappen koblet aktiv høy, i midten samme kobling aktiv lav og den siste aktiv lav med INPUT_PULLUP.
IO2, IO3 og IO4 refererer til de digitale pinnene 2, 3 og 4 på Arduino Uno. Her har vi brukt pullup-motstander på 10 kohm, men når vi kobler i praksis kan de gjerne være større. Jo større motstand vi bruker, jo mindre strøm bruker kretsen. Helt opp i 50 kohm går som oftest fint. (Hvis motstanden blir for stor, vil ikke kretsen greie å holde signalet stabilt høyt eller lavt). Knappen koblet til IO4 bruker den innebygde Pullup-motstanden, og er dermed den enkleste koblingen, men her må vi huske å sette den aktuelle pinnen til INPUT_PULLUP for å få det til å fungere. Eksempel-kode for de 3 knappe-koblingene: Venstre: if(digitalRead(2)==1){ // Evt: if (digitalRead(2)){ Midten: if(digitalRead(2)==0){ // Evt: if (!digitalRead(2)){ Høyre: if(digitalRead(3)==0){ // Evt: if (!digitalRead(3)){ |
Komplett kode for denne oppkoblingen:
void setup() {
pinMode(2, INPUT); //Inngang til knapp1, Aktiv HØY
pinMode(3, INPUT); //Inngang til knapp2, Aktiv LAV, med Pullup-motstand
pinMode(4, INPUT_PULLUP); //Inngang til knapp3, Akriv LAV, med intern Pullup-motstand
pinMode(8, OUTPUT); //Utgang til Grønn LED
pinMode(9, OUTPUT); //Utgang til Gul LED
pinMode(10, OUTPUT); //Utgang til Rød LED
}
void loop() {
if(digitalRead(2)==1){ //Knapp1 er aktiv HØY, dvs. den er 1 når vi trykker inn knappen
digitalWrite(8, HIGH);
} else {
digitalWrite(8, LOW);
}
if(digitalRead(3)==0){ //Knapp2 er aktiv LAV, dvs. den er 0 når vi trykker inn knappen
digitalWrite(9, HIGH);
} else {
digitalWrite(9, LOW);
}
if(digitalRead(4)==0){ //Knapp3 er aktiv LAV, dvs. den er 0 når vi trykker inn knappen
digitalWrite(10, HIGH);
} else {
digitalWrite(10, LOW);
}
}
- Detaljer
- Skrevet av: Per Sigbjørn
- Kategori: Lese digitale verdier
- Treff: 2910