Stap 15: Knop als tuimelschakelaar
Soms zult u geïnteresseerd in het exacte moment een knop wordt ingedrukt of losgelaten, zodat u kunt een gebeurtenis in uw tekening. In dit geval moet u de currentStatus van de knop Opslaan en vergelijk het met de laatste opgenomen staat. Als de currentStatus hoog is en de lastState laag, is dan weet je dat gewoon de knop is ingedrukt. Neem een kijkje op de onderstaande code://Button Press Detection - single message int buttonPin = 7; boolean currentState = LOW;//stroage for current button state boolean lastState = LOW;//storage for last button state void setup(){ pinMode(buttonPin, INPUT);//this time we will set the pin as INPUT Serial.begin(9600);//initialize Serial connection } void loop(){ currentState = digitalRead(buttonPin); if (currentState == HIGH && lastState == LOW){//if button has just been pressed Serial.println("pressed"); delay(1);//crude form of button debouncing } else if(currentState == LOW && lastState == HIGH){ Serial.println("released"); delay(1);//crude form of button debouncing } lastState = currentState; }
Ik gebruikte iets nieuws in mijn als verklaring:
Als (currentStatus == HIGH & & lastState == laag)
dit leest als "als currentStatus is lastState hoog en laag," & & laat ons toe om het controleren van de waarheid voor veel dingen in de dezelfde als verklaring. U kunt ook || ("of") om te testen is-een ding of anderzijds geldt. Lees meer hier.
Ook ziet u dat de volgende regel verschijnt twee keer in de bovenstaande code:
delay(1);
Deze vertraging was zetten daar tijd te geven de knoop te regelen met stabiele spanning voordat we beginnen met het meten van het weer, dat dit heet knop debouncing; het verhindert ons één enkele pers tellen als twee persen toe te schrijven aan de knop chatter. Met behulp van een vertraging te knop debouncing is prima voor dit eenvoudige voorbeeld, maar als u een heleboel knoppen werden meten de vertragingen zal optellen en uw code uitvoeren zeer traag maken. Dit kan uiteindelijk uw hardware een achterblijvende gevoel geeft. Ik zal het adres van sommige betere technieken hiervoor debouncing verderop in deze klasse.
Deze code ook introduceert een nieuw gegevenstype: Boole. Booleans zijn gebruikt voor het opslaan van 1 bit stukjes informatie, dingen zoals waar/onwaar, aan/uit, 1/0, van HIGH/LOW. Ik gebruikte het in mijn code voor het opslaan van de huidige en status van de knop laatste (hoog of laag).
Hier is hoe we dit kunnen gebruiken om te schakelen van een LED op en uit telkens wanneer de knop wordt ingedrukt:
//Button Toggle LED int ledPin = 9; int buttonPin = 7; boolean currentState = LOW;//stroage for current button state boolean lastState = LOW;//storage for last button state boolean ledState = LOW;//storage for the current state of the LED (off/on) void setup(){ pinMode(buttonPin, INPUT);//this time we will set the pin as INPUT pinMode(ledPin, OUTPUT); Serial.begin(9600);//initialize Serial connection } void loop(){ currentState = digitalRead(buttonPin); if (currentState == HIGH && lastState == LOW){//if button has just been pressed Serial.println("pressed"); delay(1);//crude form of button debouncing //toggle the state of the LED if (ledState == HIGH){ digitalWrite(ledPin, LOW); ledState = LOW; } else { digitalWrite(ledPin, HIGH); ledState = HIGH; } } lastState = currentState; }
In de bovenstaande code mij troep opwaarts een variabele met de naam "ledState" voor het opslaan van de huidige stand van de LED, dan elke keer die de knop werd ingedrukt, die ik gebruikte digitalWrite in te stellen van de LED op de tegenovergestelde staat en een nieuwe ledState opgeslagen.
Nog verder te gaan, kunt u de knopcode knevel met de fader-code van de RGB LED-voorbeeld voor het volgende:
//Button Press Detection - single message //pin connections int red = 9; int green = 10; int blue = 11; int buttonPin = 7; boolean currentState = LOW;//stroage for current button state boolean lastState = LOW;//storage for last button state int currentColor = red;//storage for current color void setup(){ pinMode(buttonPin, INPUT);//this time we will set the pin as INPUT pinMode(red, OUTPUT); pinMode(blue, OUTPUT); pinMode(green, OUTPUT); Serial.begin(9600);//initialize Serial connection digitalWrite(currentColor, HIGH);//initialize with currentColor on (full brightness) } void loop(){ currentState = digitalRead(buttonPin); if (currentState == HIGH && lastState == LOW){//if button has just been pressed Serial.println("pressed"); delay(1);//crude form of button debouncing int nextColor = getNextColor(currentColor); fader(currentColor, nextColor); currentColor = nextColor; } lastState = currentState; } int getNextColor(int color){//helper function that gives us the next color to fade to if (color == red) return green; if (color == green) return blue; if (color == blue) return red; } void fader(int color1, int color2){ for (int brightness=0;brightness<256;brightness++){ analogWrite(color1, 255-brightness); analogWrite(color2, brightness); delay(2); } }
Ik heb toegevoegd een extra Help-functie in de code hierboven om te helpen de volgende kleur te vervagen te kiezen:
int getNextColor (int kleur) {}
Als (kleur rood ==) terugkeer van groen;
Als (kleur groen ==) terugkeer blauw;
Als (kleur blauw ==) terugkeer rood;
}
Ik heb verklaard dat de functie met een int Arduino vertellen dat het verwachten de functie dat moet voor het retourneren van een getal (in dit geval, het nummer van de pin van de Arduino die is aangesloten op een van de RGB LED's pinnen. De als verklaringen een beetje anders kijkt dat wat we hebben gezien, kon ik heb geschreven de functie als volgt:
int getNextColor(int color){ if (color == red) { return green; } if (color == green) { return blue; } if (color == blue) { return red; } }
.. .en het in exact dezelfde manier werken zou. Als u alleen wilt uitvoeren van één regel in een if-instructie, kunt u de verkorte:
Als (iets) DoeIets;
zonder accolades of linebreaks.
Deel 2 van deze serie hier blijven, of leren hoe te sluiten op de MIDI in- en uitgangen van de Arduino.