• 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
Ignorowanie jednego z dwóch sygnałów - pilot IR
#1
Cześć,
mam taki problem którego nie mogę rozwiązać, niezależnie od tego jak zbuduje warunek.
Zakupiłem jakiś prosty pilot, celem dołączenia go do TV poprzez jakiś tam moduł odbiornika, który próbuje zrobić, bo pilot oryginalny jest niedostępny.

Do rzeczy, pilot wysyła dwukrotnie ten sam kod, tzn. gdy naciśniemy Vol+ dostaje 2 razy na serialu 0x10, po naciśnięciu drugi raz znowu 2 razy 0x810 i tak w kółko.
To że 2 kody się zapętlają nie sprawia problemu, problem w tym że każdy wysyłany jest dwukrotnie, więc nie jestem w stanie napisać warunku który by jeden z tych dwóch sygnałów ominął bądź wykonał puste polecenie i tym podobne.

Jakieś sugestie? Byłbym wdzięczny Wink
 
Odpowiedź
#2
if
jeżeli przycisk jest wciśnięty a wartość początkowa ==0
to
2 razy 0x810
zamień 0 na 1
if
jeżeli przycisk jest wciśnięty a wartość początkowa ==1
to
2 razy 0x10
zamień 1 na 01
 
Odpowiedź
#3
Chyba nie rozumiem albo coś jest nie tak:

if
jeżeli przycisk jest wciśnięty a wartość początkowa ==0
to
2 razy 0x810
zamień 0 na 1

Przycisk pilota jest wciskany a ja ODBIERAM dwa razy 0x10 i 0x810
Skupmy się na jednym z odbieranych kodów bo dla drugiego będzie to po prostu kopia warunku (przycisk nie ma togglować tylko za każdym razem reagować tak samo, niezależnie czy mamy 0x10 czy 0x810)

Więc warunek wygląda w tym wypadku tak:

if (results.value == 0x10) {
polecenie
}

Pytanie brzmii jak zignorować drugi odbierany sygnał?
 
Odpowiedź
#4
Mój błąd myślałem że chcesz zrobić drugiego pilota.

if (results.value == 0x10) {
polecenie
delay(1000);
}
A takie coś starczy?
Program odbierze tylko 0x10 1 raz i przez 1s nie odbierze nic. Jak nie masz drugiego kodu w programie to tak jakby nie było.
 
Odpowiedź
#5
Próbowałem....po odczekaniu bóg wie jakiego czasu po jego minięciu na serialu pojawia się drugi powtórzony sygnał i instrukcja wykonuje się ponownie.

Nie mam już na to żadnego pomysłu...
 
Odpowiedź
#6
Z tego co wiem to są chyba tylko 3 rodzaje pilotów poszukaj w necie informacji i przykładów . Lub kup analizator stanów logicznych chiński na polskim portalu to koszt do 40zł zrób odczyt zobaczysz co ten pilot i jak wysyła . Albo podaj kod pilota z przyciski on of to może znajdzie się osoba co Ci opisze jak to nadaje.
 
Odpowiedź
#7
Przecież mam odczyt wszystkich kodów które pilot wysyła, zwykły sample IRremote na arduino obsługuje go bez problemu. On/off to bodajże 0xC na zmianę z 0x80C, nie rozumiem co ta informacja ma zmienić.

Potrzebuje tylko sposobu na zignorowanie jednego z dwóch wysyłanych sygnałów
 
Odpowiedź
#8
Nie powinieneś po prostu ignorować sygnału bo jest taki sam. Musi być jeszcze warunek czasowy, a całość oczywiście wykonywana w sposób nieblokowalny. Którego przykładu używasz z biblioteki IR, może nie ma możliwości w niej ignorowania bo sama biblioteka wypluwa wszystko na uart?
Tak ogólnie zrobiłbym to tak jak z drganiami styków w przykładach:
/*
* IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/

#include <IRremote.h>

int RECV_PIN = 2;

IRrecv irrecv(RECV_PIN);
unsigned long last,current;
unsigned long  debouncetime=5000;
uint32_t ircode,lastircode;
uint8_t newcode,transmisja;
decode_results results;

void setup()
{
 Serial.begin(115200);
 // In case the interrupt driver crashes on setup, give a clue
 // to the user what's going on.
 Serial.println("Enabling IRin");
 irrecv.enableIRIn(); // Start the receiver
 Serial.println("Enabled IRin");
  last = millis();
}

void loop() {
current = millis();
 if (irrecv.decode(&results)) {
transmisja=1; //odczytano nowy kod

ircode=results.value; //przypisanie jego wartosci do zmienej
if (ircode!=lastircode) {
lastircode=ircode; ; //nowy kode jest rozny od poprzedniego?
newcode=1;
}
irrecv.resume(); // Receive the next value , powrot do nasluchu
 }
if((transmisja&&newcode)||(transmisja&&current-last>debouncetime)) //nowa transmisja i nowy klawisz lub nowa transmisja i  stary klawisz po czasie dozwolonym
{
last=current; //zerujemy licznik czasu
 Serial.println(ircode, HEX);

 }

 

transmisja=0;
newcode=0;
}
Oczywiście 5000ms można zminić na bardziej ludzkie opóźnienie.
Program za każdym razem sprawdza czy to co przyleciało jest takie samo jak poprzednie, wykonuje akcję print jeśli klawisz przyciśnięty jest inny lub minął debouncetime pozwalający użyć tego samego przycisku ponownie.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#9
Wgrałem to bez zmian i problem zniknął, kody pojawiają się pojedynczo, na zmianę.
Dopiszę tylko swoje instrukcje do odebranych kodów, zmienię optymalnie czas i w sumie program gotowy.

Wielkie dziękuję za pomoc Smile Łap punkt reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości