[SOLVED] Decodifica IR per condizionatori (ancora dubbi)

Salve a tutti,
da anni uso un arduino come ripetitore di un telecomando TV, che funziona alla grande.
La teoria della codifica/decodifica dei segnali IR mi è chiara, ma quando ho provato a fare reverse - engineering per comandare anche il nuovo condizionatore con lo stesso arduino + led IR, mi trovo in difficoltà a causa della lunghezza del codice da ripetere.

La situazione reale è questa:

Il clima è un Toshiba.

Ho caricato lo shetch della libreria IRremote IRrecvDumpV2.ino.
Ho dovuto modificare la grandezza di RAWBUF da 101 l'ho portata a 201 perchè l'impulso dura circa 150 millisecondi, come da istruzioni per catturare tutto il treno.

Qui la prima stranezza. La decodifica riconosciuta è SAMSUNG e non TOSHIBA, qualcuno sa perchè?

I Raw data vengono visualizzati correttamente ma io vorrei usare i codici esadecimali per comodità. il problema è che il codice esadecimale è lungo 144 bit almeno ma la serial monitor, mi fa vedere solo 32 bit al massimo e il mio codice che dovrebbe essere una cosa tipo:

F2 0D 03 FC 01 00 40 00 41 F2 0D 03 FC 01 00 40 00 41 (in realtà è un treno da 72 bit ripetuto 2 volte)
viene invece tagliato così
F2 0D 03 FC

Questo problema del limite di bit credo che sussista anche sulla fase di IR SEND e volevo capire se esiste un bypass del problema.

Ho trovato tutta la spiegazione della decodifica Toshiba che corrisponde alle mie esigenze QUI (Grazie Mattia)

La mia domanda è, come posso fare per catturare e inviare tutta la stringa esadecimale correttamente (visto che non vorrei usare i raw). Esiste un modo per forzare la libreria Arduino-IRremote a inviare più di 32 bit??

Grazie mille,
Saluti.

Che la codifica riconosciuta sia SAMSUNG e non TOSHIBA è anche possibile (dicci marca e modello del condizionatore e/o del telecomando), non me ne preoccuperei. Ma non ho capito bene cosa intendi, ossia perché parli dei codici RAW (che non vorresti usare) se la IRremote ti ha riconosciuto la codifica?

Facci vedere l'output di IRrecvDumpV2 quando premi un pulsante (premilo due volte per sicurezza e verificare se il codice sia sempre lo stesso o alternato) e posta qui l'output.

Ciao docdoc,
il clima è un TOSHIBA SERIE SEIYA RASB10J2KVGINT
sul telecomando è scritto WH-UC01NE

questo è l'output della seriale per la sequenza che ho schiacciato, ovvero; ON ; TEMPERATURA +

come vedi il "Code" è sempre lo stesso, secondo me è perchè viene tagliato a 32 bit, quando in realtà ne contiene 72 x 2 = 144. Il blog di mattia me lo conferma perchè la codifica è la stessa

Code      : F5AD0EC0 (32 bits)
Encoding  : SAMSUNG
Code      : F20D03FC (32 bits)
Timing[147]: 
     +4400, -4350     + 550, -1600     + 550, -1600     + 550, -1600
     + 550, -1550     + 600, - 500     + 550, - 500     + 600, -1550
     + 600, - 500     + 550, - 500     + 600, - 500     + 550, - 500
     + 550, - 550     + 550, -1550     + 600, -1550     + 600, - 500
     + 550, -1600     + 550, - 500     + 600, - 500     + 550, - 500
     + 600, - 500     + 550, - 500     + 550, - 550     + 550, -1550
     + 600, -1550     + 600, -1550     + 600, -1550     + 600, -1550
     + 600, -1550     + 550, -1600     + 550, -1600     + 550, - 500
     + 600, - 500     + 550, - 500     + 600, - 500     + 550, - 500
     + 600, - 500     + 550, - 500     + 600, - 500     + 550, - 500
     + 550, -1600     + 550, - 500     + 600, -1550     + 600, -1550
     + 600, -1550     + 600, - 500     + 550, - 500     + 600, - 500
     + 550, - 500     + 550, - 550     + 550, - 500     + 550, - 500
     + 600, - 500     + 550, - 500     + 600, - 500     + 550, -1600
     + 550, - 500     + 600, - 500     + 550, - 500     + 600, - 500
     + 550, - 500     + 550, - 550     + 550, - 500     + 550, - 500
     + 600, - 500     + 550, - 500     + 600, -1550     + 600, -1550
     + 600, -1550     + 600, - 500     + 550, - 500     + 550, -1600
     + 550, -1600     + 550
unsigned int  rawData[147] = {4400,4350, 550,1600, 550,1600, 550,1600, 550,1550, 600,500, 550,500, 600,1550, 600,500, 550,500, 600,500, 550,500, 550,550, 550,1550, 600,1550, 600,500, 550,1600, 550,500, 600,500, 550,500, 600,500, 550,500, 550,550, 550,1550, 600,1550, 600,1550, 600,1550, 600,1550, 600,1550, 550,1600, 550,1600, 550,500, 600,500, 550,500, 600,500, 550,500, 600,500, 550,500, 600,500, 550,500, 550,1600, 550,500, 600,1550, 600,1550, 600,1550, 600,500, 550,500, 600,500, 550,500, 550,550, 550,500, 550,500, 600,500, 550,500, 600,500, 550,1600, 550,500, 600,500, 550,500, 600,500, 550,500, 550,550, 550,500, 550,500, 600,500, 550,500, 600,1550, 600,1550, 600,1550, 600,500, 550,500, 550,1600, 550,1600, 550};  // SAMSUNG F20D03FC
unsigned int  data = 0xF20D03FC;

Encoding  : SAMSUNG
Code      : F20D03FC (32 bits)
Timing[147]: 
     +4350, -4350     + 550, -1600     + 550, -1600     + 550, -1600
     + 550, -1600     + 550, - 500     + 550, - 500     + 600, -1550
     + 600, - 500     + 550, - 500     + 600, - 500     + 550, - 500
     + 600, - 500     + 550, -1600     + 550, -1600     + 550, - 500
     + 550, -1600     + 550, - 500     + 600, - 500     + 550, - 500
     + 600, - 500     + 550, - 500     + 600, - 500     + 550, -1600
     + 550, -1600     + 550, -1550     + 600, -1550     + 600, -1550
     + 600, -1550     + 600, -1550     + 600, -1550     + 550, - 550
     + 550, - 500     + 550, - 500     + 600, - 500     + 550, - 500
     + 600, - 500     + 550, - 500     + 600, - 500     + 550, - 500
     + 600, -1550     + 550, -1600     + 550, - 550     + 550, - 500
     + 550, - 500     + 600, - 500     + 550, - 500     + 600, - 500
     + 550, - 500     + 600, - 500     + 550, - 500     + 600, - 500
     + 550, - 500     + 600, - 500     + 550, - 500     + 550, -1600
     + 550, - 500     + 600, - 500     + 550, - 500     + 600, - 500
     + 550, - 500     + 600, - 500     + 550, - 500     + 600, - 500
     + 550, - 500     + 600, -1550     + 550, - 550     + 550, - 500
     + 550, - 500     + 600, - 500     + 550, - 500     + 600, -1550
     + 600, -1550     + 600
unsigned int  rawData[147] = {4350,4350, 550,1600, 550,1600, 550,1600, 550,1600, 550,500, 550,500, 600,1550, 600,500, 550,500, 600,500, 550,500, 600,500, 550,1600, 550,1600, 550,500, 550,1600, 550,500, 600,500, 550,500, 600,500, 550,500, 600,500, 550,1600, 550,1600, 550,1550, 600,1550, 600,1550, 600,1550, 600,1550, 600,1550, 550,550, 550,500, 550,500, 600,500, 550,500, 600,500, 550,500, 600,500, 550,500, 600,1550, 550,1600, 550,550, 550,500, 550,500, 600,500, 550,500, 600,500, 550,500, 600,500, 550,500, 600,500, 550,500, 600,500, 550,500, 550,1600, 550,500, 600,500, 550,500, 600,500, 550,500, 600,500, 550,500, 600,500, 550,500, 600,1550, 550,550, 550,500, 550,500, 600,500, 550,500, 600,1550, 600,1550, 600};  // SAMSUNG F20D03FC
unsigned int  data = 0xF20D03FC;

Io vorrei usare il codice esadecimale come faccio per il telecomando del televisore e non il RAW.

Qui l'esempio del mio telecomando schiacciando Vol+:

Encoding  : RC6
Encoding  : RC6
Code      : 10020 (20 bits)
Timing[39]: 
     +2600, - 900     + 450, - 900     + 400, - 450     + 450, - 450
     +1300, -1350     + 400, - 450     + 450, - 450     + 450, - 450
     + 400, - 450     + 450, - 450     + 400, - 450     + 450, - 450
     + 450, - 450     + 450, - 450     + 850, - 900     + 400, - 450
     + 450, - 450     + 450, - 450     + 400, - 450     + 450
unsigned int  rawData[39] = {2600,900, 450,900, 400,450, 450,450, 1300,1350, 400,450, 450,450, 450,450, 400,450, 450,450, 400,450, 450,450, 450,450, 450,450, 850,900, 400,450, 450,450, 450,450, 400,450, 450};  // RC6 10020
unsigned int  data = 0x10020;

Arduino mi funziona benissimo con il comando

irsend.sendRC6 (0x10020, 20);

che però contiene solo 20 bit. E tutti i pulsanti danno un output diverso in termini di codice esadecimale....

Avevo avuto lo stesso problema e ho dovuto, se la mia memoria non mi tradisce, modificare la libreria perché legga tutto il codice.

P.S. sono andato a vedere la libreria irremote e mi sembra che ho modificato questa linea

#define RAWBUF  300  // Maximum length of raw duration buffer

nel file IRremoteint.h.
Da verificare!

Ciao savoriano,
l'aumento del RAWBUF l'ho fatto, da 100 a 200 (prima mi dava un messaggio sulla seriale di errore)
Facendo questo sono in grado di catturare tutto il RAW perchè il receiver resta in "ascolto" abbastanza tempo, OK, ma il mio problema è con il codice Hex. Questa libreria (nativamente) per la decodifica samsung gestisce 32 bit, a me ne servono di più da inviare e ricevere e non so dove modificare (anche se ci sto smanettando)

La sola modifica da te indicata non è sufficiente allo scopo. Grazie comunque!

Muplex:
viene tagliato a 32 bit, quando in realtà ne contiene 72 x 2 = 144.

Credo allora che tu non possa ottenere alcun "codice" unico per ogni tasto, dovrai lavorare con i RAW e per farlo decentemente potresti acquistare AnalysIR: io a suo tempo lo feci per un problema con i codici del MySkyHD, sono pochi Euro ma ti assicuro che se devi fare cose con i segnali ad infrarossi è l'unico strumento che ti può risolvere i problemi!

Oppure fai quello che dice di aver fatto in quel blog, ossia passa a quella libreria HVAC-IR-Control: non l'avevo mai sentita ma se l'ha modificata per includere quel protocollo, credo che "per il principio di Maometto" fai prima tu ad adattarti a quello che fare il contrario e sperare di infilare quella codifica nella IRremote. :wink:

PS ma tu quando dici che hai fatto un "ripetitore di telecomando" cosa intendi esattamente? Ossia, in che modo lo usi e come "ripete" il segnale?

Grazie doc, forse, pur non volendolo fare, userò i RAW code.

Allora il mio telecomando lo ripeto tramite la mia home automation basata su OPENHAB.

La scheda collegata al led IR è una LOLIN nodemcu che è collegata alla rete tramite wifi.
In salotto ho il Raspberry che fa da "HOST" di Openhab e tutto passa da li.
Il protocollo di comunicazione da me scelto è stato MQTT

Se perdo il telecomando (come succede spesso causa i bimbi che lo tirano di qua e di la) ho sempre la possibilità di cambiare o spegnere con il mio cellulare.

CELLULARE --> OPENHAB ---> LOLIN che comanda l'IR a seconda della stringa che gli arriva in MQTT nel topic apposito.

Mi trovo benissimo con Openhab (l'alternativa è HomeAssistant) e sto facendo cose davvero complicate a livello di domotica!

Muplex:
Allora il mio telecomando lo ripeto tramite la mia home automation basata su OPENHAB.

Interessante, ma non ho capito se semplicemente ti basta un ripetitore (eventualmente comandabile da smartphone) o se ci fai anche altro integrandolo nella domotica.

Dico questo perché io ho realizzato un sistemino che, con due WeMos D1, riporto al MySkyHD della sala i tasti del telecomando della cucina, e magari c'è qualcosa di ciò che ho fatto che potrebbe esserti utile.

Provo a spiegarmi. Rispetto a progetti simili è relativamente semplice (anche perché non uso affatto MQTT) ha secondo me un insieme di caratteristiche peculiari interessanti:

  1. si collegano in WiFi ossia possono essere configurati o per collegarsi entrambi alla stessa WiFi di casa, oppure tramite connessione diretta (quello in sala fa da Access Point con SSID non visibile, quello in cucina è il suo client) cosa che potrebbe essere utile se uno dei due è in qualche posto con poco segnale;

  2. ciò che viaggia in rete sono semplicissimi pacchetti UDP su una specifica porta (tra l'altro in broadcast per cui non è neanche necessario conoscere l'indirizzo IP del server) e che contiene un byte che indica l'ID del server (per eventuali estensioni future) ed il solo byte identificativo numerico del tasto, quindi non replica l'intero segnale codificato: il Wemos della cucina "riconosce" il tasto premuto e manda via UDP al server in sala solamente il byte identificativo (secondo una codifica che ho creato io) il quale a sua volta, utilizzando la sua tabella dei codici IR del MySkyHD, invia il segnale IR corretto al ricevitore Sky;

  3. grazie al punto precedente, non è neanche necessario che il telecomando della cucina sia un telecomando Sky: nel mio caso uso un normale telecomando con codifica Sony (ovviamente a patto che abbia almeno gli stessi tasti come menu, info, play, pause, tasti rosso, giallo, eccetera, che ho rimappato con quelli Sky)

  4. Trattandosi di semplici pacchetti UDP, su smartphone basta un programmino molto stupido fatto anche con il MIT AppInventor2 in quanto alla pressione di un pulsante virtuale sullo schermo deve semplicemente mandare un opportuno pacchetto UDP.

Fammi sapere invece come hai tu implementato la cosa, magari scambiando le esperienze ognuno può migliorare il proprio progettino :wink:

Molto interessante il tuo progetto.
È quello che pensavo di fare inizialmente per la domotica però la comodità del hub è avere TUTTO e dico tutto nello stesso posto e integrabile con alexa o google home. È più facile da gestire piuttosto che programmare anche l'interfaccia grafica

Ciao Raga,
ho trovato la soluzione e come sempre la posto a completamento del Thread.

La soluzione è usare le librerie IRremote8266
E' un branch di quella normale ma è pensata per i condizionatori. Ha dei metodi che non sono previsti nella IRremote standard e molti brand di condizionatori decodificati

Nel mio caso, sperimentando su un arduino UNO ma dovendo mettere il progetto su una LOLIN, cade a fagiuolo la scoperta =)

Spero possa essere utile

Muplex:
La soluzione è usare le librerie IRremote8266

Argh, dovevo immaginarlo (tra l'altro non l'avevi detto all'inizio): su WeMos D1 anche io uso esattamente quella infatti... (che funziona benissimo e comunque non è "pensata per i condizionatori" ma è che "ha già implementate varie codifiche anche per i condizionatori" rispetto a quella standard di shirriff...)