Até onde sei todos os aparelhos da GVT usam o mesmo controle remoto e a VIVO ao comprar a GVT só mudou o nome.
Protocolo RC6 de 36 bits
O quinto byte alterna (é um protocolo Philips) entre “A” (00001010) e “2” (00000010)
|
Este controle tem uma particularidade. As rotinas de leitura da biblioteca IRremoteESP8266 interpretam sem problemas os comandos acima, mas se você usar esses comandos com a função sendRC6 da mesma biblioteca, o receptor da GVT ignora completamente. A mesma biblioteca mostra que o que ela está transmitindo não bate com o remoto original. Se você transmitir com 36 bits é completamente diferente. Se transmitir como 32 bits o código decodificado confere, mas há uma diferença.
Analisando bit por bit eu identifiquei essa diferença. É assim a forma real do código da tecla “zero”:
O zero em preto é o start bit do protocolo RC6. Tudo depois dele (10000000011100000010011000000000) já é o código para a tecla zero (80702600 em binário).
Os quatro bits que antecedem o start bit (1110) não existem no protocolo RC6 como definido pela biblioteca.
E criei uma nova função que chamei de sendRC6gvt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
void ICACHE_FLASH_ATTR IRsend::sendRC6gvt(unsigned long data, int nbits) { // Set IR carrier frequency enableIROut(36); // Header mark(RC6_HDR_MARK); //header space(RC6_HDR_SPACE); mark(RC6_T1); space(RC6_T1); mark(RC6_T1); space(RC6_T1); mark(RC6_T1); space(RC6_T1); space(RC6_T1); mark(RC6_T1); space(2*RC6_T1); //trailer bits mark(2*RC6_T1); int t; // Data for (unsigned long i = 0, mask = 1UL << (nbits - 1); mask; i++, mask >>= 1) { // The fourth bit we send is a "double width trailer bit". t = RC6_T1; if (data & mask) { // 1 mark(t); space(t); } else { // 0 space(t); mark(t); } } // Footer ledOff(); } |
Eu acrescentei essa rotina ao arquivo IRremoteESP8266.cpp e a chamada para ela em IRremoteESP8266.h. Eu estou usando a versão 1.x. Se você estiver usando a versão 2.x vai precisar fazer algumas mudanças.
Note que você deve chamar essa rotina alternativa dizendo que o código é de 32bits e não de 36. Os outros 4 bits, do cabeçalho, minha rotina transmite “por fora”.
Relendo hoje essa explicação, quase três anos depois, percebi que falhei ao tentar explicar o que há de diferente. Nem eu consegui entender. Precisei olhar meu arquivo editado IRremoteESP8266.cpp.
A diferença é que o comando SendRC6 original manda um header seguido de um start bit. O remoto GVT/Vivo entre o header e o start bit manda mais quatro bits.
RC6
mark(RC6_HDR_MARK); //header
space(RC6_HDR_SPACE);
space(2*RC6_T1); //Start bit
mark(2*RC6_T1);
GVT/VIVO
mark(RC6_HDR_MARK); //header
space(RC6_HDR_SPACE);
mark(RC6_T1);
space(RC6_T1);
mark(RC6_T1);
space(RC6_T1);
mark(RC6_T1);
space(RC6_T1);
space(RC6_T1);
mark(RC6_T1);
space(2*RC6_T1); //start bit
mark(2*RC6_T1);
Eu fiz um pequeno acréscimo ao texto que deve ajudar.