Crea sito

Come comandare il condizionatore di casa con Arduino, anche da remoto !

image_pdfimage_print

Arduino permette davvero di fare tantissime cose riguardo all’Internet of things, basta avere un po’ di voglia e intuizione, per realizzare qualsiasi tipo di progetto.

In questo post vedremo come comandare da remoto il proprio condizionatore di casa, attraverso Arduino, che è connesso ad Internet. Si avete proprio letto bene !

 

condizionatore

 

Requisiti hardware

 

  • 1 x Arduino Uno + 1 x Arduino Mega oppure 2 x Arduino Uno
  • Ricevitore ad infrarossi TSOP1738 images
  • IR Led
  • 1 x Resistenza da 330 Ohm
  • Qualche cavo flessibile

 

Requisiti software

 

 

Come funziona il sistema ?

 

Come molti sapranno, il meccanismo di regolazione delle varie impostazioni tra utente e condizionatore, avviene attraverso un telecomando, che è basato sull’invio di segnali ad infrarosso. Per approfondire il funzionamento di questi segnali, vi consiglio di guardare il post in riferimento al Capitolo 10 di Arduino progettare diventa semplice.

Ovviamente, i codici di un condizionatore, variano in base al modello e in base al costruttore. Per questo motivo, come prima fase dal lavoro, è necessario fare il procedimento che prende il nome di reverse engineering, ovvero di ottenere i codici per il proprio dispositivo, sfruttando il trasduttore TSOP1738.

Una volta che sono stati ottenuti i codici per il proprio condizionatore, ci siamo quasi a completare “l’opera”. Occorre utilizzare un piccolo programma che semplifichi l’impostazione del codice da inserire in Arduino e sarà possibile inviare le varie codifiche. Queste codifiche potranno essere impostate dall’utente, attraverso una semplice pagina web, con o senza protezione.

Come avete potuto leggere nella sezione “requisiti hardware”, ho scritto che sono necessari due Arduino; il motivo principale è quello che le sequenze di bit da inviare al condizionatori occupano troppo spazio per poter essere contenute in un solo dispositivo, che tra l’altro dovrà occuparsi anche della parte di gestione dei comandi che verranno trasmessi via Internet.

In pratica ci sarà un dispositivo che si preoccuperà della parte webserver e l’altro di inviare i segnali IR. L’altro motivo che mi ha spinto a realizzare questo progetto con due dispositivo, è che si può utilizzare tranquillamente Raspberry PI per la gestione del webserver, in modo da migliorare sicuramente l’aspetto grafico della pagina web.

 

Come impostare i vari dati

 

Come specificato nelle righe precedenti, è necessario ottenere le codifiche del nostro telecomando, per poterle ritrasmettere da Arduino. Per farlo faremo uso della libreria IRemote per Arduino, in particolare di questo codice:

 

12345

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

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

/** Modified by Chris Targett* Now includes more protocols* Novemeber 2011

 

* IRremote: IRrecvDump – dump details of IR codes with IRrecv

* An IR detector/demodulator must be connected to the input RECV_PIN.

* Version 0.1 July, 2009

* Copyright 2009 Ken Shirriff

* http://arcfn.com

*

* Modified by Chris Targett to speed up the process of collecting

* IR (HEX and DEC) codes from a remote (to put into and .h file)

*

*/

 

#include <IRremote.h>

 

int RECV_PIN = 11;

 

IRrecv irrecv(RECV_PIN);

 

decode_results results;

 

void setup()

{

Serial.begin(9600);

irrecv.enableIRIn(); // Start the receiver

}

 

// Dumps out the decode_results structure.

// Call this after IRrecv::decode()

// void * to work around compiler issue

//void dump(void *v) {

//  decode_results *results = (decode_results *)v

void dump(decode_results *results) {

int count = results->rawlen;

if (results->decode_type == UNKNOWN) {

Serial.print(“Unknown encoding: “);

}

else if (results->decode_type == NEC) {

Serial.print(“Decoded NEC: “);

}

else if (results->decode_type == SONY) {

Serial.print(“Decoded SONY: “);

}

else if (results->decode_type == RC5) {

Serial.print(“Decoded RC5: “);

}

else if (results->decode_type == RC6) {

Serial.print(“Decoded RC6: “);

}

else if (results->decode_type == SAMSUNG) {

Serial.print(“Decoded SAMSUNG: “);

}

else if (results->decode_type == JVC) {

Serial.print(“Decoded JVC: “);

}

else if (results->decode_type == PANASONIC) {

Serial.print(“Decoded Panasonic: “);

}

Serial.print(results->value, HEX);

Serial.print(“(“);

Serial.print(results->bits, DEC);

Serial.println(” bits)”);

Serial.print(“#define Something_DEC “);

Serial.println(results->value, DEC);

Serial.print(“#define Something_HEX “);

Serial.println(results->value, HEX);

Serial.print(“Raw (“);

Serial.print(count, DEC);

Serial.print(“): “);

for (int i = 0; i < count; i++) {

if ((i % 2) == 1) {

Serial.print(results->rawbuf[i]*USECPERTICK, DEC);

}

else {

Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);

}

Serial.print(” “);

}

Serial.println(“”);

}

 

void loop() {

if (irrecv.decode(&results)) {

dump(&results);

irrecv.resume(); // Receive the next value

}

}

 

Il collegamento è riportato nell’immagine qui sottostante:

ir_receiver_sender_bb

Dopo aver caricato il codice su Arduino, dovremmo premere i vari pulsanti presenti sul telecomando e copiare da qualche parte i risultati mostrati dal seriale.

Nel mio caso, ho ottenuto la seguente sequenza di codifiche:

Accensione 20 C° Caldo

Raw (150): -5320 3000 -3000 3000 -4400 550 -1600 600 -550 550 -1650 550 -550 550 -550 550 -1650 550 -550 550 -1650 500 -550 550 -1650 550 -550 550 -500 600 -500 600 -550 550 -550 550 -1650 500 -550 550 -600 500 -1700 500 -550 550 -550 550 -550 550 -600 500 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -1650 500 -1650 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -500 550 -550 550 -1700 500 -1650 550 -550 550 -500 600 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 500 -1700 500 -550 550 -550 550 -550 550 -550 550 -550 550 -600 500 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -500 550 -1700 500 -550 550 -550 550 -550 550 -1650 550

 

Spegnimento

Raw (150): -3276 3100 -2900 2950 -4400 700 -1500 700 -400 700 -1500 700 -400 650 -450 550 -1650 550 -550 650 -1500 600 -500 600 -1600 600 -500 600 -500 600 -450 650 -450 600 -550 550 -550 550 -550 550 -600 500 -1600 600 -500 600 -500 600 -550 550 -500 600 -500 600 -550 550 -550 550 -1600 600 -500 600 -500 600 -500 550 -1650 550 -1600 600 -500 600 -500 600 -550 550 -550 550 -1600 600 -1600 550 -550 550 -550 550 -1650 550 -1600 600 -550 550 -500 600 -500 600 -550 550 -550 550 -500 600 -500 600 -1600 600 -1600 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -500 600 -550 550 -550 550 -500 600 -500 600 -500 600 -1600 600 -500 600 -1600 550 -550 550 -1600 600 -550 550 -550 550

 

Accensione 23 C° Freddo 2 FAN

Raw (150): -16044 3050 -3000 3000 -4400 550 -1600 600 -550 550 -1650 550 -550 550 -550 550 -1650 550 -500 600 -1600 550 -550 550 -1650 550 -1650 550 -1650 550 -550 550 -550 550 -500 600 -1600 550 -550 550 -550 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -500 600 -1650 500 -550 550 -600 500 -1700 500 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -550 550 -500 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1600 600 -550 550

 

Accensione 20 C° Caldo e Swing

Raw (150): 18566 3000 -3000 3000 -4400 550 -1650 550 -500 600 -1600 600 -500 600 -500 600 -1600 550 -550 550 -1650 550 -500 600 -1600 600 -550 550 -550 550 -550 550 -1600 600 -500 600 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -550 550 -1600 550 -550 550 -600 500 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -550 550 -550 550 -1600 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -550 550 -550 550 -550 550 -550 500 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -1650 500 -1650 550 -550 550 -1700 500

 

Accensione 23 C° Freddo 2 FAN e Swing

Raw (150): 2084 2950 -3050 2950 -4400 550 -1600 600 -550 550 -1650 550 -550 550 -550 550 -1600 600 -500 600 -1600 550 -500 600 -1650 550 -1650 550 -1600 600 -500 600 -1600 600 -500 600 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -500 600 -550 550 -500 600 -1650 550 -550 550 -1600 600 -500 600 -1600 550 -1600 600 -500 600 -500 600 -550 550 -500 600 -1650 550 -1600 600 -500 600 -500 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -500 600 -500 600 -500 600 -500 600 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -1600 600 -1600 550 -550 600 -500 550 -550 550 -550 550

 

 

Come riportato nella libreria IRemote, per poter ritrasmettere questi dati, occorre effettuare alcune modifiche; in particolare occorre sostituire i segni meno, eliminare il primo valore e porre, tra i vari valori, una virgola, dal momento che nel codice di Arduino, verranno inseriti in un vettore di interi.

Per facilitare questa operazione, ho realizzato un piccolo programma in Java, in grado di fare queste operazioni in automatico:

Anche questo programma, è disponibile nella repo di Github e si chiama AcToolArduino. In questa prima versione, il programma automatizza la procedura, inserendo i dati nella TextField. Nella prossima versione, sarà possibile caricare da file, i risultati ottenuti dal seriale di Arduino.

Attraverso il prossimo programma, potremo verificare il corretto funzionamento dell’invio di segnali IR da Arduino:

 

Tool

#include "IRremote.h"

IRsend irsend;

void setup()

{

Serial.begin(9600);

}

int khz=38; //NB Change this default value as neccessary to the correct modulation frequency

// ON and 2O C° with 1 FAN heat

unsigned heat[] = {3000,3000,3000,4400,550,1600,600,550,550,1650,550,550,550,550,550,1650,550,550,550,1650,500,550,550,1650,550,550,550,500,600,500,600,550,550,550,550,1650,500,550,550,600,500,1700,500,550,550,550,550,550,550,600,500,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,500,1650,550,1650,550,550,550,550,550,550,550,550,550,1650,550,1650,550,500,550,550,550,1700,500,1650,550,550,550,500,600,550,550,550,550,550,550,550,550,550,550,1650,500,1700,500,550,550,550,550,550,550,550,550,550,550,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,500,550,1700,500,550,550,550,550,550,550,1650,550};

// OFF the A/C

unsigned OFF[] = {3100,2900,2950,4400,700,1500,700,400,700,1500,700,400,650,450,550,1650,550,550,650,1500,600,500,600,1600,600,500,600,500,600,450,650,450,600,550,550,550,550,550,550,600,500,1600,600,500,600,500,600,550,550,500,600,500,600,550,550,550,550,1600,600,500,600,500,600,500,550,1650,550,1600,600,500,600,500,600,550,550,550,550,1600,600,1600,550,550,550,550,550,1650,550,1600,600,550,550,500,600,500,600,550,550,550,550,500,600,500,600,1600,600,1600,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,500,600,550,550,550,550,500,600,500,600,500,600,1600,600,500,600,1600,550,550,550,1600,600,550,550,550,550};

// ON and 23° with 2 FAN cold

unsigned cold[] = {3050,3000,3000,4400,550,1600,600,550,550,1650,550,550,550,550,550,1650,550,500,600,1600,550,550,550,1650,550,1650,550,1650,550,550,550,550,550,500,600,1600,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,500,600,1650,500,550,550,600,500,1700,500,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,550,550,500,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1600,600,550,550};

// ON and 20 C° with 1 FAN heat and SWING

unsigned heat_with_swing[] = {3000,3000,3000,4400,550,1650,550,500,600,1600,600,500,600,500,600,1600,550,550,550,1650,550,500,600,1600,600,550,550,550,550,550,550,1600,600,500,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,1600,550,550,550,600,500,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,550,550,550,550,1600,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,550,550,550,550,550,550,550,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,500,1650,550,550,550,1700,500};

// ON and 23° with 2 FAN cold and SWING

unsigned cold_with_sqwing[] = {2950,3050,2950,4400,550,1600,600,550,550,1650,550,550,550,550,550,1600,600,500,600,1600,550,500,600,1650,550,1650,550,1600,600,500,600,1600,600,500,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,500,600,550,550,500,600,1650,550,550,550,1600,600,500,600,1600,550,1600,600,500,600,500,600,550,550,500,600,1650,550,1600,600,500,600,500,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,500,600,500,600,500,600,500,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1600,600,1600,550,550,600,500,550,550,550,550,550};

void loop() {

irsend.sendRaw(heat, sizeof(heat)/sizeof(int), khz);

delay(10000);

irsend.sendRaw(OFF, sizeof(OFF)/sizeof(int),khz);

delay(10000);

}

Se siamo usciti ad azionare il condizionatore di casa, siamo a buon punto per poter completare il progetto !

Come indicato precedentemente, è necessario utilizzare due Arduino, uno che gestisce la parte webserver, l’altro che gestisce la comunicazione con il condizionatore.

Per collegare i due Arduino in maniera corretta, occorre prestare attenzione all’immagine successiva.

ACArduinoSchema

Sul dispositivo collegato con la Shield Ethernet è necessario caricare il programma che prende il nome di AC_Webpage_Controller.ino, mentre nell’Arduino che invierà i comandi IR, occorre caricare il programma che prende il nome di AC_Sender_Code.ino.

 

Ora che abbiamo completato la procedura di caricamento, non ci resta che fare alcune operazioni per perfezionare il progetto; quella più utile, è quella di rendere accessibile il webserver anche da remoto. Per farlo dovremmo “aprire le porte” del nostro router, per instradare correttamente le richieste che vengono fatte al di fuori della nostra rete locale.

Occorre precisare, che nella versione del codice riportata su Github, non è presente una protezione a livello di password, per semplificare un po’ il progetto. Tuttavia, con alcune modifiche al codice AC_Webpage_Controller.ino, sarà possibile implementare anche questa caratteristica.

 

L’operazione di inoltro delle porte, varia da router a router; tuttavia, in generale, si può procedere così:

 

  • Individuare l’IP del webserver di Arduino
  • Individuare l’IP del gateway
  • Aprire il browser e digitare l’IP del nostro router e inserire le credenziali
  • Aprire la sezione di inoltro delle porte e inserire come dati, l’IP di Arduino e come porta la 80.

 

Ora potremmo accedere anche al di fuori della nostra rete locale, semplicemente aprendo una pagina web, con l’IP pubblico della propria connessione ADSL (per recuperare questo valore, basterà semplicemente digitare su Google.com “my ip”).

Ora potremmo finalmente testare il nostro progetto !

 

IP

Webpage

Spero che questo progetto, sia utile per capire come è possibile realizzare qualcosa di davvero carino con Arduino, con un po’ di pazienza e soprattutto con un po’ di teoria !

 

Ecco il video del risultato finale:

 

 

 

           

 

 

Author: ismanettoneblog

Share This Post On

48 Comments

  1. Ciao ho provato a replicare il tuo codice però con una app android che invia stringhe da interpretare per poi inviare i segnali IR.
    Purtroppo non funziona, quale potrebbe essere il problema?

    #include

    String readString;
    IRsend irsend;

    void setup()
    {
    Serial.begin(9600);
    }

    unsigned on[]={8900,4400,650,1600,650,1650,600,500,650,550,650,500,600,550,600,500,650,1650,650,500,650,1550,700,1600,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,1600,650,550,600,550,600,500,650,500,650,550,600,550,600,1650,600,500,650,550,650,500,650,500,600,550,600,1650,650,500,650,500,650,500,600,550,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,600};

    unsigned condsuper[]={9100,4250,800,1450,700,1550,750,400,750,450,750,350,800,350,750,400,650,1600,700,500,750,1450,750,1550,750,400,650,500,800,350,750,350,750,450,800,1450,650,500,800,350,750,400,700,450,800,350,750,400,750,400,800,350,750,1500,650,500,800,350,750,400,650,500,800,350,750,400,650,500,800,350,800,350,750,450,750,400,750,350,700,450,650,550,750,350,750,400,650,500,750,400,750,1550,750,350,750,400,700,1550,700};
    unsigned condalt[]={9000,4400,650,1650,600,1650,600,500,650,550,650,500,650,500,600,550,600,1650,650,500,650,1600,650,1600,650,500,650,500,650,500,650,500,650,550,600,500,650,500,650,500,650,550,600,500,650,500,650,500,650,550,600,550,600,1650,600,500,600,600,650,500,600,550,600,550,600,550,650,500,650,500,600,550,600,550,600,550,650,500,650,500,600,550,650,500,650,500,650,500,650,500,650,500,650,500,600,550,600,550,600};
    unsigned condmed[]={9000,4400,650,1650,600,1600,650,500,650,550,650,500,650,500,600,550,600,1650,650,500,650,1600,650,1550,700,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,550,600,500,650,500,650,500,650,550,600,550,600,1600,650,500,650,550,650,1550,700,500,600,1650,600,550,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650};
    unsigned condbas[]={8950,4450,650,1600,650,1600,650,450,700,500,650,500,650,500,650,500,650,1600,650,500,650,1600,650,1600,650,550,600,550,600,500,650,500,650,500,700,500,600,550,600,500,650,550,650,450,700,500,600,550,600,550,650,500,650,1600,650,500,600,550,650,500,650,500,650,500,650,1600,650,500,650,500,650,500,650,500,650,500,650,500,650,500,650,550,600,500,650,500,650,500,650,550,600,500,650,500,650,500,650,500,650};

    unsigned riscalt[]={9000,4450,650,1550,700,1600,650,500,600,550,650,500,650,500,650,500,650,1600,650,500,650,1600,650,1600,650,550,600,500,650,500,650,500,650,550,600,550,600,500,650,500,650,550,650,500,600,550,600,550,600,550,650,500,650,500,600,550,600,550,650,500,650,1600,650,1600,650,1600,650,500,650,500,650,500,650,550,600,500,650,500,650,500,650,550,600,500,650,500,650,500,650,550,600,550,600,500,650,500,650,500,650};

    void loop(){

    while (Serial.available()){
    delay(3);
    char c = Serial.read();
    readString +=c;
    }

    if (readString.length() >0){
    Serial.println(readString);

    if (readString == "DELONGHIon")
    {

    irsend.sendRaw(on,sizeof(on)/sizeof(int),38);
    delay(50);
    }

    if (readString == "DELONGHIcondsuper")
    {

    irsend.sendRaw(condsuper,sizeof(condsuper)/sizeof(int),38);
    delay(50);
    }

    if (readString == "DELONGHIcondalta")
    {

    irsend.sendRaw(condalt,sizeof(condalt)/sizeof(int),38);
    delay(50);
    }

    if (readString == "DELONGHIcondmedia")
    {

    irsend.sendRaw(condmed,sizeof(condmed)/sizeof(int),38);
    delay(50);
    }

    if (readString == "DELONGHIcondbassa")
    {
    irsend.sendRaw(condbas,sizeof(condbas)/sizeof(int),38);
    delay(50);
    }

    if (readString == "DELONGHIriscalta")
    {

    irsend.sendRaw(riscalt,sizeof(riscalt)/sizeof(int),38);
    delay(50);
    }

    readString="";
    }
    }

    Post a Reply
    • Salve,
      in riferimento al codice presente tra i commenti, mi pare che sia sbagliato il primo valore di ciascun vettore all’inizio del software. Come riportato nel mio articolo, è necessario togliere via il primo valore che viene letto con il programma di lettura IR per Arduino. Il problema è che il condizionatore non effettua nessuna operazione, giusto ? Se mi confermi che è questo il problema, dovrebbe bastare eliminare il primo valore di ciascun array.

      Post a Reply
    • posso sapere se hai risolto il problema? credo di essere nella tua stessa posizione, ho un clima delonghi e non riesco a farlo accendere/spegnere

      Post a Reply
  2. Ciao,
    vorrei inserire il tuo comando nel nostro centro di recupero dati da server.
    Sono un po schiantato nel comprendere bene come funzioni la libreria IRemote e, meglio ancora, se l’hai “modificata/personalizzata” o se sei riuscito a riutilizzarla così come è.
    Grazie per dritte.
    Robert

    Post a Reply
    • Salve,
      la libreria per gli infrarossi è ben fatto e pertanto non è stata necessaria nessuna modifica. Per decodificare il segnale IR inviato è necessario primo usare il programma Test e poi una volta copiata la sequenza corretta, è possibile re-inviare il tutto ! È tutto ben documentato nel mio post riguardo a questa libreria.

      Post a Reply
  3. Ciao,

    ho provato a replicare il segnale del mio telecomando del mio condizionatore ZEPHIR ZBS9000 ma purtroppo non funziona. Sospetto che la potenza del segnale infrarosso non sia sufficente (quale è la potenza del led che hai usato?). Dico questo perché quando riprendo l’infrarosso con il telefono, l’intensità del led del telecomando è molto più alta di quella del led usato su arduino.

    grazie, Ecco qui sotto il codice dell’invio del comando:

    #include “IRremote.h”

    IRsend irsend;

    void setup()

    {

    Serial.begin(9600);
    // initialize digital pin 13 as an output.
    pinMode(13, OUTPUT);
    }

    int khz=38; //NB Change this default value as neccessary to the correct modulation frequency

    // STUDIO ZBS9000
    // OFF
    unsigned OFF_0[] ={9050,4400,650,1550,650,1600,650,450,650,450,600,450,650,500,600,1600,650,1600,600,1600,650,1600,600,1600,650,450,650,1550,650,1600,650,1550,650,450,650,450,650,450,650,500,600,450,650,450,650,450,650,400,700,450,650,500,600,500,600,400,700,400,700,450,650,450,650,400,700,450,650,450,650,350,700,450,650,500,600,500,600,1600,650,450,650,450,650,500,600,450,650,450,650,450,650,450,650,400,700,1550,650,450,650};
    // STUDIO ZBS9000
    // ON
    unsigned ON_0[] ={9050,4450,600,1600,650,1600,600,500,600,500,600,500,600,500,600,1600,650,1600,600,1600,650,1550,650,1600,650,450,600,1600,650,1600,600,1600,650,450,650,450,650,500,600,400,700,350,750,400,700,300,800,450,650,400,700,400,700,400,700,450,600,500,600,450,650,450,650,300,800,450,650,500,600,450,650,500,600,450,650,450,650,1650,600,450,650,450,650,400,700,450,650,400,650,500,600,450,650,500,600,1600,650,450,650};

    void loop() {

    delay(5000); // wait
    irsend.sendRaw(OFF_0, sizeof(OFF_0)/sizeof(int),khz);
    delay(5000); // wait
    irsend.sendRaw(ON_0, sizeof(ON_0)/sizeof(int),khz);
    }

    Post a Reply
  4. Ciao,

    ho provato a replicatore il segnale del telecomando del mio condizionatore Zephir ZBS9000 ma quando invio le stringhe ottenute dal processo di reverse non riesco ad azionare il condizionatore:

    Il mio sospetto è che il led ad infrarosso sia poco potente visto che quando lo riprendo con la telecamera del cellulare la luce prodotta con il segnale inviato è debole, mentre se riprendo il telecomando mentre invia il comando la luce è molto più visibile.
    La domanda è: è necessario utilizzare led di una potenza specifica?

    Programma Send:

    #include “IRremote.h”

    IRsend irsend;

    void setup()

    {
    Serial.begin(9600);
    }

    int khz=38; //NB Change this default value as neccessary to the correct modulation frequency

    // STUDIO ZBS9000
    // OFF
    unsigned ZBS9000_OFF_0[] ={9050,4500,550,1600,650,1600,600,500,600,500,600,500,600,500,600,1600,650,1550,650,1600,650,1550,650,1600,600,500,600,1600,650,1600,600,1600,650,450,650,450,650,450,650,450,650,450,650,450,650,450,650,450,650,450,650,400,700,450,600,500,600,500,600,500,600,500,600,500,600,500,600,500,600,500,600,500,600,500,600,450,650,1600,650,450,650,450,650,450,650,450,650,450,600,500,600,500,600,500,600,1600,650,500,600};
    // STUDIO ZBS9000
    // ON
    unsigned ZBS9000_ON_0[] ={9050,4400,650,1600,600,1600,650,450,650,450,650,500,600,550,550,1600,600,1600,650,1600,600,1600,650,1550,650,450,650,1600,600,1600,650,1600,600,550,550,500,600,500,600,500,600,400,700,500,600,500,600,500,600,500,600,500,600,500,600,450,650,450,650,350,750,550,550,450,650,450,650,450,650,450,650,450,650,450,650,300,800,1600,600,550,550,550,550,500,600,500,600,450,650,500,600,550,550,500,600,1650,550,550,550};

    void loop() {

    delay(5000); // wait
    irsend.sendRaw(ZBS9000_OFF_0, sizeof(ZBS9000_OFF_0)/sizeof(int),khz);
    delay(5000); // wait
    rsend.sendRaw(ZBS9000_ON_0, sizeof(ZBS9000_ON_0)/sizeof(int),khz);
    }

    Post a Reply
    • Salve,
      il motivo principale per cui non si riesce ad accedere al condizionatore è perché la codifica inviata non è corretta, dal momento che bisogna eliminare per tutti i tre vettori, il primo valore (è spiegato dettagliatamente nel post ed è disponibile anche un tool in Java). Il secondo motivo può essere il campo d’azione del LED IR; infatti questa tipologia di connessione wireless, richiede visibilità diretta tra il TX e RX, oltre al fatto che i due non devono essere distanti più di 10 metri. Questo valore, dipende molto dalla resistenza che viene collegata in serie al LED. Minore è la resistenza, maggiore sarà il campo d’azione. Occorre prestare attenzione a non erogare troppa corrente al LED, perché un suo utilizzo eccessivo, potrebbe danneggiarlo. Spero di essere stato utile.

      Post a Reply
      • Grazie per la risposta, i miei commenti:

        – è stato utilizzata l’utility ACtool per formattare i numeri da inviare al condizionatore
        – la prova di trasmissione è stata fatta anche a pochi centimetri di distanza del condizionatore senza successo
        – il segnale registrato dal processo di reverse veniva riconosciuto come codifica NEC, ma nella fase di invio sia usando la sendNEC (con il decimale decodificato) che la sendRaw (con l’array raw preparato dallutility java) non si ottengono risultati (ne spegnimento, ne accensione)

        L’unica possibilità che mi viene in mente è che il led non è adeguato in termini di potenza (con la fotocamera del cellulare si vede bene che il telecomando ha un fascio luminoso potente mentre quello di iarduino è debole).
        Per essere sicuro che non fosse un problema del mio condizionatore ho provato con il telecomando del televisore e quello di sky e ho gli stessi problemi.

        Grazie per l’aiuto

        Post a Reply
        • Salve,
          secondo me il LED che utilizza non è corretto. Occorre acquistare un LED IR, che è facilmente reperibile su Ebay, oppure da un telecomando vecchio (consiglio di acquistarne uno nuovo, dal momento che costano qualche decina di centesimi).

          Post a Reply
  5. ciao, ho fatto tutto quello che ha detto nel post, ma non funziona in condizionamento marchio “Komeco” per qualche ristrição questo marchio?

    Post a Reply
    • Ogni dispositivo ha una proprio codifica, ma dovrebbe comunque funzionare il software che è presente nella guida.

      Post a Reply
      • Ciao,
        lo modifiche da fare per poter accedere più LED sono abbastanza standard. Innanzitutto occorre dichiara tutti i pin del LED prima della funzione void setup() ed inizializzarli, con il metodo pinMode(PIN,OUTPUT);. Ora occorre capire bene il funzionamento di questo metodo:
        postText.indexOf(“?on”) >0
        Questo metodo restituisce true se viene passato come parametro nella richiesta HTTP di tipo GET on. Ora dovra aggiungere un carattere in più che può essere 1on e 1off, per indicare di gestire il LED 1. Ovviamente dovrà modificare la pagina HTML con il metodo:
        client.println(“….
        al posto di off, dovrai mettere 1off etc…
        Ovviamente dovrà scegliere se far accendere un LED alla volta, oppure più di uno.

        Post a Reply
  6. ciao ho provato a leggere un telecomando di un climatizzatore samsung ma con qualsiasi pulsante sul serial monitor scrive sempre la stessa stringa FFFFFF. cosa ce di sbagliato?

    Post a Reply
    • Salve,
      molto probabilmente c’è qualche problema o con il ricevitori del segnale IR. Ha verificato che tutti i cavi siano collegati correttamente ? Esistono comunque delle librerie in grado di codificare correttamente i segnali dei telecomandi Samsung (in vece di usare il segnale generico).

      Post a Reply
  7. ciao eccomi qua di nuovo ho comprato la shield ir ma non riesco ad azionare il mio clima samsung ho provato con il telecomando del televisore e funziona.ho notato che qyanfo leggo la codifica del clima ho codici diversi utilizzzando lo stesso pulsante. secondo tè quale potrebbe essere il problema

    Post a Reply
    • Quindi il telecomando della TV, viene letto correttamente e replicato dal programma Arduino ? Che codifica viene mostrata dal terminale del programma, con il telecomando del condizionatore ?

      Post a Reply
      • questo è il codice gia modificato del climatizzatore tasto on

        unsigned signal_0[] ={500,550,550,1450,600,450,550,500,500,550,550,500,550,450,600,450,600,450,550,1450,600,500,500,500,600,1450,500,550,550,500,550,1450,600,1450,600,1450,500,1550,550,1450,600,450,600,450,600,450,550,550,550,450,600,500,500,500,600,450,600,500,500,550,550,500,550,450,500,550,550,550,500,500,500,600,550,450,550,500,550,500,600,450,600,500,500,550,550,450,600,450,550,500,600,500,550,500,500,550,550,500,550};

        Post a Reply
        • Tale codice non funziona con Arduino ?

          Post a Reply
          • no non funziona

          • Che tipo di led utilizzi ?

  8. il programma scritto nella pagina causa molti errori al compilatore di arduino quando eseguito. La libreria è installate e gli esempi funzionano; l’errore è nel codice o deve dipende dagli aggiornamenti del compilatore?

    Post a Reply
    • Il programma funziona correttamente sul mio Arduino; penso che i problemi siano legati alla non corretta installazione delle librerie all’interno dell’IDE di Arduino.

      Post a Reply
      • Hai provato con la ide più recente? Ogni tanto quando aggiornano cambiano alcuni comandi

        Post a Reply
        • Ho provato la nuova IDE, ma non con questo programma. Ho notato che ci sono un po’ di problemi, spero che vengano sistemati presto.

          Post a Reply
          • Non è un problrma della Ide sono cambiati alcuni comandi ealtro fattori deve eaaere aggiornato il codice.

  9. Non è un problrma della Ide sono cambiati alcuni comandi ealtro fattori deve eaaere aggiornato il codice.

    Post a Reply
  10. Sicuramente sbaglio qualche cosa sto provando a fare il reverse engineering ma quando copio il codice e lo verifico mi da questa sfilza di errori, chi mi potrebbe aiutare?

    Arduino:1.6.5 (Windows 8.1), Scheda:”Arduino/Genuino Uno”

    Uso la libreria IRremote nella cartella: C:\Users\Giulia\Documents\Arduino\libraries\IRremote

    C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10605 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard -IC:\Users\Giulia\Documents\Arduino\libraries\IRremote C:\Users\Giulia\AppData\Local\Temp\build8706318844879818021.tmp\test.cpp -o C:\Users\Giulia\AppData\Local\Temp\build8706318844879818021.tmp\test.cpp.o

    test.ino:71:1: error: stray ‘\’ in program
    test.ino:71:1: error: stray ‘\’ in program
    test.ino:77:1: error: stray ‘\’ in program
    test.ino:77:1: error: stray ‘\’ in program
    test.ino:83:1: error: stray ‘\’ in program
    test.ino:83:1: error: stray ‘\’ in program
    test.ino:89:1: error: stray ‘\’ in program
    test.ino:89:1: error: stray ‘\’ in program
    test.ino:95:1: error: stray ‘\’ in program
    test.ino:95:1: error: stray ‘\’ in program
    test.ino:101:1: error: stray ‘\’ in program
    test.ino:101:1: error: stray ‘\’ in program
    test.ino:107:1: error: stray ‘\’ in program
    test.ino:107:1: error: stray ‘\’ in program
    test.ino:113:1: error: stray ‘\’ in program
    test.ino:113:1: error: stray ‘\’ in program
    test.ino:119:1: error: stray ‘\’ in program
    test.ino:119:1: error: stray ‘\’ in program
    test.ino:123:1: error: stray ‘\’ in program
    test.ino:123:1: error: stray ‘\’ in program
    test.ino:125:1: error: stray ‘\’ in program
    test.ino:125:20: error: stray ‘#’ in program
    test.ino:125:1: error: stray ‘\’ in program
    test.ino:129:1: error: stray ‘\’ in program
    test.ino:129:20: error: stray ‘#’ in program
    test.ino:129:1: error: stray ‘\’ in program
    test.ino:133:1: error: stray ‘\’ in program
    test.ino:133:1: error: stray ‘\’ in program
    test.ino:137:1: error: stray ‘\’ in program
    test.ino:137:1: error: stray ‘\’ in program
    test.ino:153:1: error: stray ‘\’ in program
    test.ino:153:1: error: stray ‘\’ in program
    test.ino:157:1: error: stray ‘\’ in program
    test.ino:157:1: error: stray ‘\’ in program
    test.ino: In function ‘void dump(decode_results*)’:
    test.ino:71:15: error: ‘u201cUnknown’ was not declared in this scope
    test.ino:77:15: error: ‘u201cDecoded’ was not declared in this scope
    test.ino:83:15: error: ‘u201cDecoded’ was not declared in this scope
    test.ino:89:15: error: ‘u201cDecoded’ was not declared in this scope
    test.ino:95:15: error: ‘u201cDecoded’ was not declared in this scope
    test.ino:101:15: error: ‘u201cDecoded’ was not declared in this scope
    test.ino:107:15: error: ‘u201cDecoded’ was not declared in this scope
    test.ino:113:15: error: ‘u201cDecoded’ was not declared in this scope
    test.ino:119:22: error: ‘u201c’ was not declared in this scope
    test.ino:119:27: error: ‘u201c’ was not declared in this scope
    test.ino:119:27: error: redeclaration of ‘u201c’
    test.ino:119:22: note: previous declaration ‘u201c’
    test.ino:123:17: error: ‘u201d’ was not declared in this scope
    test.ino:123:29: error: expected ‘;’ before ‘u201d’
    test.ino:125:21: error: expected ‘)’ before ‘define’
    test.ino:129:21: error: expected ‘)’ before ‘define’
    test.ino:133:31: error: ‘u201cRaw’ was not declared in this scope
    test.ino:137:21: error: expected ‘;’ before ‘:’ token
    test.ino:153:22: error: expected ‘)’ before ‘u201c’
    test.ino:157:23: error: expected ‘)’ before ‘u201d’
    Multiple libraries were found for “IRremote.h”

    Used: C:\Users\Giulia\Documents\Arduino\libraries\IRremote

    Not used: C:\Program Files (x86)\Arduino\libraries\RobotIRremote

    Not used: C:\Users\Giulia\Documents\Arduino\libraries\Arduino-IRremote-master

    stray ‘\’ in program

    Post a Reply
    • Salve,
      da quello che si legge dal LOG, sembrano esserci più librerie IRremote all’interno dell’Arduino IDE:
      Multiple libraries were found for “IRremote.h”
      Basta averne una sola.

      Post a Reply
  11. Sono riuscito a leggere e a trasmettere i segnali,unica cosa che non capisco che il led ir quando invio il segnale al climatizzatore deve essere davvero troppo vicino 15 20 cm altrimenti non funziona. Qualche consiglio ??

    Post a Reply
    • Salve,
      il motivo è di tipo hardware. Prima di tutto se segui la guida è presente una piccola resistenza, che contribuisce a ridurre il raggio d’azione; quello massimo si può ottenere omettendo tale resistore. Il secondo problema è che l’IR è un protocollo di comunicazione molto soggetto ad interferenze e richiede una linea visiva libera.

      Post a Reply
  12. io proprio non ci riesco questo è quello che leggo con il programma di lettura IR di arduino :

    C90060A
    Decoded NEC: 9C90060A (32 bits)
    Raw (74): 14874 8800 -4400 600 -1650 650 -550 600 -600 600 -1650 600 -1650 600 -1650 600 -550 600 -600 600 -1650 600 -600 600 -550 600 -1650 600 -600 600 -600 600 -550 600 -600 600 -550 600 -600 600 -550 600 -600 600 -600 600 -1600 650 -1600 650 -550 600 -600 600 -550 650 -550 600 -600 600 -1650 600 -550 600 -1650 600 -600 600 -600 600 -1650 600 -550 600
    8C90040A

    Decoded NEC: 8C90040A (32 bits)
    Raw (74): -5130 8750 -4400 650 -1650 600 -600 600 -550 600 -600 600 -1650 600 -1650 600 -550 600 -600 600 -1650 600 -600 600 -550 700 -1550 600 -600 600 -550 600 -600 600 -600 600 -550 600 -600 600 -550 600 -600 600 -600 600 -1650 600 -550 600 -600 600 -550 600 -600 600 -600 600 -550 600 -1650 600 -600 600 -1650 600 -550 600 -600 600 -1650 600 -600 600

    elimino e modifico i vettori come spiegato e le stringe dovrebbero essere corrette :

    8800,4400,600,1650,650,550,600,600,600,1650,600,1650,600,1650,600,550,600,600,600,1650,600,600,600,550,600,1650,600,600,600,600,600,550,600,600,600,550,600,600,600,550,600,600,600,600,600,1600,650,1600,650,550,600,600,600,550,650,550,600,600,600,1650,600,550,600,1650,600,600,600,600,600,1650,600,550,600

    8750,4400,650,1650,600,600,600,550,600,600,600,1650,600,1650,600,550,600,600,600,1650,600,600,600,550,700,1550,600,600,600,550,600,600,600,600,600,550,600,600,600,550,600,600,600,600,600,1650,600,550,600,600,600,550,600,600,600,600,600,550,600,1650,600,600,600,1650,600,550,600,600,600,1650,600,600,600

    ma se le inserisco nel programma di trasmissione il clima non si accende e non si spegne, dove sbaglio ??

    Post a Reply
    • Ci possono essere due problemi: 1) non usi correttamente un LED IR 2) sei troppo distante dal condizionatore.

      Post a Reply
      • il led credo di usarlo nel modo corretto, anzi ne sono quasi certo.
        lo stesso circuito l’ho provato con la TV e li funziona correttamente.

        sono abbastanza vicino, il led lo tengo a 5cm se non meno.

        la cosa strana che quando cerco di decodificare il codice ON/OFF trasmesso dal telecomando non sempre mi da la stessa stringa RAW.

        Decoded NEC: 9C90060A <– questo valore è sempre lo stesso ma la stringa raw a volte varia.

        ho trovato anche un'app per Samsung per comandare il clima e sono riuscito a farlo funzionare, ho provato a decodificare la stringa trasmessa dallo smartphone :

        9290060A
        Decoded NEC: 9290060A (32 bits)
        Raw (74): 18638 8800 -4400 600 -1600 650 -550 650 -550 600 -1600 650 -550 600 -550 650 -1600 600 -600 600 -1600 650 -550 600 -550 600 -1650 600 -550 650 -550 600 -550 600 -550 650 -550 600 -550 650 -550 600 -550 600 -600 600 -1600 650 -1600 600 -600 600 -550 600 -550 650 -550 600 -550 600 -1650 600 -600 600 -1600 600 -600 600 -550 600 -1600 650 -550 650
        8290040A
        Decoded NEC: 8290040A (32 bits)
        Raw (74): -32614 8800 -4350 650 -1600 650 -550 600 -550 650 -550 600 -550 650 -550 600 -1600 650 -550 600 -1600 650 -550 600 -600 600 -1600 650 -550 600 -550 600 -600 600 -550 600 -550 650 -550 600 -550 600 -600 600 -550 600 -1600 650 -550 600 -600 600 -550 600 -600 600 -550 600 -550 650 -1600 600 -600 600 -1600 650 -550 600 -550 600 -1600 650 -550 650

        modificata e inserita e non va comunque.

        ho anche provato a mandare la stringa

        irsend.sendNEC(0x9290060A, 32); <– nulla nemmeno così funziona

        non so proprio da che parte prendere…

        Post a Reply
        • Provi ad usare la funzione con la codifica NEC. Il sistema IR dei condizionatori è abbastanza complesso (intendo la codifica). Può essere che cambi di volta in volta il valore ritornato.

          Post a Reply
  13. Intende questa : irsend.sendNec …

    Questa l’ho giá provata con esito negativo.

    Se intende invece altre funzioni non le conosco, se gentilemnte potrebbe indicarmele

    Post a Reply
    • Il codice a cui mi riferivo era proprio quello. Non saprei proprio cosa suggerire d’altro.

      Post a Reply
  14. Ciao,io leggo i codici regolarmente sia del tv che il condizionatore ,sul tv arduino funziona ma sul condizionatore no.

    Decoded SAMSUNG: B24D3FC0(32 bits)
    #define Something_DEC 2991407040
    #define Something_HEX B24D3FC0
    Raw (100): 19794 4400 -4350 600 -1550 600 -500 550 -1600 600 -1550 600 -500 550 -550 550 -1600 550 -500 550 -550 550 -1600 600 -500 550 -550 550 -1600 550 -1600 550 -550 550 -1600 550 -500 550 -550 550 -1600 600 -1550 600 -1600 550 -1600 550 -1600 600 -1550 550 -1600 600 -1550 600 -500 550 -550 550 -500 600 -500 550 -550 550 -550 550 -500 550 -1600 600 -1600 550 -1600 550 -1600 550 -1600 600 -500 550 -500 550 -1650 550 -500 550 -550 550 -550 550 -500 550 -550 550 -1600 600 -1550 550

    #include “IRremote.h”

    IRsend irsend;

    void setup()
    {
    Serial.begin(9600);
    }

    unsigned int ON[100]{4400,4350,600,1550,600,500,550,1600,600,1550,600,500,550,550,550,1600,550,500,550,550,550,1600,600,500,550,550,550,1600,550,1600,550,550,550,1600,550,500,550,550,550,1600,600,1550,600,1600,550,1600,550,1600,600,1550,550,1600,600,1550,600,500,550,550,550,500,600,500,550,550,550,550,550,500,550,1600,600,1600,550,1600,550,1600,550,1600,600,500,550,500,550,1650,550,500,550,550,550,550,550,500,550,550,550,1600,600,1550,550, };

    void loop() {
    irsend.sendRaw(ON,100,38);
    Serial.println(“Accendo il condizionatore”);
    delay(10000);
    }

    sbaglio qualcosa?

    Post a Reply
    • Non vedo alcun errore, è tutto corretto! Può essere un problema di raggio d’azione dell’infrarosso, prova a posizionarti più vicino.

      Post a Reply
  15. Buongiorno a tutti.

    Il proprietario dell’appartamento che ho affittato nel luogo dove lavoro ha installato un condizionatore Ecoflam che non si può programmare per più di 24 ore in anticipo.
    Per usare Arduino come spiegato nell’articolo qui sopra, ho dovuto apportare DUE MODIFICHE ALLA LIBRERIA.
    Ho utilizzato le informazioni contenute qui: http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html

    1)
    La libreria IR consente di acquisire codici composti da un massimo di 100 elementi. La pressione di un tasto del telecomando del condizionatore Ecoflam genera un codice composto da 199 elementi. Il Daikin che ho a casa mia ne genera addirittura 232.
    In IRremote.h, ho sostituito:

    #define RAWBUF 100 // Length of raw duration buffer

    con

    #define RAWBUF 300 // Length of raw duration buffer

    Inoltre, ho aggiunto il membro “overflow” alla seguente classe:

    // Results returned from the decoder
    class decode_results {
    public:
    int decode_type; // NEC, SONY, RC5, UNKNOWN
    unsigned int panasonicAddress; // This is only used for decoding Panasonic data
    unsigned long value; // Decoded value
    int bits; // Number of bits in decoded value
    volatile unsigned int *rawbuf; // Raw intervals in .5 us ticks
    int rawlen; // Number of records in rawbuf.
    unsigned int overflow;
    };

    Nella routine di interrupt ISR(TIMER_INTR_NAME) ho modificato il seguente codice:

    if (irparams.rawlen >= RAWBUF) {
    // Buffer overflow
    irparams.overflow = 1;
    irparams.rcvstate = STATE_STOP;
    }

    in modo da poter rilevare se, durante la ricezione di un comando, ci fosse stato overflow, cioè fossero stati ricevuti più elementi di quanti il buffer può contenere. La libreria originale se ne frega: se riceve più di 100 elementi, si ferma e non dà alcun allarme.

    2) Nonostante queste modifiche, e nonostante riuscissi tranquillamente a riprodurre i telecomandi di televisori Sony e Samsung, col condizionatore non c’era niente da fare. Ricevevo esattamente 100 elementi (compreso il tempo di attesa inziale), ma, rinviandoli al condizionatore, questo non si accendeva. Ho fatto un po’ di reverse engineering della libreria e ho notato che la routine di interrupt ISR(TIMER_INTR_NAME) assume che la trasmissione sia finita quando campiona in ingresso lo stesso valore STATE_SPACE per più di GAP_TICKS intervalli consecutivi, corrispondenti a 5 millisecondi. Ho ipotizzato che il telecomando inviasse un elemento di durata più lunga e che questo fosse scambiato per una fine della trasmissione, quindi ho modificato in IRremote.h la seguente definizione, in modo da allungare il time-out di fine ricezione a 10 millisecondi:

    #define _GAP 10000 // Minimum map between transmissions

    BANG! Ho acquisito una trasmissione e mi è risultata composta da 200 elementi: il tempo di attesa iniziale, quindi la stringa di 99 elementi che acquisivo anche prima, seguita da un elemento più lungo (valore 5200, giusto leggermente più lungo del time-out di fine ricezione) e infine la stessa stringa di 99 elementi ripetuta. Quando ho ritrasmesso questo codice di 199 elementi al condizionatore (togliendo, ovviamente, il tempo di attesa iniziale), ha risposto subito.

    Se a qualcuno interessa il codice completo, me lo faccia sapere.

    Buon Arduino a tutti.

    Post a Reply
    • Salve,
      secondo me il problema è che gli elementi della codifica del condizionatore sono più di 100. Proverai ad aumentare la dimensione del vettore.

      Post a Reply
    • Davide , Molto interessante!
      Mi trovo anch’io con un report “tagliato” a 100 item (climatizzatore a basso costo COMFEE).
      Perchè non pubblichi la libreria modificata? Faresti un regalo alla community!
      Oppure come possiamo contattarci senza pubblicare le email? Hai un tuo sito?
      grazie, ciao

      Post a Reply
      • Grazie. Prova ad usare la nuova libreria, scaricabile dal link presente nell’articolo. Dovrebbero essere state aggiunte nuove codifiche.

        Post a Reply
  16. Ciao, col tuo primo codice per la recezione degli infrarossi mi viene questo:

    Unknown encoding: FDAC0150(32 bits)
    #define Something_DEC 4255908176
    #define Something_HEX FDAC0150
    Raw (6): 21836 7300 -1650 20250 -1650 31050
    Unknown encoding: FDAC0150(32 bits)
    #define Something_DEC 4255908176
    #define Something_HEX FDAC0150
    Raw (6): 8336 7300 -1650 20250 -1650 31150

    Tenendo premuto il pulsante accensione del telecomando della tv mi escono fuori 3 codici diversi, Quale dovrei usare?
    Seconda cosa: non mi capta quello del condizionatore. Nonostante lo tengo premuto a lungo e vicino.

    Grazie bel lavoro.

    Post a Reply
  17. ciao,complimenti per il progetto,molto carino,ma vorrei chiederti un altra cosa e cioè,
    vorrei leggere i codici del telecomando del clima e far fare ad arduino le varie funzioni della scheda del clima,quindi ricostruire una scheda ex novo.
    Quindi una volta letti i codici del telecomando come faccio ad assegnare quel codice ad una funzione?
    In pratica non vorrei ritrasmetterli ,ma usarli per fare delle specifiche funzioni.
    con il telecomando di un tv ci sono riuscito,ma con quello del clima,no.
    spero di essere stato chiaro,grazie

    Post a Reply
    • Una volta letti i vari codici, è possibile inserirli in un vettore, per poi essere inviati successivamente.

      Post a Reply
  18. Ciao a tutti, sto cercando di seguire questa guida fatta benissimo, ma non riesco a capire il motivo per cui riesco a spegnere il condizionatore ma non ad accenderlo!
    ho un fuji

    Post a Reply
    • Il problema è legato alla codifica sicuramente. Prova ad aumentare la memoria dell’array raw del comando.

      Post a Reply

Submit a Comment

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


*