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
}
}
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.
}
}
}
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.
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...
#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);
}
}
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.
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