Az egyik alapvető felhasználói interakció a gombnyomás. Megadhatjuk, hogy hosszú vagy rövid gombnyomáskor hogyan viselkedjen az arduino program. Az alábbi arduino példakódok bemutatnak pár lehetőséget.
A következő arduino példa egy szimpla gombnyomás esetén a soros konzolra írja, hogy megnyomtuk a gombot. Nem tesz különbséget, hogy mennyi ideig nyomtuk a gombot.
/**************************************/
/* https://myhomethings.eu */
/**************************************/
const byte buttonPin = 8;
bool printFlag = false;
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop()
{
buttonState = digitalRead(buttonPin);
if(buttonState == LOW && printFlag == false)
{
Serial.println("button is pressed");
printFlag = true;
delay(200);
}
else
{
printFlag = false;
}
}
Az alábbi példakód már a nyomógomb három különböző állapota szerint fut tovább. Ezek az állapotok a nyomva tartott gomb, a rövid gombnyomás és a hosszú gombnyomás.
/**************************************/
/* https://myhomethings.eu */
/**************************************/
const byte buttonPin = 8;
long holdingTime;
long previousHoldingTime;
unsigned long firstButtonPressTime;
byte buttonState;
byte previousButtonState = HIGH;
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop()
{
buttonState = digitalRead(buttonPin);
if (buttonState == LOW && previousButtonState == HIGH && (millis() - firstButtonPressTime) > 200)
{
firstButtonPressTime = millis();
}
holdingTime = (millis() - firstButtonPressTime);
if (holdingTime > 50)
{
if (buttonState == LOW && holdingTime > previousHoldingTime)
{
Serial.println("button is pressed");
}
if (buttonState == HIGH && previousButtonState == LOW)
{
if (holdingTime <= 400)
{
Serial.println("short button press");
}
if (holdingTime > 400)
{
Serial.println("long button press");
}
}
}
previousButtonState = buttonState;
previousHoldingTime = holdingTime;
}
A gombnyomást követheti például fény vagy hang visszajelzés is. A következő arduino vázlat szerint a gomb nyomvatartása esetén a fedélzeti led világít. Rövid gombnyomáskor egyszer csipog a csipogó, a hosszú gombnyomás hatására kétszer csipog. Először építsük meg ezt az áramkört.
Majd töltsük fel az kódot az Arduino Unora.
/**************************************/
/* https://myhomethings.eu */
/**************************************/
const byte buttonPin = 8;
const byte tweeter = 9;
const byte ledPin = 13;
long holdingTime;
long previousHoldingTime;
unsigned long firstButtonPressTime;
byte buttonState;
byte previousButtonState = HIGH;
const int note = 4699;
void beepsOnce()
{
tone(tweeter, note, 125);
delay(180);
noTone(tweeter);
}
void beepsTwice()
{
for (int i = 0; i < 2; i++)
{
tone(tweeter, note, 125);
delay(60);
noTone(tweeter);
delay(60);
}
}
void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop()
{
buttonState = digitalRead(buttonPin);
if (buttonState == LOW && previousButtonState == HIGH && (millis() - firstButtonPressTime) > 100)
{
firstButtonPressTime = millis();
}
holdingTime = (millis() - firstButtonPressTime);
if (holdingTime > 50)
{
if (buttonState == LOW && holdingTime > previousHoldingTime)
{
Serial.println("button is pressed");
digitalWrite(ledPin, HIGH);
}
if (buttonState == HIGH && previousButtonState == LOW)
{
if (holdingTime <= 400)
{
Serial.println("short button press");
beepsOnce();
digitalWrite(ledPin, LOW);
}
if (holdingTime > 400)
{
Serial.println("long button press");
beepsTwice();
digitalWrite(ledPin, LOW);
}
}
}
previousButtonState = buttonState;
previousHoldingTime = holdingTime;
}
Még egy lehetőség, megszakíthatjuk az arduino program futását a gomb megnyomásával. Az attachInterrupt() segítségével még a végtelen while ciklusból is kilép. Az Arduino Uno, Nano, táblákon az iterrupt pinek: 2, 3 .
const byte interruptPin = 3;
void buttonInterrupt()
{
Serial.println("Button is pressed!");
}
void setup()
{
Serial.begin(9600);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), buttonInterrupt, CHANGE);
}
void loop()
{
while(true)
{
delay(100);
}
}
Nézzd meg a többi példát is . ESP32, ESP8266, Arduino vázlatok, példák
Remélem tetszett ez a cikk.