-piattaforma ARDUINO (nel mio caso arduino uno)
-prese radiocomandate SILVERCREST mod.53117 comprate alla LIDL
-modulo trasmettitore RF 433.92 mhz (http://www.sparkfun.com/products/10534)
-modulo ricevitore RF433.92 mhz (http://www.sparkfun.com/products/10532).
Dunque..collegando ARDUINO al modulo ricevitore, come indicato in figura:
Il pin DATA del modulo è da collegare al pin 2 di Arduino.
ovviamente il modulo è diverso, bisogna guardare i pin del proprio modulo.
Ad esempio il modulo che ho usato io (ricavato da una delle prese radiocomandate è questo:
Dove il pin 1 è il GND, il pin 2 è il DATA e il pin 3 è il Vcc.
Installando sull'arduino questo sketch (previa installazione del modulo RC-Switch):
#include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); void setup() { Serial.begin(9600); mySwitch.enableReceive(0, output); } void loop() { } void output(unsigned long decimal, unsigned int length, unsigned int delay, unsigned int* raw) { if (decimal == 0) { Serial.print("Unknown encoding."); } else { Serial.print("Decimal: "); Serial.print(decimal); Serial.print(" ("); Serial.print( length ); Serial.print("Bit) "); Serial.print(" PulseLength: "); Serial.print(delay); Serial.println(" microseconds"); } Serial.print("Raw data: "); for (int i=0; i<= length*2; i++) { Serial.print(raw[i]); Serial.print(","); } Serial.println(); Serial.println(); }
Si ottengono i dati dal telecomando originale, ad esempio, nel mio caso, se schiaccio il tasto A ON ottengo questi dati:
Unknown encoding.Raw data: 7116,936,596,928,592,932,604,428,1100,424,1100,420,1100,920,604,428,1108,428,1092,432,1092,928,600,432,1096,428,1088,932,600,428,1088,436,1100,932,600,428,1092,932,596,432,1092,928,600,928,596,432,1092,432,1108
Come interpretare questi dati?
Semplice, grazie a questo sito:
http://test.sui.li/oszi/
Incollando qui i dati si ottiene, in forma grafica, l'onda della trasmissione RF.
Da qui ho capito che ogni bit è composto da 4 parti, e che quindi il bit 1 è composto da 3 pulse HIGH e 1 LOW, mentre il bit 0 è composto da 1 pulse HIGH e 3 LOW, di cui ogni PULSE equivale a circa 380 mS, per cui ad esempio il primo bit (936,596) equivale a 3 pulse HIGH e uno LOW, ovvero a UNO.
Seguendo questo schema ho tradotto la nostra stringa di dati in una serie di 1 e di 0, più precisamente questa:
111011110101011001011100
Ora, montando un trasmettitore RF sull'arduino come questo schema:
http://code.google.com/p/rc-switch/wiki/HowTo_Send
ed installando questo sketch:
void setup() { Serial.begin(9600); mySwitch.enableTransmit(10); mySwitch.setPulseLength(380); } void loop() { Serial.println("Invio segnale per accendere"); mySwitch.send("111011110101011001011100"); delay(5000); Serial.println("Invio segnale per spegnere"); mySwitch.send("111000111001100100101100"); delay(5000); }
dovrei ottenere che accendo e spengo la presa radiocomandata ogni 5 secondi. Invece non funziona. Ed è qui che mi sono perso per giorni e giorni, fino ad oggi che ho avuto l'illuminazione! Il problema sta nel segnale di sincronizzazione iniziale (7116) che nella versione di RCSwitch dice che è fatto da 1 pulse ON e 31 pulse OFF. Ora, visto che all'inizio abbiamo detto che ogni PULSE equivale a 380mS circa, il nostro segnale di sincronizzazione doveva essere di circa 11700 mS, invece è circa 7100, ovvero equivalente a 18 pulse OFF. Così ho modificato il file della libreria di RCSwich, ovvero RCSwitch.cpp, nella riga dove dice
void RCSwitch::sendSync() { this->transmit(1,31); }
Così facendo funziona tutto!
Qua ci sono i codici di tutti i tasti del telecomando:
RispondiEliminatutti on 111010 0011100111101 10010
tutti off 111010 1110101010000 10010
Aon 111011 1101010110010 11100
Aoff 111011 0000111111100 01100
Bon 111001 1010001000001 10101
Boff 111010 0111110011010 00101
Con 111010 0011100111101 11110
Coff 111010 1110101010000 11110
Don 111010 1011000101110 10111
Doff 111011 1000010010111 10111
ciao
RispondiEliminami aiuti
quando carico il tuo codice mi da errore su questa riga
perché?
mySwitch.enableReceive(0, output);
ciao, che errore ti da?
RispondiEliminadi seguito l'errore che restituisce:
RispondiEliminaerror: no matching function for call to 'RCSwitch::enableReceive(int, void (&)(long unsigned int, unsigned int, unsigned int, unsigned int*))'
hai dichiarato la libreria all'inizio?
RispondiEliminaPuoi spiegare meglio il procedimento che fai subito dopo aver decodificato i valori nell'onda quadra? Mi spiego meglio, non ho capito come ottieni '111011110101011001011100' dall'onda quadra
RispondiEliminaSalve le volevo chiedere se era possibile inviare il codice di bit a premere di un pulsante come deve essere il codice mi potete aiutare? Vorrei accendere una presa quando voglio e spegnere quando voglio. È possibile?
RispondiEliminaCiao anche io voglio realizzare la stessa cosa hai trovato soluzioni?
RispondiElimina