Arduino dwie funkcje pod jednym przyciskiem - bu.tomasz - 20-04-2016
Witam, kleciłem sobie taki oto programik.
Jest to klawiatura USB.
Kod: #include "UsbKeyboard.h"
#define PLAY 6
#define SSTOP 7
#define PAUSE 8
#define FORWARD 9
#define REVERSE 10
#define FASTFORWARD 11
#define REWIND 12
#define BYPASS_TIMER_ISR 1
void setup() {
pinMode(PLAY, INPUT);
digitalWrite(PLAY, HIGH);
pinMode(SSTOP, INPUT);
digitalWrite(SSTOP, HIGH);
pinMode(PAUSE, INPUT);
digitalWrite(PAUSE, HIGH);
pinMode(FORWARD, INPUT);
digitalWrite(FORWARD, HIGH);
pinMode(REVERSE, INPUT);
digitalWrite(REVERSE, HIGH);
pinMode(FASTFORWARD, INPUT);
digitalWrite(FASTFORWARD, HIGH);
pinMode(REWIND, INPUT);
digitalWrite(REWIND, HIGH);
#if BYPASS_TIMER_ISR
TIMSK0&=!(1<<TOIE0); // ++
#endif
}
#if BYPASS_TIMER_ISR
void delayMs(unsigned int ms) {
for (int i = 0; i < ms; i++) {
delayMicroseconds(1000);
}
}
#endif
void loop() {
UsbKeyboard.update();
if (digitalRead(PLAY) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_PLAY);
}
if (digitalRead(SSTOP) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_SSTOP);
}
if (digitalRead(PAUSE) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_PAUSE);
}
if (digitalRead(FORWARD) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_FORWARD);
}
if (digitalRead(REVERSE) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_REVERSE);
}
#if BYPASS_TIMER_ISR
delayMs(150);
#else
delay(130);
#endif
}
Program działa aczkolwiek chciałbym, aby po wciśnięciu i przytrzymaniu przycisku FORWARD przez 2s wykonywał to polecenie.
Kod: UsbKeyboard.sendKeyStroke(KEY_FASTFORWARD);
zamiast
UsbKeyboard.sendKeyStroke(KEY_FORWARD);
i to samo dla przycisku REVERSE
Kod: UsbKeyboard.sendKeyStroke(KEY_REWIND);
zamiast
UsbKeyboard.sendKeyStroke(KEY_REVERSE);
RE: Arduino dwie funkcje pod jednym przyciskiem - JasQ - 21-04-2016
Zerknij czy to działa dla przycisku FORWARD jak będzie za szybko załączał FASTFORWARD to dla push daj 1000 jak za wolno to poniżej 500 . Jak będzie działało to zrób analogicznie dla pozostałych przycisków .
Kod: #include "UsbKeyboard.h"
#define PLAY 6
#define SSTOP 7
#define PAUSE 8
#define FORWARD 9
#define REVERSE 10
#define FASTFORWARD 11
#define REWIND 12
#define BYPASS_TIMER_ISR 1
int push ;
void setup() {
pinMode(PLAY, INPUT);
digitalWrite(PLAY, HIGH);
pinMode(SSTOP, INPUT);
digitalWrite(SSTOP, HIGH);
pinMode(PAUSE, INPUT);
digitalWrite(PAUSE, HIGH);
pinMode(FORWARD, INPUT);
digitalWrite(FORWARD, HIGH);
pinMode(REVERSE, INPUT);
digitalWrite(REVERSE, HIGH);
pinMode(FASTFORWARD, INPUT);
digitalWrite(FASTFORWARD, HIGH);
pinMode(REWIND, INPUT);
digitalWrite(REWIND, HIGH);
#if BYPASS_TIMER_ISR
TIMSK0&=!(1<<TOIE0); // ++
#endif
}
#if BYPASS_TIMER_ISR
void delayMs(unsigned int ms) {
for (int i = 0; i < ms; i++) {
delayMicroseconds(1000);
}
}
#endif
void loop() {
UsbKeyboard.update();
if (digitalRead(PLAY) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_PLAY);
}
if (digitalRead(SSTOP) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_SSTOP);
}
if (digitalRead(PAUSE) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_PAUSE);
}
if (digitalRead(FORWARD) == 0) { push ++; }
if (digitalRead(FORWARD) == 1) {
if ( push > 10 ){
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_FORWARD);
push = 0;
}
if (push > 500){
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_FASTFORWARD);
push = 0;
}
}
if (digitalRead(REVERSE) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_REVERSE);
}
#if BYPASS_TIMER_ISR
delayMs(150);
#else
delay(130);
#endif
}
RE: Arduino dwie funkcje pod jednym przyciskiem - bu.tomasz - 21-04-2016
(21-04-2016, 00:31)JasQ napisał(a): Zerknij czy to działa dla przycisku FORWARD jak będzie za szybko załączał FASTFORWARD to dla push daj 1000 jak za wolno to poniżej 500 . Jak będzie działało to zrób analogicznie dla pozostałych przycisków .
Kod: #include "UsbKeyboard.h"
#define PLAY 6
#define SSTOP 7
#define PAUSE 8
#define FORWARD 9
#define REVERSE 10
#define FASTFORWARD 11
#define REWIND 12
#define BYPASS_TIMER_ISR 1
int push ;
void setup() {
pinMode(PLAY, INPUT);
digitalWrite(PLAY, HIGH);
pinMode(SSTOP, INPUT);
digitalWrite(SSTOP, HIGH);
pinMode(PAUSE, INPUT);
digitalWrite(PAUSE, HIGH);
pinMode(FORWARD, INPUT);
digitalWrite(FORWARD, HIGH);
pinMode(REVERSE, INPUT);
digitalWrite(REVERSE, HIGH);
pinMode(FASTFORWARD, INPUT);
digitalWrite(FASTFORWARD, HIGH);
pinMode(REWIND, INPUT);
digitalWrite(REWIND, HIGH);
#if BYPASS_TIMER_ISR
TIMSK0&=!(1<<TOIE0); // ++
#endif
}
#if BYPASS_TIMER_ISR
void delayMs(unsigned int ms) {
for (int i = 0; i < ms; i++) {
delayMicroseconds(1000);
}
}
#endif
void loop() {
UsbKeyboard.update();
if (digitalRead(PLAY) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_PLAY);
}
if (digitalRead(SSTOP) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_SSTOP);
}
if (digitalRead(PAUSE) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_PAUSE);
}
if (digitalRead(FORWARD) == 0) { push ++; }
if (digitalRead(FORWARD) == 1) {
if ( push > 10 ){
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_FORWARD);
push = 0;
}
if (push > 500){
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_FASTFORWARD);
push = 0;
}
}
if (digitalRead(REVERSE) == 0) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_REVERSE);
}
#if BYPASS_TIMER_ISR
delayMs(150);
#else
delay(130);
#endif
}
dzięki za pomoc, trochę pozmieniałem w kodzie bo nie działało.
Kod: if (digitalRead(FORWARD) == 0) {
push ++;
if (push < 20) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_FORWARD);
}
else
{
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_FASTFORWARD);
}
}
jak teraz zrobić że, po puszczeniu przycisku push się zerowało?
Generalnie chodzi mi o to, aby ten przycisk działał tak jak w odtwarzaczu CD/DVD.
Pojedyncze wciśniecie FORWARD przełącza następny track, dłuższe przytrzymanie nie dzieje się nic, aż do momentu gdy zaczyna przewijać.
RE: Arduino dwie funkcje pod jednym przyciskiem - JasQ - 21-04-2016
Jeszcze raz kod sprawdź , poprawiłem wczorajszy kod . Troszkę na szybko pisałem i małego buga strzeliłem
Zerknij to bo powyżej też się machnąłem
Kod: if (digitalRead(FORWARD) == 0) {
push ++;
if (push < 20) {
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_FORWARD);
}
else
{
delay(20);
digitalWrite(13, !digitalRead(13));
UsbKeyboard.sendKeyStroke(KEY_FASTFORWARD);
}
}
if (digitalRead(FORWARD) == 1){ push = 0; }
RE: Arduino dwie funkcje pod jednym przyciskiem - bu.tomasz - 21-04-2016
(21-04-2016, 10:59)JasQ napisał(a): Jeszcze raz kod sprawdź , poprawiłem wczorajszy kod . Troszkę na szybko pisałem i małego buga strzeliłem
Nie działa bo push =0 cały czas.
Załączam bibliotekę.
RE: Arduino dwie funkcje pod jednym przyciskiem - JasQ - 21-04-2016
a u mnie biblioteka nie działa , jaka wersja ardu do tego
RE: Arduino dwie funkcje pod jednym przyciskiem - bu.tomasz - 21-04-2016
1.0.5
Wysłano za pomocą Commodore C64
RE: Arduino dwie funkcje pod jednym przyciskiem - JasQ - 21-04-2016
ok później zerknę na 1.7.9 może nie działać
RE: Arduino dwie funkcje pod jednym przyciskiem - bu.tomasz - 21-04-2016
Tak, nie działa.
Znalazłem coś takiego może dałoby się zaimplementować?
clickbutton
Wysłano za pomocą Commodore C64
RE: Arduino dwie funkcje pod jednym przyciskiem - JasQ - 22-04-2016
Podrzuć mi proszę schemat bo troszkę ich jest a nie wiem który pod twoją bibliotekę ( na 1.0.2 też działa )
|