xibriz Skrevet 3. mai 2017 Skrevet 3. mai 2017 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? Siter
ZoRaC Skrevet 3. mai 2017 Skrevet 3. mai 2017 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å. Siter
Lazarus Skrevet 3. mai 2017 Skrevet 3. mai 2017 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. ? 1 Siter
ZoRaC Skrevet 3. mai 2017 Skrevet 3. mai 2017 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. 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. Siter
Lazarus Skrevet 3. mai 2017 Skrevet 3. mai 2017 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? Siter
Lazarus Skrevet 3. mai 2017 Skrevet 3. mai 2017 Rotet sammen et koblingsskjema.. får håpe det gir mening. :-) 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. Siter
xibriz Skrevet 4. mai 2017 Forfatter Skrevet 4. mai 2017 8 timer siden, Lazarus skrev: Rotet sammen et koblingsskjema.. får håpe det gir mening. :-) Hvilken motstand bruker du på R1? Siter
Lazarus Skrevet 4. mai 2017 Skrevet 4. mai 2017 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. Siter
xibriz Skrevet 4. mai 2017 Forfatter Skrevet 4. mai 2017 (endret) 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 Endret 4. mai 2017 av xibriz Siter
xibriz Skrevet 5. mai 2017 Forfatter Skrevet 5. mai 2017 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. 1 Siter
ZoRaC Skrevet 7. mai 2017 Skrevet 7. mai 2017 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... Siter
Merko Skrevet 7. mai 2017 Skrevet 7. mai 2017 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! 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: og den eldre modellen Siter
ZoRaC Skrevet 7. mai 2017 Skrevet 7. mai 2017 1 time siden, Merko skrev: Hvilken canal digital tuner er det du har? 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. Siter
Merko Skrevet 7. mai 2017 Skrevet 7. mai 2017 (endret) 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" Endret 7. mai 2017 av Merko Siter
Marius Skrevet 10. april 2018 Skrevet 10. april 2018 @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? Siter
xibriz Skrevet 10. april 2018 Forfatter Skrevet 10. april 2018 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. Siter
xibriz Skrevet 10. april 2018 Forfatter Skrevet 10. april 2018 Jeg har forresten gått bort fra espEasy hvis du er interessert i noe ren Arduino-kode. Siter
Marius Skrevet 10. april 2018 Skrevet 10. april 2018 3 timer siden, xibriz skrev: Jeg har forresten gått bort fra espEasy hvis du er interessert i noe ren Arduino-kode. Ja takk Siter
xibriz Skrevet 13. april 2018 Forfatter Skrevet 13. april 2018 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); } 1 Siter
Marius Skrevet 14. april 2018 Skrevet 14. april 2018 (endret) @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 14. april 2018 av Marius Siter
xibriz Skrevet 15. april 2018 Forfatter Skrevet 15. april 2018 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. Siter
Atchoo Skrevet 26. august 2019 Skrevet 26. august 2019 (endret) Jeg gjorde det sånn her: 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.net • fredloes.no • atchoo.net/dev/telldus/blink1 Endret 26. august 2019 av Atchoo 1 Siter
Atchoo Skrevet 27. august 2019 Skrevet 27. august 2019 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. Siter
Anbefalte innlegg
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.