Go Down

Topic: Aiuto per codice (Read 9895 times) previous topic - next topic

ARDURINO


.............................
Intanto prova a far accendere un led quando il sensore A rileva la presenza e appena questo non rileva più la presenza il led deve spegnersi, e questo è abbastanza facile.

In questo modo puoi testare i PIR i LED e il codice singolarmente, ciò significa che testerai i due sensori singolarmente e avrai la certezza che funzionano a correttamente.

Ciao.


Mauro questo l'ho gia' fatto ed i due sensori lavorano a dovere.
I due sensori PIR sono posti ( andranno posti) l'uno in cima alle scale, l'altro in basso .

ARDURINO






Sai usare il Monitor Seriale per verificare il valore delle variabili (debug) ? Hai Arduino collegato al PC per fare le prove?
E' comunque una cosa che è bene imparare, così da verificare da soli cosa stà facendo il programma.
Se si, aggiungi nella setup() come prima istruzione
Code: [Select]
Serial.begin(9600);
Serial.println("avvio");

Poi nella loop al fondo prima della ultima graffa aggiungi:
Code: [Select]
Serial.print("PIRA="); Serial.print(PIR_A);
Serial.print("  PIRB="); Serial.print(PIR_B);
Serial.print("  bAccendiA="); Serial.print(bAccendiA);
Serial.print("  bAccendiB="); Serial.print(bAccendiB);
Serial.println("");

Quando Arduino parte dall'IDE puoi andare nel Serial Monitor (cercalo nel menu) e vedere questi dati su PC che arrivano da Arduino.
[/quote]
Nid ,  ho la scheda ARDUINO collegata al PC.
Provero' a utilizzare il debug seriale ti faccio sapere.


Maurotec

Quindi niente di complicato, tuttavia ancora non è chiaro cosa deve fare.

Studio di un caso.

Esco di casa sono sul pianerottolo, il PIR A prima di questo instante non aveva visto nessuno adesso in questo instante ha visto me: Che azioni deve fare dopo avermi visto?

Scendo le scale e PIR A non rileva più alcuna presenza: Cosa deve fare dopo che non rileva più?

Continuo a scendere le scale, il PIR B in questo istante non rileva alcuna presenza, continuando a scendere si accorge di me e rileva la mia presenza: cosa deve accadere ora che PIR B mi ha visto.

Continuo a camminare non curante di PIR B, ora con i miei sensi da super eroe avverto che PIR B non rileva più alcuna presenza: cosa deve accadere?

Quello qui sopra è uno scenario valido ?
Ci sono altri scenari? se si descrivili (ps: non adesso)

Puoi anche provare a scrivere dello pseudo codice, es:

PIR A non rileva alcuna presenza: cosa faccio? nulla
PIR B non rileva alcuna presenza: cosa faccio? nulla

PIR A all'istante T una presenza: cosa faccio????
PIR A all'instante T+1 non rileva più alcuna presenza: cosa faccio??? es mi serve sapere se a T PIR A o B ha o meno rilevato presenza?

Ora con B, sia quando rileva a T che quando a T+1 smette di rilevare.

Al momento per semplificare diamo per scontato che le scale non possano essere frequentate da più persone contemporaneamente, come se si trattasse di un tunnel in cui ci entra una sola persona e prima che possa entrarne un altra quella all'interno deve uscire. Studieremo il caso in cui più persone frequentano contemporaneamente la scala e anche il caso in cui una persona arriva nella zona in cui né A né B rilavano la sua presenza e torna indietro perché ha dimenticato le chiavi dell'auto.

Ciao.




ARDURINO




Esco di casa sono sul pianerottolo, il PIR A prima di questo instante non aveva visto nessuno adesso in questo instante ha visto me: Che azioni deve fare dopo avermi visto?


ACCENDERE LE LUCI SCALE .
Quote
Scendo le scale e PIR A non rileva più alcuna presenza: Cosa deve fare dopo che non rileva più?

LE LUCI SCALE RIMANGONO ACCESE .
Quote
Continuo a scendere le scale, il PIR B in questo istante non rileva alcuna presenza, continuando a scendere si accorge di me e rileva la mia presenza: cosa deve accadere ora che PIR B mi ha visto.

DEVE SPEGNERE LE LUCI SCALE POSSIBILMENTE PARTENDO DALL'ALTO.

Quote
Continuo a camminare non curante di PIR B, ora con i miei sensi da super eroe avverto che PIR B non rileva più alcuna presenza: cosa deve accadere?


IL SISTEMA SI DEVE RESETTARE ED ESSERE PRONTO A RILEVARE UNA NUOVA PRESENZA . CHE QUESTA VENGA DAL BASSO O DALL'ALTO NON HA IMPORTANZA .O COMUNQUE IL SISTEMA DEVE ESSERE IN GRADO DI ATTIVARSI SE UNA PERSONA SCENDE/SALE  - ESCE/ENTRA.


Quote
Quello qui sopra è uno scenario valido ?

CORRETTO, INECCEPIBILE .

Quote
Ci sono altri scenari? se si descrivili (ps: non adesso)

NON COMPLICHIAMOCI LA VITA PER ORA ...

QUESTO POTREBBE ESSERE UN VALIDO PSEUDOPSEUDO CODICE :

Code: [Select]


[color=red]PSEUDO CODICE[/color]

SISTEMA QUIESCENTE MA pronto ad ATTIVARSI

ALL'INIZIO LUCI SCALE SPENTE

I 2 SENSORI ( PIR SOPRA -  PIR SOTTO ) SONO PRONTI A RILEVARE PRESENZA ( persona sopra o persona sotto).

( esempio A) SENSORE SOPRA (PIR SOPRA) SI ATTIVA ( una persona sta scendendo le scale)

LE LUCI SULLE SCALE SI ACENDONO

LE LUCI RIMANGONO ACCESE FINO A CHE NON VIENE ATTIVATO L'ATRO SENSORE (potrei anche fermarmi sulle scale le luci in questo caso devono rimanere accese).

IL SENSORE IN BASSO ALLE SCALE ( PIR SOTTO) VIENE ATTIVATO DALLA PERSONA CHE STA USCENDO.

A QUESTO PUNTO LE LUCI SULLE SCALE SI SPENGONO

IL SISTEMA TORNA QUESCENTE E PRONTO A REAGIRE DI NUOVO ( qualora SALGA o SCENDA una persona )








[/quote]


gpb01

Ed io, che notoriamente amo incasinare le situazioni ti dico ...

... e che succede se, mentre uno è entrato da sopra, ed è stato rilevato dal PIR A, un altro entra da sotto e viene rilevato dal PIR B ???  ]:D ]:D ]:D

Guglielmo
Search is Your friend ... or I am Your enemy !

elrospo

#20
Feb 07, 2014, 09:16 pm Last Edit: Feb 07, 2014, 09:26 pm by elrospo Reason: 1

AAA Ancora novizio chiede aiuto da esperti.
Ho gia' postato questo problema in altra sede ma purtroppo  problema non risolto.
Sto cercando di azionare dei led per una scala interna utilizzando  due sensori tipo PIR ( uno collocato in basso e l'altro in alto).
Vorrei che il sistema si azioni dopo che uno dei due PIR si attivi , i leds rimangano accesi e poi si spengano qundo l'atro sensore PIR si attivi.
Non vorrey utilizzare la funzione DELAY.
Qualcuno mi ha consigliato di utilizzare la dichirazione VERO/FALSO  ma non so come implementarla nel codice.

Questo che ho postato funziona in parte , i leds tuttavia una volta accesi si spengono autonomamente , non so come modificarlo / correggerlo.
Se qualcuno puo' aiutarmi .

GRAZIE.  

P.S.: i LEDS sono solo due solo come prova .




Code: [Select]
// Esempio 5: accensione di due led comandati da due pulsanti
// con ritardo di spegnimento di due secondi

#define led_1 13   // il pin 13 è usato per il LED
#define led_2 12    // il pin 12 è usato per il LED
#define PIR_pin2 2  // il pin 2 è usato per il sensore SUPERIORE
#define PIR_pin4 4  // il pin 3 è usato per il sensore INFERIORE

// Variabili
int in2 = 0;
int in4 = 0;

void setup() {
 pinMode(led_1, OUTPUT);
 pinMode(led_2, OUTPUT);
 pinMode(PIR_pin2, INPUT);
 pinMode(PIR_pin4, INPUT);
}

void loop()
{
 in2 = digitalRead(PIR_pin2);
 in4 = digitalRead(PIR_pin4);

 if (in2== HIGH){                 // sensore superiore attivato
   digitalWrite(led_1, HIGH);     // accensione LED 1
   delay (500);
   digitalWrite(led_2, HIGH);      // accensione LED 2
   delay (500);                    // ritardo di 2 sec
 }
 else
 {
   digitalWrite(led_1, LOW);       // se il sensore non attivato LED  spenti
   delay (500);
   digitalWrite(led_2, LOW);
   delay (500);
 }

 if (in4 == HIGH){                 // sensore inferiore attivato
   digitalWrite(led_2, HIGH);      // accensione LED 2
   delay (500);
   digitalWrite(led_1, HIGH);      // accendere LED 1
   delay (500);              // ritardo
}
 else
 {
   digitalWrite(led_2, LOW);        // se il sensore inferiore non attivato LED spenti
   delay (500);
   digitalWrite(led_1, LOW);
   delay (500);
 }
}



il tuo codice è "formalmente"  corretto,  devi modificarlo giusto nella condizione che tutti e due i PIR rilevino presenza contemporaneamente  o quasi
if (in2== HIGH && in4 == HIGH  ){ ....che si fa?.... :)   }            

pablos71

#21
Feb 08, 2014, 12:01 am Last Edit: Feb 08, 2014, 12:10 am by pablos Reason: 1

Ed io, che notoriamente amo incasinare le situazioni ti dico ...

... e che succede se, mentre uno è entrato da sopra, ed è stato rilevato dal PIR A, un altro entra da sotto e viene rilevato dal PIR B ???  ]:D ]:D ]:D

Guglielmo


Bravo stavo leggendo tutto per vedere se qualcuno lo aveva anticipato, in effetti questa complicanza di A che poi vede B è una perdita di tempo, ho già realizzato questo sistema in più villette che accendono luci leds su gradini segnapasso comandati da piccoli pir ... basta un temporizzatore comunissimo modulare e i contatti dei rilevatori collegati in parallelo, che ci sia una persona o due o qualcuno sosti sulle scale le luci restano sempre accese, si spegneranno dopo 15-20 sec di assenza termica rilevata dai 2 o più pir (sono dei led il consumo è irrilevante)... quindi se propio vuoi usare un computer con intelligenza artificiale per fare ciò inserisci un semplice timer, ti assicuro che non avrai problemi.
I problemi li avrai sul posizionamento corretto dei pir :)

ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

ARDURINO

#22
Feb 08, 2014, 06:56 pm Last Edit: Feb 08, 2014, 09:52 pm by ARDURINO Reason: 1
OK , questo e' il primo test con piu' LEDS a simulare quelli disposti su una scalinata.

Il video e' il seguente.

http://www.youtube.com/watch?v=kgD31HBSNJQ&feature=youtu.be

Come notate se muovo rapidamente la mano davanti ai sensori , il sistema sembra funzionare egregiamente, ma se mi attardo ( a circa 56 secondi dall'inizio del video ) , i LEDS prima si spengono ma subito dopo si riaccendono .
Come faccio a ritardare la sensibilita' dei sensori affinche' questi non siano subito attivi ?

Questo postato e' l'ultimo codice aggiornato e rivisto.

Code: [Select]

#define led_1 13   // il pin 13 è usato per il LED
#define led_2 12    // il pin 12 è usato per il LED
#define led_3 11  
#define led_4 10  
#define led_5 9  
#define led_6 8  
#define led_7 7  
#define PIR_pin2 2  // il pin 2 è usato per il sensore SUPERIORE
#define PIR_pin4 4  // il pin 3 è usato per il sensore INFERIORE

// Variabili
int PIR_A = 0;
int PIR_B = 0;
int bAccesiA = false;  
int bAccesiB = false;
int time = 200;
int timeA= 200;

void AccendiA()
{
 digitalWrite(led_1, HIGH);     // accensione LED 1
 delay (time);
 digitalWrite(led_2, HIGH);      // accensione LED 2
 delay (time);
 digitalWrite(led_3, HIGH);  
 delay (time);
 digitalWrite(led_4, HIGH);  
 delay (time);
 digitalWrite(led_5, HIGH);  
 delay (time);
 digitalWrite(led_6, HIGH);  
 delay (time);
 digitalWrite(led_7, HIGH);  
 delay (time);
}

void AccendiB()
{
 digitalWrite(led_7, HIGH);     // accensione LED 1
 delay (timeA);
 digitalWrite(led_6, HIGH);      // accensione LED 2
 delay (timeA);
 digitalWrite(led_5, HIGH);  
 delay (timeA);
 digitalWrite(led_4, HIGH);  
 delay (timeA);
 digitalWrite(led_3, HIGH);  
 delay (timeA);
 digitalWrite(led_2, HIGH);  
 delay (timeA);
 digitalWrite(led_1, HIGH);  
 delay (timeA);
}

void SpegniA ()
{
 digitalWrite(led_1, LOW);     // spegni LEDs sequenza  1 a 7
 delay (time);
 digitalWrite(led_2, LOW);    
 delay (time);
 digitalWrite(led_3, LOW);    
 delay (time);
 digitalWrite(led_4, LOW);    
 delay (time);
 digitalWrite(led_5, LOW);    
 delay (time);
 digitalWrite(led_6, LOW);    
 delay (time);
 digitalWrite(led_7, LOW);    
 delay (time);
}

void SpegniB ()
{
 digitalWrite(led_7, LOW);     // spegni LEDs sequenza 7 a 1
 delay (timeA);
 digitalWrite(led_6, LOW);      
 delay (timeA);
 digitalWrite(led_5, LOW);    
 delay (timeA);
 digitalWrite(led_4, LOW);    
 delay (timeA);
 digitalWrite(led_3, LOW);    
 delay (timeA);
 digitalWrite(led_2, LOW);    
 delay (timeA);
 digitalWrite(led_1, LOW);    
 delay (timeA);
}

void setup() {
 pinMode(led_1, OUTPUT);
 pinMode(led_2, OUTPUT);
 pinMode(led_3, OUTPUT);
 pinMode(led_4, OUTPUT);
 pinMode(led_5, OUTPUT);
 pinMode(led_6, OUTPUT);
 pinMode(led_7, OUTPUT);

 pinMode(PIR_pin2, INPUT);
 pinMode(PIR_pin4, INPUT);
 
 Serial.begin(9600);
 Serial.println("avvio");

}
void loop()
{
PIR_A = digitalRead(PIR_pin2);
 PIR_B = digitalRead(PIR_pin4);


 if (PIR_A== HIGH)
 {
   if (bAccesiB==false)
   {
     bAccesiA=true ;
     AccendiA ();
     }
   else // (bAccesiB==true)
   {
     bAccesiB=false;
     SpegniB ();
   }
 }
 if (PIR_B == HIGH)  // sensore inferiore attivato
 {
   if (bAccesiA==false)
   {
      bAccesiB=true;
     AccendiB();
   }  
   else  // (bAccesiA==false)
   {
     bAccesiA=false;
     SpegniA ();
   
   }
 }
 Serial.print("PIRA=");
 Serial.print(PIR_A);
 Serial.print("  PIRB=");
 Serial.print(PIR_B);
 Serial.print("  bAccesiA=");
 Serial.print(bAccesiA);
 Serial.print("  bAccesiB=");
 Serial.print(bAccesiB);
 Serial.println("");
 delay (500);

}



Maurotec

Ho visto il video, nella seconda fase del test ho notato il funzionamento non voluto.

Non dimenticare che quando il micro esegue una delle funzioni accendi/spegni impiega 1400 ms per ognuna,
e per questo tempo il codice presente nel loop non viene eseguito.

Ciao.




pablos71

#24
Feb 09, 2014, 01:20 am Last Edit: Feb 09, 2014, 01:30 am by pablos Reason: 1
Anch'io ho visto il video. Qui non  si vuole solo accendere le luci di una gradinata, ma creare anche un effetto scenografico dove i led si accendo in sequenza a seconda della direzione salita o discesa .... bell'idea devo dire complimenti, però a quanto sembra dal video il programma è sempre lo stesso sia nella prima fase che nella seconda fase del test dove il comportamento per qualche motivo cambia, quindi sono fattori esterni al software che modificano i risultati.  I pir non si comportano sempre come vorremmo senza un adeguato software di calcolo, ti consiglio di elaborare meglio le tempistiche di ingresso dei segnali.

ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

elrospo

infatti ...7 luci 2 sensori sembrano inappropriati, a meno che non e una scala particolare con solo un ingresso e un appartamento.
e se qualcuno si ferma a metà scale un attimo per rispondere al cell?

leo72

Potresti mettere un tempo di inattività, ossia che dopo aver acceso i led in una delle due direzioni, per un tot tempo il programma non legge più i sensori, altrimenti se una persona si avvicina alla scala dopo che un'altra ha iniziato la salita/discesa, il tuo sistema rifà nuovamente la sequenza, lasciando quello a mezze scale per un attimo al buio  ;)

ARDURINO


... I pir non si comportano sempre come vorremmo senza un adeguato software di calcolo, ti consiglio di elaborare meglio le tempistiche di ingresso dei segnali.

ciao


Pablos ai qualche idea come farlo  ???

ARDURINO


infatti ...7 luci 2 sensori sembrano inappropriati, a meno che non e una scala particolare con solo un ingresso e un appartamento.
e se qualcuno si ferma a metà scale un attimo per rispondere al cell?


El,
questo e' solo un sistema eventualmente da utilizzare su una scala interna molto stretta.
Se qualcuno si ferma sulla scala i LEDS, come vedi dal filmato,  rimangono comunque accesi .

ARDURINO


Potresti mettere un tempo di inattività, ossia che dopo aver acceso i led in una delle due direzioni, per un tot tempo il programma non legge più i sensori, altrimenti se una persona si avvicina alla scala dopo che un'altra ha iniziato la salita/discesa, il tuo sistema rifà nuovamente la sequenza, lasciando quello a mezze scale per un attimo al buio  ;)



Leo ,
come faccio a rendere i sensori inattivi per x tempo  subito dopo essere stati attivati ?   :smiley-roll:

Go Up