• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino dwie funkcje pod jednym przyciskiem
#1
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);
 
Odpowiedź
#2
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
  
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#3
(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ć.
 
Odpowiedź
#4
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 Wink

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; }
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#5
(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ę.


Załączone pliki
.zip   UsbKeyboard.zip (Rozmiar: 110.75 KB / Pobrań: 3)
 
Odpowiedź
#6
a u mnie biblioteka nie działa , jaka wersja ardu do tego
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#7
1.0.5

Wysłano za pomocą Commodore C64
 
Odpowiedź
#8
ok później zerknę na 1.7.9 może nie działać
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#9
Tak, nie działa.

Znalazłem coś takiego może dałoby się zaimplementować?
clickbutton


Wysłano za pomocą Commodore C64
 
Odpowiedź
#10
Podrzuć mi proszę schemat bo troszkę ich jest a nie wiem który pod twoją bibliotekę ( na 1.0.2 też działa )
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 2 gości