Sensore PIR, che ne dite di questo mio algoritmo?

salve ragazzi.... mi sto cimentando con il mio progetto...

provando e riprovando un sensore pir mi sono accorto che il sensore scattava ad ogni minimo movimento. non volendo ciò ho scritto queste due righe di codice per poter accertarmi che il sensore scatti se e solo se ci sia una persona in casa che rovisti un po' di roba...

che ve ne pare di questo codice( bozza ovviamente) potrei migliorarlo ancora??

int led = 13;
int sen = 10;
int contatore = 0;


void setup() {                

  pinMode(led, OUTPUT);  //led di verifica
  pinMode(sen, INPUT);  // ingresso out del sensore pir
}

void loop() {
  if (digitalRead(sen) == HIGH){
    contatore = 1;
    delay(5000);
    if (digitalRead(sen) == HIGH){
      contatore = contatore +1;
    }

  }
  else { 
    contatore = 0;
  }
  if (contatore == 2){
    digitalWrite(led, HIGH);
    delay(3000);  
  }
  else{
    digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
    // wait for a second
  }
}

Vuoi veramente una risposta sincera?

Se il sensore rileva presenza 2 volte a distanza di 5 secondi accendi il LEd per 3 secondi.

Si puó programmare senza l'uso della variabile contatore.

int led = 13;
int sen = 10;

void setup() {                
  pinMode(led, OUTPUT);  //led di verifica
  pinMode(sen, INPUT);  // ingresso out del sensore pir
}

void loop() {
  if (digitalRead(sen)){
    delay(5000);
    if (digitalRead(sen)){
    digitalWrite(led, HIGH);
    delay(3000);  
    digitalWrite(led, LOW);  
    // delay(1000);  // nel comento é scritto di aspettare 1 secondo.
    }
  }
}

ah... certo che voglio una risposta sincera... sbagliando si impara....

magri è sbagliato proprio come lo sto utilizzando io... se a voi viene qualche idea migliore che ben venga...

cm potrei fare senza scrivere righe di codice inutilile?

skosso:
cm potrei fare senza scrivere righe di codice inutilile?

In informatica non esiste un solo modo per fare una cosa, esistono tanti modi diversi. Alcuni sono semplici da implementare, altri esosi di risorse, altri complessi e così via.
Solo con l’esperienza arrivi al giusto mix per ottenere del buon codice.

skosso: ah... certo che voglio una risposta sincera... sbagliando si impara....

magri è sbagliato proprio come lo sto utilizzando io... se a voi viene qualche idea migliore che ben venga...

cm potrei fare senza scrivere righe di codice inutilile?

Forse ci spieghi cosa vuoi che faccia il programma. Ciao Uwe

il programma sostanzialmente è una centrale antifurto.... nel progetto principale ho già implementato (tanto per utilizzare più risorse possibili di arduino) un sensore gas, sensore temperatura, un sensore antimanomissione della scatola stessa, un display una shield gprs... il tutto attivabile con chiave o con tastiera a codice ma non ho ancora iniziato qui...

le linee di codice che vi ho mostrato è una bozza sul comportamento di uno dei sensori PIR. provandoli e testandoli mi sono accorto che sti sensori erano un po' troppo sensibili per i miei gusti, volevo solo abbassarne la sensibilità o meglio voglio che il sensore debba scattare 2 volte nell'arco di 5 secondi prima di inviare il segnale alla gprs shield e far partire tutto il sistema d'allarme, tutto questo è per eliminare un falso allarme accidentale

Attento con l’uso dei delay, blocchi il resto del programma. Ossia, se infili il tuo codice in un delay(5000), tutto il sistema si ferma per 5 secondi, quindi nessun controllo sul resto verrà fatto.

Devi usare dei controlli basati su millis.

Egocentricamente potrei anche suggerirti di usare il mio scheduler leOS. Si tratta essenzialmente di una libreria che permette di far eseguire dei piccoli task in background in maniera indipendente dal loop del programma principale. Se devi leggere un sensore ogni xxx ms/secondi potrebbe fare al caso tuo. L’unico inconveniente è che usa il timer 2 per cui se hai altre librerie che sfruttano questo contatore interno va in conflitto con esse.
http://arduino.cc/forum/index.php/topic,111732.0.html

Leo... sai che ci avevo pensato ai delay?... non sto usando librerie aggiuntive quindi penso vada tutto liscio come l'olio.... do un occhiata al tuo link.... grazie...

leOS può essere ricorsivo? cioè

un VOID può contenere myOS.addTask che richiama lo stesso void?

sembra funzioni bene così

#include <SoftwareSerial.h>
#include <String.h>
#include <leOS.h>
SoftwareSerial mySerial(7, 8);
int ledcontrollo = 13; //led di controllo stato sensore PIR
leOS myOS;
int sen = 10; //porta sensore PIR
int allarme = 0; //variabile di controllo attivazione/disattivazione allarme
void setup()
{

  mySerial.begin(19200);  //inizializzazione shield gprs
  myOS.begin();  //inizializzazione myOS
  myOS.addTask(controllo, 1000); //aggiunta task della classe controllo
  pinMode(sen, INPUT);  //pin di input sensore PIR
  pinMode(ledcontrollo, OUTPUT);
  delay(500);
  
  
}

void loop()           
{
  if (allarme >= 3) {   //condizione sufficiente necessaria per l'attivazione dell'allarme
    DialVoiceCall();
    delay(10000);
  }



}

void SendTextMessage()
{
  mySerial.print("AT+CMGF=1\r");    //Because we want to send the SMS in text mode
  delay(100);
  mySerial.println("AT + CMGS = \"+86138xxxxx615\"");//send sms message, be careful need to add a country code before the cellphone number
  delay(100);
  mySerial.println("A test message!");//the content of the message
  delay(100);
  mySerial.println((char)26);//the ASCII code of the ctrl+z is 26
  delay(100);
  mySerial.println();
}

void DialVoiceCall()
{
  mySerial.println("ATD + +390932990363;");//dial the number
  delay(100);
  mySerial.println();
}

void controllo()  //classe pubblica controllo sensore PIR
{
  if (digitalRead(sen) == HIGH)
  {
    digitalWrite(ledcontrollo, HIGH);
    allarme = allarme + 1;
    myOS.addTask(controllo, 1000);

  }
  else
  {
    allarme = 0;
    digitalWrite(ledcontrollo, LOW);
  }






}

una cosa, ma la ricorsione del leOS funziona?...... inizia a venirmi qualche dubbio ora...

La chiamata ricorsiva di una funzione senza un controllo del numero o un altro modo per limitare le chiamate recursive non va mai bene. Riempi lo Stack e il programma si blocca.

Ciao Uwe

Il leOS non è stato scritto per essere ricorsivo. in mcu con risorse limitate è controptoducente

oggi ho fatto la mia prima giornata di test cn questo stralcio di codice... non si è bloccato niente.

uwefed mi hai fatto venire qualche dubbio però... potresti spiegarmi meglio non vorrei trovarmi in una situazione del genere....

grz

La programmazione ricorsiva è la programmazione che usa particolari funzioni capaci di richiamare sé stessi. La ricorsività permette di semplificare il codice a livello di stesura dello stesso ma al prezzo di un aumento delle risorse necessarie perché ogni volta che viene chiamata la funzione diversi dati devono essere memorizzati per poter poi recuperare il punto in cui era stata fermata la sua esecuzione. Un caso banale è ad esempio il calcolo della sequenza di Fibonacci. Un altro uso è dato dall'algoritmo QuickSort.

Spesso però l'iterazione (cioè la ripetizione) di un blocco di codice porta ad un codice meno "elegante" ma ad un calcolo più efficiente perché la ricorsione come detto consuma risorse

Ma l'algoritmo che c'entra in tutto questo? I sensori non attivano il contatto per un movimento irrilevante, bisogna vedere che materiali usi. Noi lo chiamiamo semplicemente "discriminatore di impulsi" e nelle centrali di allarme esistono dal tempo di adamo ed eva :) Questo controllo lo possiedono già i sensori al loro interno, normalmente non serve una verifica software. Per quanti accorgimenti fai sul programma è sempre l'occhio che vuole la sua parte (il sensore). Usa prodotti più efficienti e non avrai bisogno di sbattimenti matematici ]:D, questo è un consiglio per fare un impianto di allarme decente, capisco che è a risparmio, ma su queste cose il risparmio è uguale a ciofeca :D