Gå til innhold
  • Bli medlem
xibriz

Hvordan kopiere/sniffe IR

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?

 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Gi gjerne lyd om du finner ut hvordan du får ESPen til å motta IR-signal. Jeg har strevd med det i noen uker nå, prøvd to forskjellige typer IR-sensorer også. 

Del dette innlegget


Lenke til innlegg
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

Del dette innlegget


Lenke til innlegg
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.

Del dette innlegget


Lenke til innlegg
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?

Del dette innlegget


Lenke til innlegg
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. 

Del dette innlegget


Lenke til innlegg
Del på andre sider
8 timer siden, Lazarus skrev:

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

 

Hvilken motstand bruker du på R1?

Del dette innlegget


Lenke til innlegg
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.

 

Del dette innlegget


Lenke til innlegg
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

Del dette innlegget


Lenke til innlegg
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

Del dette innlegget


Lenke til innlegg
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...

Del dette innlegget


Lenke til innlegg
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

 

 

 

Del dette innlegget


Lenke til innlegg
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

Del dette innlegget


Lenke til innlegg
Del på andre sider

@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?  

Del dette innlegget


Lenke til innlegg
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.

Del dette innlegget


Lenke til innlegg
Del på andre sider

Jeg har forresten gått bort fra espEasy hvis du er interessert i noe ren Arduino-kode.

Del dette innlegget


Lenke til innlegg
Del på andre sider
3 timer siden, xibriz skrev:

Jeg har forresten gått bort fra espEasy hvis du er interessert i noe ren Arduino-kode.

 

Ja takk :)

Del dette innlegget


Lenke til innlegg
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

Del dette innlegget


Lenke til innlegg
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

Del dette innlegget


Lenke til innlegg
Del på andre sider

Jeg bruker GPIO pinnene med 3-4 meter kabel (2 ledere i en cat6). Ingen problem. Rekkevidden på signalet er minst 2 meter. Husker ikke om jeg brukte en motstand. 

Del dette innlegget


Lenke til innlegg
Del på andre sider

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå

×