Jako základ jsem vzal ten úvodní kód, který se mi zdál nejčitelnější.
Protože teď nemám k dispozici Arduino Micro PRO, které umí simulovat USB klávesnci, vyzkoušel jsem to jen na Arduinu NANO.
Takže si zruš komentáře u příkazů, které simulují klávesnici (Keyboard.begin... a Keyboard.write...) a naopak si zakomentuj příkazy pro výstup na sériový port (Serial.println...).
Vyzkoušej a uvidíš:
Kód: Vybrat vše
// Pushbuttons pins:
const int BTN[4] = {2, 3, 4, 5};
// LEDs pins:
const int LED[4] = {10, 16, 14, 15};
boolean povolena_akce = true; // Znacka, jestli je mozne spustit akci
byte i; // promenna pro ruzne smycky
//----------------------------------------------------------------
void setup()
{
for (i = 0; i < 4; i++)
{
pinMode(BTN[i], INPUT_PULLUP); // nastaveni smeru pinu pro tlacitka na vstup s Pull-Upy
pinMode(LED[i], OUTPUT); // nastaveni smeru pinu pro LED na vystup
}
//Initialize control over the keyboard:
// Keyboard.begin(); // PRO ARDUINO MICRO ZRUSIT KOMENTAR
Serial.begin(9600); // PRO ARDUINO MICRO ZAKOMENTOVAT
}
//------------ hlavni smycka -----------
void loop()
{
byte cislo_akce; // pomocna promenna s cislem stisknuteho tlacitka
byte pocet_stisknutych = 0; // nejdriv se zjisti, kolik je stisknutych tlacitek
for (i = 0; i < 4; i++)
{
// kontrola tlacidiel
if(cti_tlacitko(BTN[i]) == true)
{
cislo_akce = i; // nejvyssi ze stisknutych tlacitek se zapamatuje (vyuzito to bude jen v pripade, ze bude stisknuto jen jedno)
pocet_stisknutych ++;
}
}
if (pocet_stisknutych == 1) // kdyz je stisknuto jen jedno tlacitko, provede se pozadovana akce
{
sendBtnPress(cislo_akce);
povolena_akce = false; // dalsi akce se zakazou az do doby ....
}
if (pocet_stisknutych == 0) // ... dokud nebudou vsechna tlacitka uvolnena
{
povolena_akce = true;
}
}
//----------------------------------------------------------------------------
/* This function sends a single key over USB
* This function will only send a key press if a single button is being pressed
*/
void sendBtnPress(int key) // key je index tlacitka a LED, pocita se od 0. Hodnota tedy muze byt 0 az 3
{
if (povolena_akce == true) // akce se provadi jen v pripade, ze jsou povolene
{
zhasni_vsechny_LED(); // rozsviti jen jednu LED podle indexu tlacitka, ostatni zhasne
digitalWrite(LED[key], HIGH);
//Perform tasks:
switch(key)
{
case 0: // Sends a key '1'
// Keyboard.write('1');
Serial.println("prvni tlacitko (index 0)");
break;
case 1: // Sends a key '2'
// Keyboard.write('2');
Serial.println("druhe tlacitko (index 1)");
break;
case 2: // Sends a key '3'
// Keyboard.write('3');
Serial.println("treti tlacitko (index 2)");
break;
case 3: // Sends a key '4'
// Keyboard.write('4');
Serial.println("ctvrte tlacitko (index 3)");
break;
}
}
}
//----------------------------------------------------------------
// vraci true, jen kdyz je tlacitko stisknute alespon 10ms
boolean cti_tlacitko(int pin)
{
boolean vystup = false;
// skontrolovat a odblokovat tlacidla
if (digitalRead(pin) == LOW)
{
delay(10);
if (digitalRead(pin) == LOW)
{
vystup = true;
}
}
return vystup;
}
//----------------------------------------------------------------
void zhasni_vsechny_LED(void)
{
for (i = 0 ; i<4 ; i++)
{
digitalWrite(LED[i], LOW);
}
}