Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Hvordan kopiere/sniffe IR


xibriz

Anbefalte innlegg

Hva er best måte å kopiere/sniffe IR-signaler på?

 

 

Har ingen erfaring med IR, men har skjønt at det finnes flere protokoller og formater på kodene?

 

Helt konkret tenker jeg og styre kjøkkenventilatoren min som har en fjernkontroll med en ESP8266. I min enkle verden så tenker jeg å kopiere IR-signalet til fjernkontrollen og videresende det med ESP'en.

 

Utstyr jeg har tilgengelig for å finne ut av dette (IR-signalet) er ESP8266, Arduino eller kanskje Harmony Hub kan brukes?

 

Lenke til kommentar
Del på andre sider

29 minutter siden, xibriz skrev:

Hva er best måte å kopiere/sniffe IR-signaler på?

 

 

Har ingen erfaring med IR, men har skjønt at det finnes flere protokoller og formater på kodene?

 

Helt konkret tenker jeg og styre kjøkkenventilatoren min som har en fjernkontroll med en ESP8266. I min enkle verden så tenker jeg å kopiere IR-signalet til fjernkontrollen og videresende det med ESP'en.

 

Utstyr jeg har tilgengelig for å finne ut av dette (IR-signalet) er ESP8266, Arduino eller kanskje Harmony Hub kan brukes?

 

Jeg har en liten krets koblet til en ESP8266(NodeMCUv2) som kan lese og sende IR via MQTT. Funker bra og har ikke hatt noen "hikk" siden den ble satt opp, skal se om jeg kan lage til et koblingskjema og laste opp kildekode når jeg kommer hjem. ?

 

Dersom dere ikke hører fra meg innen 18:00 så får dere minne meg på det. ?

  • Like 1
Lenke til kommentar
Del på andre sider

19 minutter siden, Lazarus skrev:

Jeg har en liten krets koblet til en ESP8266(NodeMCUv2) som kan lese og sende IR via MQTT. Funker bra og har ikke hatt noen "hikk" siden den ble satt opp, skal se om jeg kan lage til et koblingskjema og laste opp kildekode når jeg kommer hjem. 1f642.png

 

Hvilken sensor bruker du?

Jeg har prøvd 2 forskjellige og til og med koblet vekk NodeMCU og satt inn resistor+diode og får likevel ikke lys i dioden... :( Begge IR-sensorene er 38 KHz.

Lenke til kommentar
Del på andre sider

3 timer siden, ZoRaC skrev:

 

Hvilken sensor bruker du?

Jeg har prøvd 2 forskjellige og til og med koblet vekk NodeMCU og satt inn resistor+diode og får likevel ikke lys i dioden... :( Begge IR-sensorene er 38 KHz.

http://www.ebay.com/itm/5PCS-38-kHz-Remote-TSOP4838-DIP-3-IR-Receiver-Infrared-Radiation-Module-MO-/152502597921?hash=item2381dcf921

Den type der. 38KHz TSOP4838.

 

Har du forsøkt med forskjellige fjernkontroller? og blinker IR LED på fjernkontrollen når du ser den gjennom et kamera?

Tror vi har diskutert oppsettet ditt før uten å komme noen vei.

Når jeg får laget til tegningen så kan du jo koble etter den og se om du får noe opp da? jeg bruker en pull-up resistor på datapin... tror jeg det var... kan det hjelpe hos deg?

Lenke til kommentar
Del på andre sider

Rotet sammen et koblingsskjema.. får håpe det gir mening. :-)

 

NodeIR.thumb.PNG.f2a58a7956958d92c1c144941c0a70a8.PNG

 

 

 

Kode:

Spoiler

/*
 * IRremoteESP8266: IRServer - MQTT IR server
 * An IR LED must be connected to ESP8266 RX port (GPIO-3)
 * An IR receiver to GPIO 0
 * used library:
 * https://github.com/markszabo/IRremoteESP8266
 * 
 * Modified to fit needs by Lazarus.
 */

#include <ESP8266WiFi.h>
#include <IRremoteESP8266.h>
#include <PubSubClient.h>

 // Update these with values suitable for your network.

const char* wifi_ssid = "SSID";
const char* wifi_password = "PASSWORD";
const char* mqtt_server = "SERVERIP";
const char* mqtt_user = "USERNAME";
const char* mqtt_password = "Password";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

int RECV_PIN = D4; //an IR detector/demodulator is connected to GPIO pin 0

IRrecv irrecv(RECV_PIN);

const char* topicReport = "esp8266/01/ir/info";
const char* topicSubscribe = "esp8266/01/ir/sender";



String clientName; // MQTT client name
char message_buff[100];


// Pin of IR sender
IRsend irsend(D5); // rx port z RS232 



// -----------------------------------------------------------------
void setup(void){
  irsend.begin();
  irrecv.enableIRIn();  // Start the receiver

  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

}

void setup_wifi() {

	delay(10);
	// We start by connecting to a WiFi network
	Serial.println();
	Serial.print("Connecting to ");
	Serial.println(wifi_ssid);

	WiFi.begin(wifi_ssid, wifi_password);

	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
	}

	Serial.println("");
	Serial.println("WiFi connected");
	Serial.println("IP address: ");
	Serial.println(WiFi.localIP());
}



// -----------------------------------------------------------------

void callback(char* topic, byte* payload, unsigned int length) {
	Serial.print("Message arrived [");
	Serial.print(topic);
	Serial.print("] "); 
	for (int i = 0; i < length; i++) {
		Serial.print((char)payload[i]);
	}
	Serial.println();

	int i = 0;

	// create character buffer with ending null terminator (string)
	for (i = 0; i<length; i++) {
		message_buff[i] = payload[i];
	}
	message_buff[i] = '\0';

	String msgString = String(message_buff);
	String msgTopic = String(topic);
	unsigned long msgInt;

	Serial.println("Payload String: " + msgString);

	int endOfBits;
	String irTypStr = "";
	String irBitsStr = "";
	int irBitsInt = -1;
	
	int endOfTyp = msgString.indexOf("-");
	if (endOfTyp != -1)	{
		// irTyp exists and something more
		irTypStr = msgString.substring(0, endOfTyp);
		// msgInt is last
		String dataStr = msgString.substring(endOfTyp + 1);
		msgInt = 0;
		for (int i = 0; i < dataStr.length(); i++) {
			char c = dataStr.charAt(i);
			if (c < '0' || c > '9') break;
			msgInt *= 10;
			msgInt += (c - '0');
		}
	}


	Serial.println("The type is: "+irTypStr);
	if (irTypStr == "NEC") {

		Serial.print("Send NEC:");
		Serial.println(msgInt);
		irsend.sendNEC(msgInt, 32);
	}
	else if (irTypStr == "RC5") {
		Serial.print("Send RC5:");
		Serial.print(msgInt);
		Serial.print(" (");
		Serial.print(irBitsInt);
		Serial.println("-bits)");
		irsend.sendRC5(msgInt, irBitsInt);
	}
	else if (irTypStr == "SAMSUNG") {
		Serial.print("Send SAMSUNG:");
		Serial.println(msgInt);
		irsend.sendSAMSUNG(msgInt, 32);
	}

}

unsigned long atoul(const char* ptr) {
	long long result = 0;
	while (*ptr && isdigit(*ptr)) {
		result *= 10;
		result += *ptr++ - '0';
	}
	return result;
}


// -----------------------------------------------------------------
void reconnect() {
	// Loop until we're reconnected
	while (!client.connected()) {
		Serial.print("Attempting MQTT connection...");
		// Attempt to connect
		if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
			Serial.println("connected");
			// Once connected, publish an announcement...
			client.publish(topicReport, "I am now online");
			// ... and resubscribe
			client.subscribe(topicSubscribe);
		}
		else {
			Serial.print("failed, rc=");
			Serial.print(client.state());
			Serial.println(" try again in 5 seconds");
			// Wait 5 seconds before retrying
			delay(5000);
		}
	}
}

// -----------------------------------------------------------------
// Encodig of data
void  encoding (decode_results *results, char * result_encoding)
{
  switch (results->decode_type) {
    default:
    case UNKNOWN:      strncpy(result_encoding,"UNKNOWN\0",8);       break ;
    case NEC:          strncpy(result_encoding,"NEC\0",4);           break ;
    case SONY:         strncpy(result_encoding,"SONY\0",5);          break ;
    case RC5:          strncpy(result_encoding,"RC5\0",4);           break ;
    case RC6:          strncpy(result_encoding,"RC6\0",4);           break ;
    case DISH:         strncpy(result_encoding,"DISH\0",5);          break ;
    case SHARP:        strncpy(result_encoding,"SHARP\0",6);         break ;
    case JVC:          strncpy(result_encoding,"JVC\0",4);           break ;
    case SANYO:        strncpy(result_encoding,"SANYO\0",6);         break ;
    case MITSUBISHI:   strncpy(result_encoding,"MITSUBISHI\0",11);   break ;
    case SAMSUNG:      strncpy(result_encoding,"SAMSUNG\0",8);       break ;
    case LG:           strncpy(result_encoding,"LG\0",3);            break ;
    case WHYNTER:      strncpy(result_encoding,"WHYNTER\0",8);       break ;
    case AIWA_RC_T501: strncpy(result_encoding,"AIWA_RC_T501\0",13); break ;
    case PANASONIC:    strncpy(result_encoding,"PANASONIC\0",11);    break ;
  }
}

// -----------------------------------------------------------------
void loop(void){
	if (!client.connected()) {
		reconnect();
	}
	client.loop();

  decode_results  results;        // Somewhere to store the results
  if (irrecv.decode(&results)) {  // Grab an IR code
    char myTopic[100];
    char myTmp[50];
    char myValue[500];
    encoding (&results, myTmp);
    if (results.decode_type != UNKNOWN) {
      // any other has code and bits
		Serial.print(myTmp);
		Serial.print("-");
		Serial.println(results.value);
		sprintf(myValue, "%s-%lu", myTmp, results.value);
      client.publish(topicReport, (char*) myValue );
    }
    irrecv.resume();              // Prepare for the next value
  }
}

 

PS. Kode er ikke skrevet med tanke på å distribuere. Den er verken dokumentert eller formatert på noen bra måte. 

Lenke til kommentar
Del på andre sider

13 minutter siden, xibriz skrev:

 

Hvilken motstand bruker du på R1?

heh... jeg skippet den da jeg fant ut at LED ikke nødvendigvis kommer til å brenne opp av små korte pulser 5-6 ganger dagen...

Ville nok hatt en resistor på 45-55 Ohm.

For R2 benytter jeg en som er 10K ohm eller høyere.

 

Lenke til kommentar
Del på andre sider

Ok. Prøvde litt i går kveld (før du kom med skissen din), også bruker jeg Esp Easy Mega for anledningen så jeg kan teste mye rart uten å programmere.

 

Fikk til å lese signalene (har en litt annen mottaker enn deg). Fikk typ 70c som output.. altså veldig korte koder fra fjernkontrollen.

 

Men tok litt av å monterte en 10k motstand på senderen så det forklarer jo en del hvorfor den ikke fungerte :P

Endret av xibriz
Lenke til kommentar
Del på andre sider

Etter tre kvelder kom jeg i mål. Følgende oppskrift brukte jeg for å kunne kontrollere en Witt ventilator WSU90W

 

Jeg brukte denne guiden til å dekode signalene fra fjernkontrollen med en Arduino og en IR-mottaker: https://learn.adafruit.com/using-an-infrared-library/hardware-needed

 

Dette ga meg følgende output:

 

Sitat

LYS:

 

Decoded RC5(3): Value:1FC0 Adrs:0 (13 bits)
Raw samples(26): Gap:34498
  Head: m806  s878
0:m806 s882    1:m806 s878         2:m806 s878    3:m806 s882        
4:m802 s882    5:m806 s882         6:m1650 s878    7:m806 s902        
8:m786 s878    9:m806 s882         10:m802 s882    11:m806
Extent=21878
Mark  min:786     max:1650
Space min:878     max:902


Decoded RC5(3): Value:17C0 Adrs:0 (13 bits)
Raw samples(24): Gap:13702
  Head: m802  s882
0:m1654 s1714    1:m806 s882         2:m806 s878    3:m806 s882        
4:m806 s878    5:m1654 s878         6:m806 s882    7:m806 s878        
8:m806 s882    9:m806 s878         10:m806
Extent=21878
Mark  min:806     max:1654
Space min:878     max:1714

 

NED

Decoded RC5(3): Value:1FC7 Adrs:0 (13 bits)
Raw samples(26): Gap:24950
  Head: m806  s902
0:m782 s882    1:m806 s878         2:m806 s878    3:m810 s878        
4:m806 s878    5:m806 s882         6:m1650 s878    7:m806 s882        
8:m806 s1714    9:m806 s882         10:m806 s874    11:m806
Extent=22710
Mark  min:782     max:1650
Space min:874     max:1714

 

Decoded RC5(3): Value:17C7 Adrs:0 (13 bits)
Raw samples(24): Gap:57042
  Head: m810  s878
0:m1650 s1718    1:m806 s878         2:m806 s882    3:m806 s878        
4:m806 s878    5:m1654 s878         6:m810 s874    7:m810 s1714        
8:m806 s878    9:m806 s874         10:m810
Extent=22710
Mark  min:806     max:1654
Space min:874     max:1718

 

OPP

Decoded RC5(3): Value:17C9 Adrs:0 (13 bits)
Raw samples(22): Gap:4526
  Head: m806  s878
0:m1650 s1718    1:m806 s878         2:m806 s882    3:m802 s882        
4:m802 s882    5:m1650 s882         6:m806 s1714    7:m1654 s878        
8:m810 s1710    9:m806
Extent=22702
Mark  min:802     max:1654
Space min:878     max:1718

 

Decoded RC5(3): Value:1FC9 Adrs:0 (13 bits)
Raw samples(24): Gap:18282
  Head: m806  s882
0:m806 s878    1:m806 s878         2:m810 s878    3:m802 s882        
4:m806 s878    5:m806 s878         6:m1650 s882    7:m802 s1718        
8:m1650 s882    9:m806 s1710         10:m806
Extent=22702
Mark  min:802     max:1650
Space min:878     max:1718

 

 

 

Denne informasjonen kunne jeg bruke på min ESP8266 som kjører Esp Easy V2/Mega.

 

Følgende URLer kan brukes:

 

Sitat

LYS

http://IP/control?cmd=IRSEND,RC5,1FC0,12

 

OPP

http://IP/control?cmd=IRSEND,RC5,17C9,12

 

NED

http://IP/control?cmd=IRSEND,RC5,1FC7,12

 

Det blir MQTT etter hvert og deretter "Alexa, turn off kitchen fan" :)

 

NB! I dekodingen fra arduinoen står det at koden er 13 bits, dette er åpenbart feil da hex-koden er 12 bits slik jeg har spesifisert i URLen. Men det er vel ikke 100% nøyaktig disse greiene.

  • Like 1
Lenke til kommentar
Del på andre sider

Den 3.5.2017 klokken 11.57, Lazarus skrev:

http://www.ebay.com/itm/5PCS-38-kHz-Remote-TSOP4838-DIP-3-IR-Receiver-Infrared-Radiation-Module-MO-/152502597921?hash=item2381dcf921

Den type der. 38KHz TSOP4838.

 

Har du forsøkt med forskjellige fjernkontroller? og blinker IR LED på fjernkontrollen når du ser den gjennom et kamera?

Tror vi har diskutert oppsettet ditt før uten å komme noen vei.

Når jeg får laget til tegningen så kan du jo koble etter den og se om du får noe opp da? jeg bruker en pull-up resistor på datapin... tror jeg det var... kan det hjelpe hos deg?

 

Prøvde først VS1838B, med både Harmony-kontrollen og Canal Digital sin. Kjøpte deretter TSOP4838 og har testet den med Canal Digitsl sin. Tror kanskje jeg har funnet problemet nå - googlet for å finne ut om CD-kontrollen brukte 38 KHz...viser seg at dritten skal pares mot dekoderen og kommuniserer via BlueTooth! ? Så skal prøve en gang til med noen flere fjernkontroller og de hvordan det går...

Lenke til kommentar
Del på andre sider

5 timer siden, ZoRaC skrev:

 

Prøvde først VS1838B, med både Harmony-kontrollen og Canal Digital sin. Kjøpte deretter TSOP4838 og har testet den med Canal Digitsl sin. Tror kanskje jeg har funnet problemet nå - googlet for å finne ut om CD-kontrollen brukte 38 KHz...viser seg at dritten skal pares mot dekoderen og kommuniserer via BlueTooth! 1f621.png Så skal prøve en gang til med noen flere fjernkontroller og de hvordan det går...

Hvilken canal digital tuner er det du har?

 

Jeg kan slå av\på\bytte kanal osv med min tlf mot canal digital sin TV tuner.

 

Både den nyere dekoderen:

t-webox_800x400.png

og den eldre modellen

sdOeV11.png

 

 

 

Lenke til kommentar
Del på andre sider

4 timer siden, ZoRaC skrev:

 

T-We Box (ADB 5743).

Dette satte meg på sporet: https://kabel.canaldigital.no/hjelp/tv/brukerveiledninger/t-we-box-adb-5743/fjernkontroll/ og på chat sa de at den gikk på BT.

Hm ja, er vel samme jeg har. "ADB-5743CDX".

 

Fungerer fint på IR den her..

 

Edit: Kan jo stemme at den har bluetooth også, da fjernkontrollern fungere "overalt" :P

Endret av Merko
Lenke til kommentar
Del på andre sider

  • 11 måneder senere...

@xibriz Jeg har samme ventilator så her sparte du meg for en del jobb, takk! 

Men det ser ut som du fant 2 koder for hver kommando ( 1Fxx og 17xx)? ser du bruker F-varianten på LYS og NED og 7-varianten på OPP, er dette bare resultat av prøving og feiling eller virker begge koder på hver kommando?  

Lenke til kommentar
Del på andre sider

43 minutter siden, Marius skrev:

@xibriz Jeg har samme ventilator så her sparte du meg for en del jobb, takk! 

Men det ser ut som du fant 2 koder for hver kommando ( 1Fxx og 17xx)? ser du bruker F-varianten på LYS og NED og 7-varianten på OPP, er dette bare resultat av prøving og feiling eller virker begge koder på hver kommando?  

 

Jeg husker ikke detaljene. Det er stor sannsynlighet for at jeg prøvde en og en og tok den første som virket for hver funksjon.

Lenke til kommentar
Del på andre sider

På 10.4.2018 den 15.21, Marius skrev:

 

Ja takk :)

 

#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRsend.h>
#include <IRutils.h>
 

uint8_t ir1Pin = 5;       //IR
IRsend irsend = IRsend(ir1Pin);

void ir1FanUp() {
  irsend.sendRC5(0x17C9, RC5_BITS, 10);
}

void ir1FanDown() {
  irsend.sendRC5(0x1FC7, RC5_BITS, 10);
}

void ir1LightToggle() {
  irsend.sendRC5(0x1FC0, RC5_BITS, 10);
}

 

  • Like 1
Lenke til kommentar
Del på andre sider

@xibriz takker ?

Angående strømstyrke på dioden, har ikke testa styring av ventilatoren enda, men har sett for meg at det blir for dårlig lysstyrke å drive LED'en rett fra IO-pinnene. Tenkte derfor å bruke en transistor og hente power fra 5V Vin. Hvilken motstand/spenning/strømstyrke endte du opp med? Og har du sjekka praktisk rekkevidde? 

Endret av Marius
Lenke til kommentar
Del på andre sider

  • 1 år senere...

Jeg gjorde det sånn her:

 

ir.jpg

 

 

I de fleste Arduino-eksemplene må man sette hvilken pin (i tillegg til GND/jord) som brukes til sending. Der står GPI04 som regel som standard,  og selv om GPI04 er det samme som "D2" på ESP8266, fikk ihvertfall ikke jeg det til å funke før jeg endra variabelen fra "4" til "D2". Leste at det kunne være utslagsgivende i en eller annen ESP8266 FAQ på Github, husker ikke helt hvor. På den annen side har jeg brukt både D2/D3 etc og GPIO-numrene om hverandre i flere andre script som har funka fint, så jeg tipper årsaken er at folk ikke har vært konsekvente med navngivingen, og hard-coda inn ulike referansenavn her og der.

 

Puh, altfor lang forklaring, men det kan jo hende noen får noe ut av det. Uansett - her er eksemplet som funka hos meg.

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>

const uint16_t kIrLed = D2;  // ESP8266 GPIO pin to use. Recommended: 4 (D2).

IRsend irsend(kIrLed);  // Set the GPIO to be used to sending the message.

// Example of data captured by IRrecvDumpV2.ino
uint16_t rawData[67] = {9000, 4500, 650, 550, 650, 1650, 600, 550, 650, 550,
                        600, 1650, 650, 550, 600, 1650, 650, 1650, 650, 1650,
                        600, 550, 650, 1650, 650, 1650, 650, 550, 600, 1650,
                        650, 1650, 650, 550, 650, 550, 650, 1650, 650, 550,
                        650, 550, 650, 550, 600, 550, 650, 550, 650, 550,
                        650, 1650, 600, 550, 650, 1650, 650, 1650, 650, 1650,
                        650, 1650, 650, 1650, 650, 1650, 600};
// Example Samsung A/C state captured from IRrecvDumpV2.ino
uint8_t samsungState[kSamsungAcStateLength] = {
    0x02, 0x92, 0x0F, 0x00, 0x00, 0x00, 0xF0,
    0x01, 0xE2, 0xFE, 0x71, 0x40, 0x11, 0xF0};

void setup() {
  irsend.begin();
#if ESP8266
  Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
#else  // ESP8266
  Serial.begin(115200, SERIAL_8N1);
#endif  // ESP8266
}

void loop() {
  Serial.println("NEC");
  irsend.sendNEC(0x00FFE01FUL);
  delay(2000);
  Serial.println("Sony");
  irsend.sendSony(0xa90, 12, 2);  // 12 bits & 2 repeats
  delay(2000);
  Serial.println("a rawData capture from IRrecvDumpV2");
  irsend.sendRaw(rawData, 67, 38);  // Send a raw data capture at 38kHz.
  delay(2000);
  Serial.println("a Samsung A/C state from IRrecvDumpV2");
  irsend.sendSamsungAC(samsungState);
  delay(2000);
}

 

Jeg så forresten at det lå en annen eksempelfil tilgjengelig for Arduino, som konverterer ir-koder mellom de ulike protokollene (som man også kan gjøre her:  http://irdb.tk/convert/).

 

 

Hilsen Andreas

 

IoT-entusiast, Programmerer, webutvikler, musikkprodusent og mye mer

atchoo.netfredloes.no • atchoo.net/dev/telldus/blink1

Endret av Atchoo
  • Like 1
Lenke til kommentar
Del på andre sider

På 3.5.2017 den 8.37, ZoRaC skrev:

 

Hvilken sensor bruker du?

Jeg har prøvd 2 forskjellige og til og med koblet vekk NodeMCU og satt inn resistor+diode og får likevel ikke lys i dioden... :( Begge IR-sensorene er 38 KHz.

 

Innser at dette er er et gammelt innlegg, men det slo meg bare at det kan være lurt å bruke en diode med farge mens man tester. Da slipper man omveien rundt kamera eller evt. andre IR-mottakere , og minsker antall potensielle feilkilder.

Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.