Go Down

Topic: Telecomando RF-IR per gestione condizionatore (Read 656 times) previous topic - next topic

CFabio65

Buongiorno a tutti, vorrei esporre alla vostra attenzione il mio primo progetto, in parole povere si tratta di un telecomando da fissare a parete, che sia in grado di spegnere un condizionatore, a seguito della ricezione di un segnale in radiofrequenza a 433,92 Mhz. inviato da un sensore che rileva l'apertura di una finestra, (classico sensore per antifurto) per poi inviare via IR il codice per lo spegnimento, in realtà i sensori sono tre, due per le finestre ed uno per una porta finestra, al momento attuale il sopra citato archibugio con mio immenso stupore funziona egregiamente, ovviamente il circuito si trova ancora su una breadboard, il sensore invia un codice solo nel momento in cui viene allontanato dal suo magnete, per un tempo brevissimo poi smette fino a quando non si avvicina di nuovo al magnete e ripete il ciclo.

Adesso, la mia intenzione sarebbe quella di far riconoscere ad Arduino anche il secondo impulso (come finestra chiusa) per fargli svolgere altre istruzioni, tengo a precisare che il codice trasmesso dal sensore è identico sia in apertura che in chiusura, cercando in giro non ho trovato niente che possa fare al caso mio, oppure visto la mia pochissima esperienza non sono stato in grado di riconoscerlo.

Come posso risolvere in maniera che la prima volta riconosca " finestra aperta " e la seconda " finestra chiusa " ?

Allego parte del programma, e ringrazio anticipatamente coloro che vorranno prestare un pò di attenzione verso questo progetto.

Spero di avere rispettato il regolamento di questa comuniti, se avessi omesso qualcosa chiedo scusa anticipatamente, Grazie Fabio.

Code: [Select]
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
#include <IRremote.h>
IRsend irsend;


int khz = 38;                                                          // Modulazione di Frequenza trasmettitore IR
unsigned int powerOff[] = {3464, 1700, 516, 1208, 440, 1280, 440, 428, 436, 432, 520, 352, 492, 1232, 436, 428, 436, 432, 496, 1224, 444, 1280, 516, 352, 512, 1216, 516, 352, 440, 424, 492, 1228, 516, 1212, 516, 352, 492, 1260, 408, 1288, 516, 352, 496, 372, 460, 1264, 436, 428, 488, 380, 520, 1216, 440, 428, 460, 412, 464, 404, 492, 372, 440, 428, 460, 412, 440, 428, 440, 428, 436, 432, 444, 428, 492, 372, 492, 376, 488, 376, 440, 428, 456, 412, 496, 368, 436, 436, 492, 372, 524, 352, 440, 428, 440, 428, 488, 376, 492, 376, 500, 372, 440, 424, 492, 372, 496, 1228, 436, 432, 436, 436, 460, 408, 492, 372, 492, 376, 500, 1224, 444, 424, 440, 424, 496, 384, 436, 436, 496, 368, 432, 432, 496, 372, 496, 368, 444, 424, 516, 356, 436, 1288, 496, 1224, 496, 376, 488, 376, 488, 1232, 500, 368, 496, 1228, 516, 356, 500, 368, 444, 424, 440, 1284, 500, 364, 492, 376, 436, 432, 432, 1292, 492, 1232, 512, 1212, 464, 1272, 460, 1260, 524, 352, 492, 372, 492, 372, 496, 372, 460, 408, 436, 440, 492, 372, 460, 408, 488, 380, 436, 432, 444, 420, 496, 372, 464, 404, 460, 408, 488, 380, 488, 376, 488, 376, 488, 380, 488, 380, 496, 368, 444, 424, 440, 428, 440, 428, 456, 408, 436, 432, 468, 404, 440, 428, 436, 432, 444, 424, 464, 400, 444, 420, 444, 424, 464, 404, 440, 424, 440, 424, 444, 420, 444, 424, 464, 404, 440, 424, 440, 432, 468, 400, 444, 420, 444, 424, 444, 420, 444, 424, 440, 428, 440, 424, 440, 428, 436, 432, 444, 424, 444, 424, 440, 424, 440, 428, 440, 1280, 492, 376, 436, 432, 444, 420, 468};


void setup()
{
  Serial.begin(9600);
  mySwitch.enableReceive(0);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  irsend.enableIROut(khz);
  delay(1000);
  Serial.println(F("Analisi"));
}

void loop() {


if (mySwitch.available()) {
 
long value = mySwitch.getReceivedValue();

// SENSORE PORTA INGRESSO

if (value == 2022535)                                                 // Codice Del Sensore Installato Sulla Porta
{
 Serial.println(" (Porta Ingresso Aperta) ");                         // Scrivo Il Sensore/Stato
  Serial.println(value);                                              // Stampo Il Codice Inviato Dal Sensore
  digitalWrite(11, HIGH);                                             // Accendo Il Ied Verde Collegato Al Pin 11 = (Sensore Ricevuto)
  delay(250);                                                         // Tempo Durata Led Acceso (1/4 secondo)
  digitalWrite(11, LOW);                                              // Led Verde Spento
  delay(3000);                                                        // Tempo Di Attesa Invio Codice IR (3 Secondi)
  digitalWrite(12, HIGH);                                             // Accende Il Led Rosso Collegato Al Pin 12 = (Conferma Invio Comando Spegnimento)
  delay(250);                                                         // Tempo Durata Led Acceso (1/4 secondo)
  digitalWrite(12, LOW);                                              // Led Rosso Spento
  irsend.sendRaw(powerOff, sizeof(powerOff) / sizeof(int), khz);      // Invio Codice Di Spegnimento
  delay(16);
  irsend.sendRaw(powerOff, sizeof(powerOff) / sizeof(int), khz);
}


else



// SENSORE FINESTRA CAMERA

if (value == 615047)                                                  // Codice Del Sensore Installato Sulla Finestra              
{

fabpolli

Ciao ti basta una variabile booleana Es. finestraChiusa inizializzata a true.
Quando rilevi il codice cambi lo stato
Code: [Select]

finestraChiusa = !finestraChiusa

 in questo modo la variabile ad ogni rilevazione del codice sensore cambierà da true a false un bell'if
Code: [Select]

if(finestraChiusa)
{
...codice da eseguire quando la finestra è chiusa
}
else
{
...cdice da eseguire quando la finestra è stata aperta
}



fratt

Concordo con fab, è la soluzione più semplice se hai certezza dello stato iniziale delle finestre quando parte il sistema.

CFabio65

Buongiorno, vi ringrazio entrambi, scusate ma riesco solo adesso a leggere i vostri post, ieri sera sono rientrato dal lavoro veramente tardi!!  appena ho due minuti disponibili da dedicare ad arduino provo, grazie di nuovo

CFabio65

Salve a tutti, purtroppo solamente oggi sono riuscito (causa impegni lavorativi) a mettere mano ad Arduino, sono riuscito grazie alle vs. indicazioni a effettuare la modifica del codice, e devo dire chè funziona in modo corretto, quindi ogni sensore comunica con Arduino il quale cambia stato ad ogni apertura e ad ogni chiusura, (posto il codice modificato)


Code: [Select]
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
bool portachiusa = true;
bool camerachiusa = true;
bool bagnochiuso = true;
#include <IRremote.h>
IRsend irsend;

int khz = 38;                                                          // Modulazione di Frequenza trasmettitore IR
unsigned int powerOff[] = {3464, 1700, 516, 1208, 440, 1280, 440, 428, 436, 432, 520, 352, 492, 1232, 436, 428, 436, 432, 496, 1224, 444, 1280, 516, 352, 512, 1216, 516, 352, 440, 424, 492, 1228, 516, 1212, 516, 352, 492, 1260, 408, 1288, 516, 352, 496, 372, 460, 1264, 436, 428, 488, 380, 520, 1216, 440, 428, 460, 412, 464, 404, 492, 372, 440, 428, 460, 412, 440, 428, 440, 428, 436, 432, 444, 428, 492, 372, 492, 376, 488, 376, 440, 428, 456, 412, 496, 368, 436, 436, 492, 372, 524, 352, 440, 428, 440, 428, 488, 376, 492, 376, 500, 372, 440, 424, 492, 372, 496, 1228, 436, 432, 436, 436, 460, 408, 492, 372, 492, 376, 500, 1224, 444, 424, 440, 424, 496, 384, 436, 436, 496, 368, 432, 432, 496, 372, 496, 368, 444, 424, 516, 356, 436, 1288, 496, 1224, 496, 376, 488, 376, 488, 1232, 500, 368, 496, 1228, 516, 356, 500, 368, 444, 424, 440, 1284, 500, 364, 492, 376, 436, 432, 432, 1292, 492, 1232, 512, 1212, 464, 1272, 460, 1260, 524, 352, 492, 372, 492, 372, 496, 372, 460, 408, 436, 440, 492, 372, 460, 408, 488, 380, 436, 432, 444, 420, 496, 372, 464, 404, 460, 408, 488, 380, 488, 376, 488, 376, 488, 380, 488, 380, 496, 368, 444, 424, 440, 428, 440, 428, 456, 408, 436, 432, 468, 404, 440, 428, 436, 432, 444, 424, 464, 400, 444, 420, 444, 424, 464, 404, 440, 424, 440, 424, 444, 420, 444, 424, 464, 404, 440, 424, 440, 432, 468, 400, 444, 420, 444, 424, 444, 420, 444, 424, 440, 428, 440, 424, 440, 428, 436, 432, 444, 424, 444, 424, 440, 424, 440, 428, 440, 1280, 492, 376, 436, 432, 444, 420, 468};





void setup()
{
  Serial.begin(9600);
  mySwitch.enableReceive(0);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  irsend.enableIROut(khz);
  delay(1000);
  Serial.println(F("Analisi"));
  digitalWrite(11, HIGH);
  digitalWrite(6, HIGH);
  digitalWrite(8, HIGH);
}

void loop() {


    if (mySwitch.available()) {

    long value = mySwitch.getReceivedValue();


    if (value == 2022535)
    if (portachiusa)

      {
        portachiusa = !portachiusa;
        Serial.println(" (PORTA  INGRESSO APERTA) CODICE (2022535) ");       
        digitalWrite(5, HIGH);
        delay(100);
        digitalWrite(5, LOW);       
        digitalWrite(11, LOW);
        digitalWrite(12, HIGH);
        delay(500);       
        digitalWrite(4, HIGH);
        delay(200);
        digitalWrite(4, LOW);
        for (int i = 0; i < 3; i++)
        irsend.sendRaw(powerOff, sizeof(powerOff) / sizeof(int), khz);
        delay(16);
        irsend.sendRaw(powerOff, sizeof(powerOff) / sizeof(int), khz);       
        mySwitch.resetAvailable();
      }

      else

      {
        portachiusa = !portachiusa;
        Serial.println(" (PORTA  INGRESSO CHIUSA) CODICE (2022535) ");
        digitalWrite(5, HIGH);
        delay(100);
        digitalWrite(5, LOW);
        digitalWrite(11, HIGH);
        digitalWrite(12, LOW);
        delay(1000);
        mySwitch.resetAvailable();
      }

    else

   
    if (value == 615047)
    if (camerachiusa) ecc.   

il codice si ripete per ogni sensore.






adesso durante le varie prove di funzionamento, mi sono accorto di avere tralasciato un aspetto abbastanza significativo, che consisterebbe nella necessità di poter inserire un ritardo del comando di spegnimento ad es. 120000 ms, quindi: apro la porta, il sensore invia un ipulso, Arduino riceve il codice lo riconosce, attende 120000 ms. prima di inviare il comando di spegnimento.

Potrebbe essere una cosa fattibile, se durante il tempo di attesa la porta ritorna allo stato chiusa  il comando viene annullato, e il sistema ritorna in attesa per il prossimo comando?

se si, dove posso sbattere la testa?  grazie Fabio.

Go Up