Salve a tutti, ho riscontrato qualche problemuccio nell'utilizzo di questo sensore.
Ho comprato il sensore da futurashop: Servizio di incisione e taglio laser - FuturaShop
Ho seguito questa guida: http://bildr.org/2011/06/pir_arduino/
E il sensore funziona perfettamente, o almeno aprendo il serial, scrive "Movement detect" quando passo la mano davanti il sensore.
Il problema si presenta quando modifico il programma, cosi:
Ecco in questo caso il sensore "sballa" e anche nel monitor seriale scrive continuamente con una frequenza di 2 secondi (come nel delay) motion detect, anche se nulla si muove, se stacco il led, si ri-stabilizza.... Mi aiutate ?
Scusate, innanzitutto mi presento, mi chiamo Raffaele, ho 17 anni e frequento un istituto tecnico industriale di Catania. La mia passione per Arduino è cominciata quando la professoressa di sistemi lo ha spiegato per la prima volta, e fu amore a prima vista ahah! Grazie per le vostre risposte!
Ciao,
le presentazioni si fanno QUI e poi cerca di leggere con attenzione il REGOLAMENTO, difatti ...
... il codice DEVE essere racchiuso negli apposti tag CODE (come da regolamemto).
Poi ... il pin digitale a cui hai collegato il PIR (che mi sembra chiuda verso GND visto che testi la condizione LOW) è tenuto normalmente alto da una pull-up ???
Mi scuso per non aver letto il regolamento prima di aver pubblicato il post.
Avendo letto il regolamento con attenzioni, decido di chiedere ancora aiuto, poiché prima di chiedere ho preso visione di molti post su questo forum riguardanti questo sensore e altrettanti altri post in giro per il web che ho cercato su google o su youtube.
Ho applicato una resistenza da 10 kilohm di pul - up, e ripeto il programma funziona correttamente se non collego il led
Non puoi usare una delay, perchè quella istruzione "blocca" Arduino per ben 2 secondi.
Per fare 2 cose insieme (gestire Pir e accendere led) devi vedere e capire l'esempio BlinkWithoutDelay
nid69ita:
Non puoi usare una delay, perchè quella istruzione "blocca" Arduino per ben 2 secondi.
....
Ma Nid, non è quello il suo problema ... sembra che con il LED collegato non gli funziona più bene il circuito !
@ RaffaeleP : Se ho ben capito, con il LED collegato al pin 6 (... spero bene con una resistenza per limitare la corrente, perché in caso contrario rischi di bruciare pin e/o LED), hai comunque una condizione di allarme ... giusto ???
Si la condizione è quando il livello del pir si trova a livello "0" quindi LOW.
Ho rimontato il circuito mettendo un buzzer apposto del led collegato nel pin "9" cambiando opportunamente il programma e stranamente FUNZIONA! cioè mi spiego meglio con la funzione tone(buzzer,frequenza,durata); il programma funziona a meraviglia, passo la mano suona e dopo 2 secondi ritorna a livello 1, il problema è il led.
Edito scrivendo risolto.
Si, ho messo una resistenza sul led da 330 ohm, in ogni caso non mi sono arreso ma ho verificato che il delay non ci vede essere!
Non so per quale oscuro motivo ma funziona.. bah!
Effettivamente non l'ho capito come mai non funzioni col delay!
Ho riscontrato nuovamente il problema ed ho visto una cosa alquanto strana.
#include<Servo.h>
int pulsante=6;
int statopulsante=0;
int ledporta=13;
int fotores=A0;
int statofoto=0;
int ledgia=8;
int pir=7;
int statopir=0;
int buzzer=10;
int frequenza=290;
int durata=50;
Servo servo1;
void setup() {
servo1.attach(9);
servo1.write(0);
pinMode(pulsante,INPUT);
pinMode(ledporta,OUTPUT);
pinMode(fotores,INPUT);
pinMode(ledgia,OUTPUT);
pinMode(buzzer,OUTPUT);
pinMode(pir,INPUT);
Serial.begin(9600);
}
void loop() {
statopulsante=digitalRead(pulsante);
statofoto=analogRead(fotores);
statopir=analogRead(pir);
Serial.println(statopir);
if(statopir<=130){
tone(buzzer,10,100);
delay(2000);
}
if (statopulsante==HIGH){
digitalWrite(ledporta,HIGH);
servo1.write(0);
delay(6000);
Serial.println(statopulsante);
}
else {
digitalWrite(ledporta,LOW);
servo1.write(140);
delay(300);
}
if (statofoto<=500){
digitalWrite(ledgia,HIGH);
delay(15);
}
else {
digitalWrite(ledgia,LOW);
delay(15);
}
}
Tutto funziona a meraviglia, il servo gira, i led si illuminano e tutto è funzionante! Se non fosse per questo cavolo di pir che "entra" in campo quando non deve entrare!
Cioè carico il programma sulla scheda, faccio la prima prova: quella di passare la mano davanti il pir: Squilla il buzzer, levo la mano e tutto funziona; step 2: provo il sensore di luminosità, oscuro la foto resistenza e i led si accende! GRANDE! peccato che parte di nuovo il buzzer come se il sensore rivela un cambiamento, peccato non ci sia passato nessuno da li. Ho pensato fosse la luce ma anche coprendo il sensore stesso effetto. Allora ho pensato di leggere i valori del pir in modo anologico e cosa molto inaspettata ogni qual volta si accende un led o faccio un'altra azione di quel programma il valore del pir scende da 600 a 190 circa, e adesso quando passo la mano non funziona piu.. AIUTATEMI!
Primo, usa la funzione dell'IDE Tools -> Auto Format per sistemare quel codice che così non si può guardare ... la leggibilità è fondamentale, secondo ... fai un disegno fatto bene degli esatti collegamenti che hai ...
... che voglio capire cosa hai fatto ...
Ok, io non sarò chissà che programmatore e sono alle primissime armi visto che avendo 17 anni e dovendo studiare 9 materie, cerco di dedicare tempo uguale a tutte. Anche se la mia passione per Arduino è folle sto cercando di imparare, quindi tutte le critiche sono ben accette, ma vorrei che siano anche specifiche.. Che vuol dire codice disordinato? La mia professoressa di Sistemi mi ha detto che si deve strutturare così: librerie, variabili, setup, dichiarazione pin, loop ecc..
Cmq ho notato di aver attaccato il pin "AL" del sensore in un pin digitale, ma ho sistemato di nuovo il tutto cambiando da analogRead a digitalRead e il programma funziona sempre nella stessa maniera, qui posto anche il disegno del sensore collegato ad Arduino.
RaffaeleP:
Che vuol dire codice disordinato? La mia professoressa di Sistemi mi ha detto che si deve strutturare così: librerie, variabili, setup, dichiarazione pin, loop ecc..
Non disordinato ma NON indentato. La prof ti ha spiegato cosa vuol dire indentare il codice? E' molto importante per la leggibilità.
Per il discorso di dividere il codice come ti ha indicato la prof va bene.
Se tu scrivi:
if(x>10) {
if(x==40) {
y=10;
}
}
Non si capisce una mazza. Con il CTRL+T l'IDE ti aiuta ad indentare:
if(x>10) {
if(x==40) {
y=10;
}
}
Così è più leggibile, soprattutto quando hai codice lungo e con molti if, while, for.
Ancora un consiglio sul codice. Hai fatto bene a dare un nome con davanti "stato" alle variabili che conterranno i valori letti, sarebbe meglio tu facessi lo stesso con le variabili che indicano i pin, mettendo davanti "pin". Inoltre queste variabili le puoi dichiarare "const byte" così occupano meno:
Invece di così:
RaffaeleP:
Ok, io non sarò chissà che programmatore e sono alle primissime armi visto che avendo 17 anni e dovendo studiare 9 materie, cerco di dedicare tempo uguale a tutte. Anche se la mia passione per Arduino è folle sto cercando di imparare, quindi tutte le critiche sono ben accette, ma vorrei che siano anche specifiche.. Che vuol dire codice disordinato? La mia professoressa di Sistemi mi ha detto che si deve strutturare così: librerie, variabili, setup, dichiarazione pin, loop ecc..
Come puoi ben capire non è che tutto quello che hai detto influenzi minimamente il mio giudizio e non faccio certo questioni di età (... neanche la sapevo) ... ne faccio una questione di LEGGIBILITA' !
Come ti ha detto Nid, oltre a come strutturare logicamente un programma, esistono anche delle buone norme su come strutturarlo ... fisicamente e ... se avessi seguito il mio suggerimento di usare Tool -> Auto Format ... avresti capito la mia critica
RaffaeleP:
Cmq ho notato di aver attaccato il pin "AL" del sensore in un pin digitale, ma ho sistemato di nuovo il tutto cambiando da analogRead a digitalRead e il programma funziona sempre nella stessa maniera, qui posto anche il disegno del sensore collegato ad Arduino.
Tornando al tuo problema e guardando lo schema che hai fatto ...
... ma hai letto le caratteristiche di quel PIR che hai linkato ??? Riporto la voce ... più importante ...
Alimentazione: 12 Vdc
... va alimentato NON con i 5V di Arduino, ma con una alimentazione a parte da 12V, altrimenti ... i malfunzionamenti sono garantiti !!!
Ha ... ovviamente NON puoi mettere quella resistenza verso i +12 o distruggi il pin di Arduino ... devi usare o la pull-up interna o mettere una resistenza esterna verso i +5V.