IR-remote: NEC-protocol

Arduino specifieke Software
Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

IR-remote: NEC-protocol

Berichtdoor pjh » 22 Sep 2017, 10:49

Na lange afwezigheid verleidde een kleine display uit een afgedankte DVD-speler mij terug naar Arduino-land. Ik ploos de datasheet van de PT6964-s LED-driver-IC na en kreeg het display weer tot leven. Het heeft ook 4 knopjes en een IR-sensor. Hier een filmpje van een (tussen resultaat):
https://youtu.be/gb2mIFoBYt0
Het uitlezen van mijn afstandsbediening was een hoofdstukje op zichzelf. Ik vond code op het internet om de ON-OFF tijden van de IR-led te verkrijgen, maar bedacht dat het mogelijk beter is de timing op een interrupt pin te zetten. Om de eigen geest te testen besloot ik niet te spieken op google: ik neem aan dat mijn 'wiel & buskruit' al uitgevonden zijn. Ik wilde het zelf doen: als oefening. Ik heb me beperkt tot het 32-bits NEC protocol dat de afstandsbediening van mijn LG-TV uitspuugt. Er zijn meer protocollen. Naast deze vereenvoudigende beperking, heb ik ook de code zo simpel mogelijk gehouden. Dit komt omdat 1) simpel beter lijkt en 2) ik niet beter kan.
==> ik ben dan ook erg benieuwd naar jullie mening over deze code. Ik ben te vaak gevallen om mijn brouwsels trots aan te bieden. Nee: graag lekschieten. Leer ik van. Thanx.
Deze output op de Seriële monitor:
Code: Alles selecteren
  Address: 4
  Command: 17

  Address: 4
  Command: 18

  Address: 4
  Command: 19

  Address: 4
  Command: 65

kreeg ik door op de knoppen: 1, 2, 3 en 'down' van mijn AB te drukken met deze code:
Code: Alles selecteren
const byte interruptPin = 2;

long toen;
volatile long nu;
int tijdsverschil;

byte teller = 0;
byte dbyte[4] = {0, 0, 0, 0};;

void setup() {
  Serial.begin(9600);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), leesAB, RISING);
  nu = toen = micros();
}

void loop() {
  tijdsverschil = nu - toen;
  if (tijdsverschil) {
    if (tijdsverschil < 2500) {
      bitWrite(dbyte[teller / 8], teller % 8, tijdsverschil / 2000);
      teller++;
    } else {
      leegData();
    }
    toen = nu;
  }

  if (teller > 31 && !(dbyte[0] + dbyte[1] - dbyte[2] - dbyte[3])) {
    // byte 1 en byte 3 zijn de 'inverse' van byte 0 en byte 2
    // hierdoor: dbyte[0] + dbyte[1] = 255
    //       en: dbyte[2] + dbyte[3] = 255
    //      dus: dbyte[0] + dbyte[1] - dbyte[2] - dbyte[3] = 0
    //       en: !(0) = niet-nul = not-false = true
    //     ====> hierdoor wordt de data gevalideerd.
    Serial.print("  Address: ");
    Serial.println(dbyte[0]);
    Serial.print("  Command: ");
    Serial.println(dbyte[2]);
    Serial.println();
    leegData();

  }
}

void leesAB() {
  nu = micros();
}

void leegData() {
  for (int i = 0; i < 4; i++) {
    dbyte[i] = 0;
  }
  teller = 0;
}


Advertisement

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: avoveozonuni en 17 gasten