Con Arduino ed un paio di moduletti economici come quelli già visti qui è possibile realizzare un automatismo telecomandato con apprendimento per “insegnare” ai trasmettitori programmabili per apricancelli il codice di trasmissione. E’ possibile adattare il circuito per utilizzare più uscite e più pulsanti per l’insegnamento (uno per ogni codice). Qui di seguito lo schema elettrico utilizzabile con qualsiasi modello di Arduino base (UNO, Mini, Nano, etc…)
Per modificare il codice di trasmissione modificate la linea
char *codice = “00000000111111000111111”; // codice 24 bit lasciare i primi 8 bit a 0
usate una qualsiasi sequenza binaria di 24 caratteri lasciando sempre i primi 8 a “0”.
Per insegnare al vostro telecomando il codice avvicinatelo al trasmettitore e premete il pulsante fino a quando il codice verrà memorizzato. Ora potrete utilizzarlo per far accendere o spegnere il relè connesso all’Arduino.
/* Utilizza la libreria http://code.google.com/p/rc-switch/ www.sciamannalucio.it */ #include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); char *codice = "00000000111111000111111"; // codice 24 bit lasciare i primi 8 bit a 0 int RX_Interrupt = 0; // DIGITAL Pin 2 da collegare al pin DATA della ricevente radio int TXbutton = 3; // Pulsante per l'insegnamento del codice al telecomando int led = 5; // led che indica che si sta insegnando al telecomando int relay = 6; // relè di uscita unsigned int value = 0; // conterrà il codice ricevuto int readBinaryString(char *s) { int result = 0; while(*s) { result <<= 1; if(*s++ == '1') result |= 1; } return result; } void setup() { mySwitch.enableTransmit(4); //Digital PIN 4 TX Serial.begin(115200); // imposta il baud del monitor seriale a 115200 // Il ricevitore radio è connesso al DIGITAL Pin #2 mySwitch.enableReceive(RX_Interrupt); // collega il Pin con funzione interrupt mySwitch.setRepeatTransmit(4); pinMode(TXbutton, INPUT_PULLUP); pinMode(led, OUTPUT); pinMode(relay, OUTPUT); } void loop() { while (digitalRead(TXbutton)==LOW) { digitalWrite(led, HIGH); mySwitch.send(codice); } digitalWrite(led, LOW); // Se è arrivato un dato if (mySwitch.available()) { // controlla se è stato ricevuto un codice // memorizza il dato int value = mySwitch.getReceivedValue(); // Se il dato vale zero if (value == 0) { Serial.print("Unknown encoding"); // altrimenti } else { Serial.print("Received "); Serial.print( mySwitch.getReceivedValue() ); // stampa il dato ricevuto if (readBinaryString(codice)==value) { // controlla se il valore ricevuto è uguale al codice memorizzato digitalWrite(relay, !digitalRead(relay)); Serial.println(" OK!"); delay(1000); // pausa di 1 secondo per evitare l'attivazione/disattivazione veloce } else { Serial.println(" NO!"); } } // ri-arma la ricezione dei dati mySwitch.resetAvailable(); } }
Libreria RCSwitch