sensori pir ,problema reset variabili

salve
sono nuovo del forum e soprattutto nell'uso di arduino .
sto usando arduino uno rev-3 .
stavo provando a fare un esperimento di un allarme con due sensori pir che vanno ad accendere ognuno il proprio led corrispettivo per poi dopo un delay di 100 ms resettare le variabili che ospitavano al loro interno il valore letto da arduino corrispondenti allo stato dei due sensori .
quindi dopo aver caricato il sketch , arduino accende i led corrispondenti ai sensori pir quando questi ultimi vengono fatti eccitare , ma dopo le luci non si spengono per poter ripetere il ciclo e come se le variabili non si resettassero .
premesso che l'errore non si trovi nel circuito , ma nel sketch .
questo è lo sketch :

int segnal1 = 1;
int segnal2 = 2;
int led1   = 3;
int led2   = 4;
int variable1 =0;
int variable2 =0;
void setup() 
{
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(segnal1,INPUT);
  pinMode(segnal2,INPUT);
  }
void loop ()
{
  variable1=digitalRead(segnal1);
  variable2=digitalRead(segnal2);
  delay(250);
  if (variable1==HIGH) digitalWrite(led1,HIGH);
  if (variable2==HIGH) digitalWrite(led2,HIGH);
  delay(100);
 if (variable1==HIGH) digitalWrite (variable1,LOW);
 if (variable2==HIGH) digitalWrite (variable2,LOW);
 delay(100);

  
 }

qualcuno sa come uscirne ?
si accettano anche solo consigli :slight_smile:

immagino tu usi un pir 501, hai regolato a modo il potenziomentro che regola il tempo quando rileva un movimento?
Prova con un tester a vedere quanto dura il cambio di stato del segnale dopo che fai leggere il PIR.

scama04:
salve sono nuovo del forum e soprattutto nell'uso di arduino .

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

ciao

scama04:
si accettano anche solo consigli :slight_smile:

Eccone alcuni:

-Non usare i pin 0 e 1, servono per la comunicazione seriale
-Usa la seriale per fare un po' di debug: nel setup metti Serial.begin(9600); e poi all'interno del loop metti un Serial.println() della variabile che utilizzi così vedi che valore ha rispetto a quello che ti aspetti. Dopo che caricato il prigramma nell'arduino apri il monitor seriale (icona a forma di lente in alto a dx) e vedi che succede.
-Se possibile evita di usare delay(); meglio se riesci a utilizzare millis così non blocchi il codice.

Adesso vediamo lo sketch:

  variable1=digitalRead(segnal1);
//
  if (variable1==HIGH) digitalWrite(led1,HIGH);
//

Questo si può semplificare scrivendo:

if (digitalRead(segnal1)) digitalWrite(led1,HIGH);

ciao
pippo72

ri-eccomi
grazie gazza_mo ,nid69ita ,pippo72 per le vostre risposte veloci
per nid69ita ,ho fatto la mia presentazione li dove mi hai linkato spero vada bene :slight_smile:
per gazza_mo e pippo72 ,domani proverò i vostri suggerimenti sperando di riuscirli a capirli , non e colpa vostra ma non sono cosi bravo da capire un linguaggio cosi alto mi spiace , comunque sia domani cercherò di provare i suggerimenti e vedrò cosa ne salta fuori , speriamo bene , vi faro sapere :slight_smile:
p.s. per pippo 72 millis non so come si usa , hai una guida valida ? se si linkamela grazie
grazie mille a tutti :slight_smile:

Per come si usa la millis(), studiati prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo

 if (variable1==HIGH) digitalWrite (variable1,LOW);

Stai definendo il pin di Arduino con il valore della variabile di stato. Usa led1 e led2.

Ciao Uwe

ri buongiorno
qualcosa ho combinato ma nulla di ottimo :frowning:
-ho cambiato il numero di sensori a 4 come era il mio progetto originale :wink:
-non ho usato delay ma millis come suggerito da pippo72
-non ho usato le entrate 0 e 1 digitali

  • ho usato sempre su suggerimento di pippo72 le funzioni seriali (penso che si chiamino cosi ma non ne sono certo )

    effetto ottenuto : i led a differenza di ieri che si accendevano e poi rimanevano tali ora pulsano
    ho usato questo skethc :
int segnale1= 2;
int segnale2= 3;
int segnale3= 4;
int segnale4= 5;
long primoconto = 0;
int ledpresenza1 = 6;
int ledpresenza2 = 7;
int ledpresenza3 = 8;
int ledpresenza4 = 9;
int variabile1 =0;
long intervallo = 500;

void setup () {
  pinMode(segnale1,INPUT);
  pinMode(segnale2,INPUT);
  pinMode(segnale3,INPUT);
  pinMode(segnale4,INPUT);
  pinMode(ledpresenza1,OUTPUT);
  pinMode(ledpresenza2,OUTPUT);
  pinMode(ledpresenza3,OUTPUT);
  pinMode(ledpresenza4,OUTPUT);
  Serial.begin(9600);
  }
void loop () {
  unsigned long conto = millis();
  Serial.println("inizio controllo sensori e segnalazione intrusione ");
  if (digitalRead(segnale1==HIGH)) digitalWrite(ledpresenza1,HIGH);
  if (digitalRead(segnale2==HIGH)) digitalWrite(ledpresenza2,HIGH);
  if (digitalRead(segnale3==HIGH)) digitalWrite(ledpresenza3,HIGH);
  if (digitalRead(segnale4==HIGH)) digitalWrite(ledpresenza4,HIGH);
  
  Serial.println("azzeramento stato eccitazione") ;
  if (conto-variabile1 > intervallo) {
    digitalWrite(ledpresenza1,LOW);
    digitalWrite(ledpresenza2,LOW);
    digitalWrite(ledpresenza3,LOW);
    digitalWrite(ledpresenza4,LOW);
    }
   }

metto pure un immagine magari serve :slight_smile:

il problema e che lampeggiano ed come se leggessero che ogni istante qualcosa si muova ma non e cosi :frowning:
chi può mi aiuti
grazie mille in anticipo :slight_smile:

ciao

Alcuni consigli (parte seconda :wink: )

Penso ti convenga prima far funzionare 1 sensore e dopo che tutto funziona aggiungere gli altri; non cambia niente ma almeno hai uno sketch più corto e meno distrazioni.

Mi sa che non hai studiato bene i link che ti ha passato Guglielmo. Le variabili che hanno a che fare con millis devono essere dichiarate come unsigned long e comunque non hai ben compreso come utilizzare millis. Concettualmente al verificarsi di un evento (tasto premuto) assegni a una variabile il valore di millis (tu lo hai messo nel loop e non ha tanto senso) e poi verifichi continuamente se il valore salvato + il tempo di ritardo impostato è maggiore di millis; quando questo è vero sai che il tempo che hai impostato è passato quindi fai quello che ti serve.
Però c’è un però: se non controlli se si è gia verificato l’evento andrai a “azzerare” il tuo contatore continuamente. Qui entrano in gioco le variabili di stato (anche dette flag) e la logica del programma cambia così: in partenza la variabile pippo (nome a caso :wink: ) è false; quando si verifica un evento E pippo è false allora si assegna il valore di millis a una variabile e si imposta pippo a true. Il secondo controllo (quello per spegnere) lo devi fare chiaramente solo se pippo è true quindi se tempo salvato + ritardo maggiore di millis E pippo = true spegni il led e riporti pippo a false.

ciao
pippo72

pippo72:
Mi sa che non hai studiato bene i link che ti ha passato Guglielmo ....

Che ci vuoi fare pippo72, purtroppo non è né il primo né l'ultimo che ... "legge" invece di "studiare" ... :confused: :confused: :confused:

Guglielmo

ciao
scusa gpb01 , ma è il meglio che posso fare se mi è stata fornita un istruzione scolastica di scarso livello pur avendo fatto una scuola di perito elettromeccanico :frowning:
tolto questo , grazie pippo 72 correggo appena posso lo sketch ,anzi lo proverò a riscrivere da capo perché ho letto stamattina di sketch che tra l'altro ho provato e funziona :

int segnal   = 3;
int ledGreen = 4;
int ledRed   = 5;
 
void setup()
{
  pinMode( ledGreen, OUTPUT );
  pinMode( ledRed, OUTPUT );
 
  digitalWrite( ledGreen, LOW );
  digitalWrite( ledRed, LOW );
}
 
void loop()
{
  int pirSegnal = digitalRead( segnal );
  int pirSegnal2= (pirSegnal == HIGH)? LOW:HIGH;
 
  digitalWrite( ledGreen, pirSegnal );
  digitalWrite( ledRed, pirSegnal2 );
 
  delay(100);
}

devo provare a capire cosa sono ste parentesi scritte col punto interrogativo :

(pirSegnal == HIGH)?

e sopratutto cosa vuol dire :

LOW:HIGH

adesso provo e vi farò sapere .
grazie :slight_smile:

scama04:
devo provare a capire cosa sono ste parentesi scritte col punto interrogativo :

(pirSegnal == HIGH)?

e sopratutto cosa vuol dire :

LOW:HIGH

adesso provo e vi farò sapere .
grazie :slight_smile:

Ciao, è un costrutto C equivalente all'if. Tutto ciò che è anteposto al ? è la condizione, dopo il ? c'è il codice da eseguire se la condizione è vera e infine dopo i : il codice da eseguire se la condizione è falsa
il codice

int pirSegnal2= (pirSegnal == HIGH)? LOW:HIGH;

lo puoi scrivere in forma

int pirSegnal2;
if(pirSegnal == HIGH){
pirSegnal2= LOW;
}
else{
pirSegnal2= HIGH;
}

oppure

int pirSegnal2 = HIGH;
if(pirSegnal == HIGH){
pirSegnal2= LOW;
}

o infine (ancora meglio di tutti secondo me perchè sfrutta l'algebra di boole senza l'uso dell'if)

int pirSegnal2= !pirSegnal;

grazie fabpolli :slight_smile: ora ho capito cosa era :slight_smile:

int statosensore1=2;
int statosensore2=3;
int statosensore3=4;
int statosensore4=5;
int statoled=6;
void setup(){
  pinMode(statoled,OUTPUT);
  pinMode(statosensore1,INPUT);
  pinMode(statosensore2,INPUT);
  pinMode(statosensore3,INPUT);
  pinMode(statosensore4,INPUT);
  
void loop(){
  
  
  
if((digitalRead(statosensore1))==LOW)
  digitalWrite(statoled,LOW); 
  Serial.println("nessun intrusione");
  }
else{
   digitalWrite(statoled,HIGH);
  Serial.println("intrusione punto 1");
  };
if ((digitalRead(statosensore2))==LOW){
  digitalWrite(statoled,LOW);
  Serial.println("nessun intrusione");
  }
else{
   digitalWrite(statoled,HIGH);
  Serial.println("intrusione punto 2")
  };
if ((digitalRead(statosensore3))==LOW){
  digitalWrite(statoled,LOW);
  Serial.println("nessun intrusione");
  }
else{
   digitalWrite(statoled,HIGH);
  Serial.println("intrusione punto 3");
  };
if ((digitalRead(statosensore4))==LOW){
  digitalWrite(statoled,LOW);
  Serial.println("nessun intrusione");
  }
else{
   digitalWrite(statoled,HIGH);
  Serial.println("intrusione punto 4");
  };

}

ora ho fatto questo di sketch ma mi da errore nella compilazione , mi dice che manca if prima di else però io l'ho messo :frowning:
chi sa dove è l'errore lo ringrazio tanto se me lo spiega :wink:

Guarda bene cosa hai scritto ...

if((digitalRead(statosensore1))==LOW)
  digitalWrite(statoled,LOW); 
  Serial.println("nessun intrusione");
  }
else{

... conta le parentesi tonde e le graffe ... :smiley:

Guglielmo

P.S. : Mi sono fermato li, poi magari ci sono anche altri errori, ma non ho guardato ... :wink:

grazie gpb01
ho corretto tutto e aggiunto nel setup serial.begin(9600)
adesso funziona tutto come volevo :slight_smile:
grazie mille a tutti
;D ;D ;D ;D ;D ;D ;D ;D