Sensorer er innretninger som kan gi Arduino signal om en tilstand i den fysiske verden. For eksempel en temperatursensor. Vi har allerede snakket om noen typer sensorer: brytere og potmetere. Vi , men vi skal også si litt mer om brytere her. Vi kan dele sensorer inn i to hovedgrupper:
...
En digital sensor gir et signal om at noe enten er av eller på, som for eksempel en trykkbryter. Det kan være brytere som en bruker trykker på, eller brytere som blir aktivert av en mekanisk bevegelse. Det kan også være brytere som aktiveres av andre ting som for eksempel en termostat som slås på ved en viss temperatur, eller reed-bryter som reagerer på magnetisme.
Vi har i biblioteket et basiseksempel for lesning av analoge verdier, og et basiseksempel for lesning av digitale verdier.
Analoge sensorer, som for eksempel et potmeter, gir et variabelt signal. Analoge sensorer måler kontinuerlige verdier, og gir Arduino et signal som varierer mellom 0V og 5V. Det finnes også avanserte analoge sensorer som kommuniserer med Arduino digitalt, men det kommer vi tilbake til senere. Noen analoge sensorer er ferdig tilpasset Arduino, dvs at de gir 0-5V ut av boksen. Andre sensorer krever at de kobles opp i en krets for å kunne gi riktig signal. Når vi bruker analoge sensorer må vi ofte regne om verdiene som leses av til den størrelsen vi ønsker. For eksempel kan vi ha en temperaturmåler som opererer i området -100°C til +100°C og gir et signal som varierer mellom 0V og 5V. Siden det vi leser av i programmet er en spenning, må vi regne om til temperatur på denne måten:
Code Block | ||||
---|---|---|---|---|
| ||||
intfloat reading, voltage, temp; void setup(){ } void loop(){ reading=analogRead(0A0); // Leser av spenningen på A0 voltage=reading/204.6; // Regner om avlesning til spenning temp=( voltage * 40 ) - 100; // Tallet 40 er 200/5 som tilsvarer antall grader per volt } // Vi må trekke fra 100 siden 0V tilsvarer -100°C |
GitHub: Examples/GeneralSensors/NaiveCalculation/NaiveCalculation.ino Denne koden går ut over det vi har lagt til i biblioteket vårt.
Dette kan gjøres mye enklere med funksjonen map som gjør omregningen for oss:
Code Block | ||||
---|---|---|---|---|
| ||||
int reading, temp; void setup(){ } void loop(){ reading = analogRead(0A0); temp = map( reading, 0, 1023, -100, 100); } |
GitHub: Examples/GeneralSensors/MapCalculation/MapCalculation.ino Denne koden går ut over det vi har lagt til i biblioteket vårt.
Trykknapper
Noen av de enkleste digitale sensorene er trykknapper. De trykknappene du har fått utdelt har to bein koblet sammen. Under er en oppkoblet krets med trykknapp.
Her er både kretsskjema og breadboard view. Legg merke til at knappen har fire bein, hvor to og to er koblet sammen. De føttene som er "på samme side" er de som brytes. Motstanden gjør at du ikke kortslutter Arduinoen når du trykker på knappen, og at pinne 6 faktisk kan lese av en definert verdi når knappen ikke er trykket inn. En ekstra sikkerhet hadde vært å koble inn en ekstra motstand på 220 ohm mellom 5 volt ut og knappen. Dette hadde forsikret at hvis du trykker på knappen, og Arduinoen har definert pinne 6 som utgang med verdi lav, hadde det ikke oppstått kortslutning.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
// Hvor vi har koblet til knappen.
const int buttonPin = 6;
// Husker den forrige verdien for å forhindre veldig mye utskrift
int oldVal = 0;
void setup() {
Serial.begin(9600);
// Definer knappen som en inngang
pinMode(buttonPin, INPUT);
}
void loop () {
// Les av den nåværende verdien
int val;
val = digitalRead(buttonPin);
// Hvis verdien har endra seg
if (val != oldVal) {
// Oppdater gammel verdi
oldVal = val;
// Sjekk den nåværende verdien
if (val == HIGH) {
// Hvis knappen er trykket, fortell om dette
Serial.println("Trykket paa knappen");
} else if (val == LOW) {
// Hvis knappen er sluppet, fortell om dette
Serial.println("Slapp knappen");
} else {
// Hvis en ukjent verdi leses, fortell om dette. DETTE SKAL ALDRI SKJE, skjer det er det nok noe feil med Arduinoen din.
Serial.println("Ukjent verdi lest");
}
}
// Vent litt for å ha sensor stabilitet
delay(1);
} |
et bilde som viser en slik knapp fra undersiden. Hvilke bein som er koblet sammen er tegnet inn.
Bilde av knapp sett nedenfra med inntegnet kretsskjema.
I biblioteket vårt har vi lagt til en del eksempler som viser bruk av knapper. Vi har også lagt til bibliotek som forhindrer prell (engelsk: bounce).
- PLabExamples/examples/02.Button/ButtonPullup - lyser LED når en knapp er trykket inne.
- PLabExamples/examples/02.Button/ButtonTwoBlinks - blinker en LED to ganger når en knapp trykkes på.
- PLabExamples/examples/02.Button/PressedEvent - sender en beskjed til konsoll når en knapp trykkes på.
- PLabExamples/examples/02.Button/PushButtonToggle_v2 - bruker bibliotek for å fjerne prell.
- PLabExamples/examples/02.Button/PushButtonTwoToggles_v2 - bruker bibliotek for å fjerne prell på to knapper.
- PLabExamples/examples/02.Button/ToggleNoDebounce - toggler en LED uten å fjerne prell.
Oppkobling for eksemplene
ButtonPullup, ButtonTwoBlinks, ToggleNoDebounce:
PressedEvent:
PushButtonToggle_v2:
PushButtonTwoToggles_v2:
Når du kobler opp og prøver dette eksempelet, kan det skje når du trykker på knappen at du får flere linjer utskrift. Dette er et kjent fenomen, og kan ganske enkelt forhindres. Det er en tutorial på Arduino sine hjemmesider som omhandler nettopp dette.