Arduino Polska Forum

Pełna wersja: Arduino dwie funkcje pod jednym przyciskiem
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3
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);
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
  
}
(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ć.
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; }
(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ę.
a u mnie biblioteka nie działa , jaka wersja ardu do tego
1.0.5

Wysłano za pomocą Commodore C64
ok później zerknę na 1.7.9 może nie działać
Tak, nie działa.

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


Wysłano za pomocą Commodore C64
Podrzuć mi proszę schemat bo troszkę ich jest a nie wiem który pod twoją bibliotekę ( na 1.0.2 też działa )
Stron: 1 2 3