Ricezione Telecomando Apricancello

Salve a tutti! Sono nuovo del forum ma è un po' di tempo che utilizzo Arduino per vari progetti. In questo momento sto cercando di realizzare una scheda che legga il segnale del mio apricancello (433.92MHz) e faccia accendere le luci del mio vialetto. Per leggere il segnale ho comprato questo ricevitore:

http://www.ebay.it/itm/151220225611?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1423.l2649

Ho collegato l'uscita del ricevitore al mio oscilloscopio e ho visto che, oltre a ricevere in modo corretto il segnale del mio telecomando, riceve un'altra marea di segnali!

Lo sketch che ho scritto per memorizzare il codice e testarne la ricezione è questo:

int led = 13;
int rec = 12;
int data[52];

void setup() {                
  pinMode(led, OUTPUT);     
  pinMode(rec, INPUT);    
  Serial.begin(9600); 
}


void loop() {
 if (digitalRead(rec)==HIGH){
     //digitalWrite(led, HIGH);
     delayMicroseconds(200);
     if (digitalRead(rec)==HIGH){
       for(int i=0; i<=52; i++){
         data[i] = digitalRead(rec); 
         delayMicroseconds(250);  
       }
     }
     for (int j=0; j <= 52; j++) {
       Serial.print(data[j]);
       Serial.print(" ");
     }
     Serial.println(" ");
    // digitalWrite(led, LOW);
     delay(100);
 }
 
}

In questo modo mi vengono stampati sul SerialMonitor circa 100 segnali "indesiderati" in 5 minuti.

Volevo sapere se esiste qualche modo per diminuire il numero di segnali "indesiderati" ricevuti.
Ho pensato di risolvere il problema via software ma mi chiedevo se l'ATMega328 può lavorare ininterrottamente a questi ritmi senza danneggiarsi.

Ho già provato ad utilizzare la libreria VirtualWire ma senza nessun risultato.

Vi ringrazio molto per il vostro aiuto, senza questa comunità molti dei miei progetti sarebbero abortiti!!!

Ogni radiocomando ha una "firma" identificativa (codice) e, se tu la conosci, puoi filtrare via sofware quelli che iniziano diversamente.

18nico88:
...
Ho pensato di risolvere il problema via software ma mi chiedevo se l'ATMega328 può lavorare ininterrottamente a questi ritmi senza danneggiarsi.
...

:astonished: :astonished: :astonished: ... non stai parlando di un oggetto che ha uno stress meccanico, e non esiste il concetto di "lavorare ininterrottamente a questi ritmi" ...

La MCU, IN OGNI CASO lavora SEMPRE alla massima velocità che il clock gli permette e, anche se tu, nel tuo programma, pensi di non farle fare nulla, come ad esempio :

void loop() {

}

... in realtà la MCU lavora comunque a pieno ritmo girando in un loop vuoto XD

Quindi ... non ti preoccupare ... :grin: :grin: :grin:

Guglielmo

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

E come fai fai cross-posting ?

Other post will be deleted if it duplicates this one.

Ok, forse mi sono spiegato un po' male!
Più precisamente il dubbio su cui mi interrogavo è se questi microcontrollori possano lavorare ininterrottamente per molto tempo.
Ripeto che ho intenzione di fargli comandare un relè che accenda le luci del vialetto quando arriva il segnale dell'apricancello, fino ad ora mi sono limitato a farli lavorare per periodi di tempo brevi, quindi la domanda posta in forma più corretta è:

l'ATMega328 può lavorare per molto tempo (diciamo 5 anni!!) in questo modo?
(ovviamente ipotizzando che non ci siano cause di danno esterne!)

Vi riporto qui sotto l'evoluzione dello scketch con qui sono riuscito a discriminare il segnale del mio telecomando.

int led = 13;
int rec = 12;
int data[52];
int code[] = {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0};
int status_led = 0;

void setup() {                
  pinMode(led, OUTPUT);     
  pinMode(rec, INPUT);    
  Serial.begin(9600); 
}


void loop() {
 if (digitalRead(rec)==HIGH){
     
     for(int i=0; i<52; i++){
       data[i] = digitalRead(rec); 
       delayMicroseconds(250);  
     }
     if(data[7]==code[7] & data[21]==code[21] & data[32]==code[32] & data[42]==code[42] & status_led == 0){
       
         digitalWrite(led, HIGH);
         for(int i=0; i<52; i++){
           data[i] = 0;
         }
       //  Serial.println("ERROR!!");
         status_led = 1;  
         delay(500);      
     }   
         
      if(data[7]==code[7] & data[21]==code[21] & data[32]==code[32] & data[42]==code[42] & status_led == 1){  
       
       digitalWrite(led, LOW);
       for(int i=0; i<52; i++){
           data[i] = 0;
         }
      // Serial.println("ERROR!!");
       status_led = 0;  
       delay(500);
      } 
     }
       
//     for (int j=0; j <= 52; j++) {
//       Serial.print(data[j]);
//       Serial.print(" ");
//     }
//     Serial.println(" ");
//     delay(2000);
 
}

Per quanto riguarda le presentazioni appena avrò terminato questo progetto scriverò un post nella sezione dei nuovi arrivati!! Grazie!!

18nico88:
...
l'ATMega328 può lavorare per molto tempo (diciamo 5 anni!!) in questo modo?
...

Continuo a non capire questi tuoi dubbi ... :roll_eyes:

Secondo te cosa "affaticherebbe" il ATmega328P ??? Come un qualsiasi componente elettronico ha una sua "vita media" ... che è del tutto indipendente dal compito che svolge (salvo ovviamente usarlo oltre i limiti imposti dal produttore).

Casomai, quello che accorcia la vita a questi componenti, è la temperatura a cui si fanno lavorare le giunzioni ...
... ma in caso di un uso a temperature normali (Tj tra 100 - 120 gradi) ... parliamo di decine di anni :wink:

Guglielmo