Nybörjare Arduino (15 / 15 steg)
Steg 15: Knappen som toogle
Ibland kommer du vara intresserad av precis när en knapp trycks ned och släpps, så du kan utlösa en händelse i din skiss. I detta fall måste du lagra currentState om knappen och jämföra det med den senast inspelade tillståndet. Om currentState är hög och lastState är låg, då vet du bara har tryckt på knappen. Ta en titt på koden nedan:Knappen Press detektion - enda meddelande
int buttonPin = 7.
booleska currentState = låg, //stroage för aktuella knappläge
booleska lastState = låg, //storage för sista knappen stat
void setup() {
pinMode (buttonPin, ingång); //this tid vi kommer att ange PIN-koden som indata
Serial.BEGIN (9600); //initialize seriell anslutning
}
void loop() {
currentState = digitalRead(buttonPin);
om (currentState == hög & & lastState == låg) {//if-knappen bara har tryckt
Serial.println("Pressed");
fördröjning (1), //crude form av knappen debouncing
} else om (currentState == låg & & lastState == hög) {
Serial.println("Released");
fördröjning (1), //crude form av knappen debouncing
}
lastState = currentState;
}
Jag använde något nytt i min om uttalande:
om (currentState == hög & & lastState == låg)Detta läser som "om currentState är hög och lastState är låg", & & tillåter oss att kontrollera sanningshalten i många saker i samma om uttalande. Du kan också använda || ("eller") att testa är en sak eller andra är sant. Läs mer här.
Du märker också följande rad visas två gånger i koden ovan:
Delay(1);
Denna försening sattes i det för att ge knappen tid sedimentera till stadig spänning innan vi börjar mäta det igen, detta kallas knappen debouncing; Det hindrar oss från att räkna en enda tryckning som två pressar på grund av knappen chattare. Använda en fördröjning att knappen debouncing är bra för detta enkla exempel, men om du mäter en massa knappar förseningar kommer att lägga upp och göra din kod att köra mycket långsamt. Detta kan hamna ger din hårdvara en eftersläpande känsla. Jag ska ta några bättre tekniker för att göra debouncing senare i denna klass.
Denna kod införs också en ny datatyp: boolean. Booleans används för att lagra 1 bit bitar av information, saker som sant/falskt, på/av, 1/0, för hög/låg. I min koden använde jag den att lagra aktuell och senaste delstaten knappen (högt eller lågt).
Här är hur vi kan använda detta för att växla en LED på och av varje gång knappen trycks:
Knappen Växla LED
int ledPin = 9;
int buttonPin = 7.
booleska currentState = låg, //stroage för aktuella knappläge
booleska lastState = låg, //storage för sista knappen stat
booleska ledState = låg, //storage för det aktuella läget för LED (av/på)
void setup() {
pinMode (buttonPin, ingång); //this tid vi kommer att ange PIN-koden som indata
pinMode (ledPin, produktionen);
Serial.BEGIN (9600); //initialize seriell anslutning
}
void loop() {
currentState = digitalRead(buttonPin);
om (currentState == hög & & lastState == låg) {//if-knappen bara har tryckt
Serial.println("Pressed");
fördröjning (1), //crude form av knappen debouncing
växla mellan statligt av LED
om (ledState == hög) {
digitalWrite (ledPin, låg);
ledState = låg;
} annat {
digitalWrite (ledPin, hög);
ledState = hög;
}
}
lastState = currentState;
}
I koden ovan jag satt upp en variabel som kallas "ledState" för att spara det aktuella läget för LED, sedan varje gång knappen trycktes, jag använde digitalWrite ska LED den motsatta och sparat en ny ledState.
Du kan använda knappen Växla koden med fader koden från exemplet RGB LED för följande går ännu längre:
Knappen Press detektion - enda meddelande
PIN-anslutningar
int rött = 9.
int grön = 10;
int blå = 11;
int buttonPin = 7.
booleska currentState = låg, //stroage för aktuella knappläge
booleska lastState = låg, //storage för sista knappen stat
int currentColor = röd; //storage för nuvarande färg
void setup() {
pinMode (buttonPin, ingång); //this tid vi kommer att ange PIN-koden som indata
pinMode (röd, produktionen);
pinMode (blå, OUTPUT);
pinMode (grön, utgång);
Serial.BEGIN (9600); //initialize seriell anslutning
digitalWrite (currentColor, hög), //initialize med currentColor på (full ljusstyrka)
}
void loop() {
currentState = digitalRead(buttonPin);
om (currentState == hög & & lastState == låg) {//if-knappen bara har tryckt
Serial.println("Pressed");
fördröjning (1), //crude form av knappen debouncing
int nextColor = getNextColor(currentColor);
fader (currentColor, nextColor);
currentColor = nextColor;
}
lastState = currentState;
}
int getNextColor(int color) {//helper funktion som ger oss nästa färg att blekna till
om (färg == red) returnera grön;
om (färg == green) returnera blå;
om (färg == blå) returnera röd;
}
{Ogiltig fader (int color1, int color2)
för (int ljusstyrka = 0; ljusstyrka < 256; ljusstyrka ++) {
analogWrite (color1, 255-ljusstyrka);
analogWrite (color2, ljusstyrka);
Delay(2);
}
}
Jag la en extra hjälpare funktion i koden ovan för att välja nästa färg att blekna till:
int getNextColor (int färg) {
om (färg == red) returnera grön;
om (färg == green) returnera blå;
om (färg == blå) returnera röd;
}
Jag förklarade funktionen med en int att berätta Arduino att det bör förvänta sig funktionen returnerar ett tal (i detta fall antalet Arduino stift som har anslutits till en av RGB LED stift. De uttalanden ser lite annorlunda att vad vi har sett förut, jag kunde ha skrivit funktion så här:
int getNextColor (int färg) {
om (färg == red) {
returnera grönt;
}
om (färg == green) {
returnera blå;
}
om (färg == blå) {
returnera röda;
}
}
.. .och det skulle fungera på exakt samma sätt. Om du bara behöver köra en rad i en if-sats, kan du använda stenografi:
om (något) EnMetod;
utan klammerparenteser eller linebreaks.
Fortsätta att del 2 i denna serie här, eller lära dig att ansluta MIDI till Arduinos in- och utgångar.