• 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
#11
http://www.practicalarduino.com/projects...b-keyboard

Zamiast diody zenera mogą być dwie 1n4148 szeregowo na +.

Jeszcze przydałoby się wyeliminować drgania styków.

Wysłano za pomocą Commodore C64
 
Odpowiedź
#12
No i jakoś poszło , przynajmniej u mnie działa Wink daj znać czy u ciebie też .

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 pushF = 0;
int pushR = 0;

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();
  
    digitalWrite(13, !digitalRead(13));

if (digitalRead(PLAY) == 0) {
    UsbKeyboard.sendKeyStroke(KEY_PLAY);
    Bypass();
}

if (digitalRead(SSTOP) == 0) {
    UsbKeyboard.sendKeyStroke(KEY_B);
    Bypass();
}
    
if (digitalRead(PAUSE) == 0) {
    UsbKeyboard.sendKeyStroke(KEY_PAUSE);
    Bypass();
}

if (digitalRead(FORWARD) == 0) {pushF ++;}
if (digitalRead(FORWARD) == 1) {pushF = 0;}
  
       if ( pushF > 1 and pushF < 4 ){
          UsbKeyboard.sendKeyStroke(KEY_FORWARD);
          Bypass(); }

       if ( pushF > 4 ){
          UsbKeyboard.sendKeyStroke(KEY_FASTFORWARD);
          Bypass(); }

if (digitalRead(REVERSE) == 0) {pushR ++;}
if (digitalRead(REVERSE) == 1) {pushR = 0;}
  
       if ( pushR > 1 and pushR < 4 ){
          UsbKeyboard.sendKeyStroke(KEY_REVERSE);
          Bypass(); }

       if ( pushR > 4 ){
          UsbKeyboard.sendKeyStroke(KEY_REWIND);
          Bypass(); }

}

void Bypass(){
  
#if BYPASS_TIMER_ISR  
  delayMs(200);
#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ź
#13
(24-04-2016, 14:14)JasQ napisał(a): No i jakoś poszło , przynajmniej u mnie działa Wink daj znać czy u ciebie też .

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 pushF = 0;
int pushR = 0;

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();
 
   digitalWrite(13, !digitalRead(13));

if (digitalRead(PLAY) == 0) {
   UsbKeyboard.sendKeyStroke(KEY_PLAY);
   Bypass();
}

if (digitalRead(SSTOP) == 0) {
   UsbKeyboard.sendKeyStroke(KEY_B);
   Bypass();
}
   
if (digitalRead(PAUSE) == 0) {
   UsbKeyboard.sendKeyStroke(KEY_PAUSE);
   Bypass();
}

if (digitalRead(FORWARD) == 0) {pushF ++;}
if (digitalRead(FORWARD) == 1) {pushF = 0;}
 
      if ( pushF > 1 and pushF < 4 ){
         UsbKeyboard.sendKeyStroke(KEY_FORWARD);
         Bypass(); }

      if ( pushF > 4 ){
         UsbKeyboard.sendKeyStroke(KEY_FASTFORWARD);
         Bypass(); }

if (digitalRead(REVERSE) == 0) {pushR ++;}
if (digitalRead(REVERSE) == 1) {pushR = 0;}
 
      if ( pushR > 1 and pushR < 4 ){
         UsbKeyboard.sendKeyStroke(KEY_REVERSE);
         Bypass(); }

      if ( pushR > 4 ){
         UsbKeyboard.sendKeyStroke(KEY_REWIND);
         Bypass(); }

}

void Bypass(){
 
#if BYPASS_TIMER_ISR  
 delayMs(200);
#else
 delay(130);
#endif
 
}
Dzięki działa wedle moich założeń, jesteś wielki :Smile.
PS. zająłem się drogą częścią programu, a tą zostawiłem na później.
 
Odpowiedź
#14
No to super , daj co tam masz dalej poskładamy do kupy .
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#15
Jeszcze raz dzięki.

Bawiłeś się pilotem na arduino?

mam już część kodu opowiedzianą, za zaprogramowanie kodu pilota włączanie/wyłączanie HTPC wybranym przyciskiem pilota. Teraz główkuję jak przesyłać sygnał z pilota po rs232 tak aby można było sterować KODI lub Girder.


Kod:
#include <IRremote.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long CurrentValue = 0;
unsigned long StoredCode = 0;
const int buttonPin = 6;     // pin przycisku
const int ledPin =  4;      // pin diody LED
const int outputPin =  3;      // wyjście pinu LED
const int relayPin =  2;      // pin przekaźnika
int buttonState = 0;         // zmienna do odczytu stanu przycisku
int RecordState = 0;         //zmienna odbiornika w trybie nagrywania
int outputState = 1;         //zmienna wyjścia włączyć lub wyłączyć

void setup()
{
 Serial.begin(9600);
 irrecv.enableIRIn(); // Start the receiver

   // Inicjalizacja pinu LED jako wyjścia:
 pinMode(ledPin, OUTPUT);    
 //  Inicjalizacja pinu przycisku jako dane wejściowe:
 pinMode(outputPin, OUTPUT);    
 // Inicjalizacja pin przycisku jako wejście:
 pinMode (buttonPin, INPUT);  
 pinMode(relayPin, OUTPUT);    
 // Inicjalizacja pin przycisku jako wejście:
 pinMode(buttonPin, INPUT);  

}


void loop() {

  // Odczyt stanu wartości przyciskiem:
buttonState = digitalRead(buttonPin);

  // Jeśli zostanie wykryty sygnał, przechowywania wartość
if (irrecv.decode(&results)) {
 CurrentValue = (results.value);

  // Jeśli wartość Odebrana równa zaprogramowanej wartości, a następnie przełączyć stan wyjściowy
 if(CurrentValue == StoredCode) {
     outputState = !outputState;
  }

  // Czy tryb nagrywania jest aktywowany zapisać bieżącą wartość jako zaprogramowanej wartości
 if (RecordState == 1) {
   StoredCode = CurrentValue;
   RecordState = 0;
   digitalWrite(ledPin, LOW);  
   Serial.println(StoredCode);  //Wyświetla zapisany kod w celach informacyjnych
  }

  // Receive the next value
 irrecv.resume();
}

else //jeśli nie zostanie wykryty żaden sygnał, to bieżąca wartość jest równa 0
{
 CurrentValue = 0;
}

// Sprawdź czy przycisk nagrywania zostanie naciśnięty.
// Jeśli tak jest, to buttonState HIGH:
 if (buttonState == HIGH) {  
// Oczekiwanie na przycisku ma zostać wydany
 while (buttonState == HIGH) {
   buttonState = digitalRead(buttonPin);
 }

  //Włącz LED wskazuje, że tryb nagrywania jest włączony
   digitalWrite(ledPin, HIGH);
   RecordState = 1;
}

  //Ustaw odpowiedni stan wyjściowy
if(outputState == 1) {

     digitalWrite(outputPin, HIGH);
     digitalWrite(relayPin, HIGH);
}
else {
       digitalWrite(outputPin, LOW);
       digitalWrite(relayPin, LOW);
}

}

mam coś takiego na attiny13, ale wolałbym na jednym układzie to wykonać.
 
Odpowiedź
#16
Nie bawiłem ale coś wykombinuję pilotów mam dostatek Wink
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#17
to jest schemat do kodu ww.
[Obrazek: w704.jpg]
Masz tu pomoce naukowe  Wink na ATtiny13


Załączone pliki
.zip   InReCoMe_RC5.zip (Rozmiar: 44.1 KB / Pobrań: 4)
.zip   IrReCoMe_Sony.zip (Rozmiar: 59.69 KB / Pobrań: 3)
 
Odpowiedź
#18
Daj jakiś schemat choćby blokowy twojego ustrojstwa , poniżej najprostszy sposób wysłania po rs232 kodu ir

Kod:
#include <IRLib.h>

IRrecv My_Receiver(9);
IRdecode IRread;
unsigned long codeValue = 0;

void setup()
{
  Serial.begin(9600);
  My_Receiver.enableIRIn();
}

void loop() {

  if (My_Receiver.GetResults(&IRread)) {
    
    IRread.decode();
  
  if (IRread.value != 0){

    Serial.println(IRread.value);}
     My_Receiver.resume();
  }
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#19
Masz post wyżej schemat w załączniku zip powiem szczerze że do arduino jeszcze nie zrobiłem.

Wysłano za pomocą Commodore C64
 
Odpowiedź
#20
No to kod powinien działać o ile samo attiny nie przerabia go na inny system czy kodowanie . Chyba że kodowanie to binarka to wtedy dajesz Serial.println(IRread.value,BIN); i tyle .
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: 1 gości