Go Down

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

ARDURINO

Feb 06, 2014, 08:15 pm Last Edit: Feb 07, 2014, 11:23 am by ARDURINO 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);
 }
}

nid69ita

#1
Feb 06, 2014, 08:25 pm Last Edit: Feb 06, 2014, 08:38 pm by nid69ita Reason: 1
1: sembra una sciocchezza, ma perchè chiamare le variabili che leggono i PIR   in2 e in4 ?  Meglio inA e inB.    Con quei numeri sembra che ne hai 4. E poi per i led mica lo hai chiamato led_14 ma led_2 (indipendente dal pin)
2. perchè quei delay(500) quando accendi i led ? Secondo me non servono a un tubazzo. 1 secondo e se nel mentre si attiva il secondo PIR? Arduino è bloccato in quel secondo  (oppure quei delay servono ma non lo spieghi)
3. i led devono partire spenti, perciò nella setup() metti come ultime istruzioni:
Code: [Select]
digitalWrite(led_1, LOW);    
digitalWrite(led_2, LOW)

4. Crea due funzioni Accendi() e Spegni()
Code: [Select]
void Accendi()
{ digitalWrite(led_1, HIGH);     // accensione LED 1
 delay (500);
 digitalWrite(led_2, HIGH);      // accensione LED 2
 delay (500);
}
void Spegni()
{ digitalWrite(led_1, LOW);       // se il sensore non attivato LED  spenti
 delay (500);
 digitalWrite(led_2, LOW);
 delay (500);
}

così il programma principale nella loop() diventa più corto e leggibile:
Code: [Select]
void loop()
{ in2 = digitalRead(PIR_pin2);
 in4 = digitalRead(PIR_pin4);
 if (in2== HIGH)    // sensore superiore attivato
 { Accendi();
 } else            // se il sensore non attivato LED  spenti
 { Spegni();
 }
 if (in4 == HIGH)    // sensore inferiore attivato
 { Accendi();
 } else            // se il sensore inferiore non attivato LED spenti
 { Spegni();
 }
}

5. una variabile VERO/FALSO si dichiara come boolean e puoi usare i 2 unici valori ammessi true e false
Code: [Select]
boolean myVar=false;
http://arduino.cc/en/Reference/BooleanVariables
my name is IGOR, not AIGOR

ARDURINO

#2
Feb 06, 2014, 08:54 pm Last Edit: Feb 07, 2014, 11:23 am by ARDURINO Reason: 1
Salve Nid ,
un passo alla volta per imparare.....

come faccio acreare  e dove le colloco le due funzioni Accendi () Spagni ()  ?

Code: [Select]
void Accendi()
{ digitalWrite(led_1, HIGH);     // accensione LED 1
 delay (500);
 digitalWrite(led_2, HIGH);      // accensione LED 2
 delay (500);
}
void Spegni()
{ digitalWrite(led_1, LOW);       // se il sensore non attivato LED  spenti
 delay (500);
 digitalWrite(led_2, LOW);
 delay (500);
}




mio codice precedente aggiornato

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);
 digitalWrite(led_1, LOW);    
digitalWrite(led_2, LOW);
}
void Accendi()
{ digitalWrite(led_1, HIGH);     // accensione LED 1
 delay (500);
 digitalWrite(led_2, HIGH);      // accensione LED 2
 delay (500);
}
void Spegni ()
{digitalWrite(led_1, LOW);     // spegni LED 1
 delay (500);
 digitalWrite(led_2, LOW);      // spegni LED 2
 delay (500);
 
void loop(){

 in2 = digitalRead(PIR_pin2);
 in4 = digitalRead(PIR_pin4);

 if (in2== HIGH){                 // sensore superiore attivato
   Accendi ();                   // ritardo di 2 sec
 }
 else
 {
   Spegni ();
 }

 if (in4 == HIGH)  // sensore inferiore attivato
 {                
   Accendi();              
 }
 else
 {
   Spegni ();
 }
}



nid69ita


... dove le colloco le due funzioni Accendi () Spagni ()  ?

Anche al fondo di tutto il codice
my name is IGOR, not AIGOR

nid69ita

#4
Feb 06, 2014, 08:58 pm Last Edit: Feb 06, 2014, 09:00 pm by nid69ita Reason: 1
Dichiara all'inizio due variabili boolean di nome bAccesiA = false;  e     bAccesiB = false;
servono per sapere quale dei due PIR sono stati attivati

Quindi la logica che vuoi implementare è verifico un PIR ma devo anche vedere lo stato dell'altro:
- se il PIR A == HIGH
 se bAccesiB==false         essendo il B spento  lo accendo e setto booleano A
    1. Accendi()
   2. bAccesiA=true;                      
 se bAccesiB==true          essendo il B acceso allora lo spengo
    3. Spegni()
   4. bAccesiB=false;

- se il PIR B == HIGH
 se bAccesiA==false         essendo il A spento  lo accendo e setto booleano B
    1. Accendi()
   2. bAccesiB=true;                      
 se bAccesiA==true          essendo il A acceso allora lo spengo
    3. Spegni()
   4. bAccesiA=false;
my name is IGOR, not AIGOR

ARDURINO

#5
Feb 06, 2014, 10:08 pm Last Edit: Feb 07, 2014, 11:24 am by ARDURINO Reason: 1
Ho modificato il codice come da consiglio e testato sulla breadboard, ma i LEDS continuano a lampeggiare come se il segnale dai sensori non venga letto.

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 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;

void Accendi()
{ digitalWrite(led_1, HIGH);     // accensione LED 1
 delay (500);
 digitalWrite(led_2, HIGH);      // accensione LED 2
 delay (500);
}
void Spegni ()
{digitalWrite(led_2, LOW);     // spegni LED 1
 delay (500);
 digitalWrite(led_1, LOW);      // spegni LED 2
 delay (500);
}

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

 
void loop(){

 PIR_A = digitalRead(PIR_pin2);
 PIR_B = digitalRead(PIR_pin4);

 if (PIR_A== HIGH);
 
 { bAccesiB==false;
 
   Accendi ();  
 }
  bAccesiA=true ;  
if (bAccesiB==true)
 
  {
   Spegni ();
 }
  bAccesiB=false;

 if (PIR_B == HIGH)  // sensore inferiore attivato
 {  bAccesiA==false;              
   Accendi();              
 }
 bAccesiB=true;
 if (bAccesiA==false)
 {
   Spegni ();
 }
 bAccesiA=false;

}

nid69ita

#6
Feb 06, 2014, 10:22 pm Last Edit: Feb 07, 2014, 11:51 am by nid69ita Reason: 1
Hai introdotto un pò di errori come il ; dopo un if

Code: [Select]
void loop()
{ PIR_A = digitalRead(PIR_pin2);
 PIR_B = digitalRead(PIR_pin4);
 if ( PIR_A == HIGH )
 { if( bAccesiB == false )
   { Accendi();  
     bAccesiA=true;  
   } else   // bAccesiB==true
   { Spegni();
     bAccesiB=false;
   } //endif bAccesiB
 } //endif PIR_A
...
my name is IGOR, not AIGOR

ARDURINO

#7
Feb 07, 2014, 11:22 am Last Edit: Feb 07, 2014, 11:25 am by ARDURINO Reason: 1
OK, ho apportato le correzioni , ma ancora il sistema non funziona come dovrebbe.

All'attivazione di ogni singolo sensore , i LEDS si accendono ma poco dopo si spengono in modo autonomo sensa aspettare il segnale dall'altro sensore attivato....????

Non so dove sia il BUG , ho provato a cambiare / invertire  TRU/FALSE ma il problema rimane irrisolto.


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 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;

void Accendi()
{ digitalWrite(led_1, HIGH);     // accensione LED 1
 delay (500);
 digitalWrite(led_2, HIGH);      // accensione LED 2
 delay (500);
}
void Spegni ()
{digitalWrite(led_2, LOW);     // spegni LED 1
 delay (500);
 digitalWrite(led_1, LOW);      // spegni LED 2
 delay (500);
}

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

 void loop(){

 PIR_A = digitalRead(PIR_pin2);
 PIR_B = digitalRead(PIR_pin4);

 if (PIR_A== HIGH)
 
 {if (bAccesiB==false)
    { Accendi ();
   bAccesiA=true ;
 }
 
} else // (bAccesiB==true)
{
   Spegni ();
    bAccesiB=false;
 }
   if (PIR_B == HIGH)  // sensore inferiore attivato
 { if (bAccesiA==false)              
  { Accendi();
  bAccesiB=true;    
 }  else  // (bAccesiA==false)
  {
   Spegni ();
   bAccesiA=false;
 }
 }
}

nid69ita

Sono messe male le parentesi graffe, nei punti sbagliati.
Usa nell'IDE il CTRL+T che indenta le righe in maniera consona. Poi confronta per bene le graffe del mio ultimo codice ed il tuo.
Troverai delle differenze.
my name is IGOR, not AIGOR

paulus1969

Mi sembra che i due sensori facciano la stessa cosa... invece tu vorresti, conferma se è vero:
- sensore A attivato = si accendono i LED e rimangono accesi
- sensore B attivato = si spengono i LED
Immagino che tu voglia implementare una luce scale che si accende appena qualcuno inizia a salire e si spegne appena giunge alla fine delle scale.
Se ho capito bene, vorrei anche sapere se vuoi fare la stessa cosa anche in discesa, quindi B accende ed A spegne.
Ci sarebbe anche da sistemare una piccola cosa: se ci sono due persone ed una inizia a salire e l'altra scende... ma la vediamo successivamente.
Suggerimento: sembra che tu abbia preso un altro programma per riadattarlo, conviene iniziare da uno nuovo.

ARDURINO


Sono messe male le parentesi graffe, nei punti sbagliati.
Usa nell'IDE il CTRL+T che indenta le righe in maniera consona. Poi confronta per bene le graffe del mio ultimo codice ed il tuo.
Troverai delle differenze.

OK Nid  sara' fatto.

ARDURINO


Mi sembra che i due sensori facciano la stessa cosa... invece tu vorresti, conferma se è vero:
- sensore A attivato = si accendono i LED e rimangono accesi
- sensore B attivato = si spengono i LED
Immagino che tu voglia implementare una luce scale che si accende appena qualcuno inizia a salire e si spegne appena giunge alla fine delle scale.
Se ho capito bene, vorrei anche sapere se vuoi fare la stessa cosa anche in discesa, quindi B accende ed A spegne.
Ci sarebbe anche da sistemare una piccola cosa: se ci sono due persone ed una inizia a salire e l'altra scende... ma la vediamo successivamente.
Suggerimento: sembra che tu abbia preso un altro programma per riadattarlo, conviene iniziare da uno nuovo.


Paulus  BINGO ,  e' proprio quello che vorrei fare !!!

Si e' vero ho iniziato con un codice che utilizzava due pulsanti.  :smiley-fat:

Help me please !!!!

ARDURINO

Ho modificato e corretto il codice.
Ora quello che succede, attivando uno dei due sensori i LEDS rimangono accesi (questo e' un bene)  ma attivando l'altro sensore prima si spengono poi si accendono di nuovo.
La stessa cosa succede invertendo l'ordine di attivazione dei sensori (non importa se l'uno o l'altro).
Credo che quando il secondo sensore si attiva spegne i LEDS , ma essendo il suo stato HIGH li riaccende di nuovo .

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 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;

void Accendi()
{
  digitalWrite(led_1, HIGH);     // accensione LED 1
  delay (500);
  digitalWrite(led_2, HIGH);      // accensione LED 2
  delay (500);
}
void Spegni ()
{
  digitalWrite(led_2, LOW);     // spegni LED 1
  delay (500);
  digitalWrite(led_1, LOW);      // spegni LED 2
  delay (500);
}

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


void loop()

{
  PIR_A = digitalRead(PIR_pin2);
  PIR_B = digitalRead(PIR_pin4);

  if (PIR_A== HIGH)
  {
    if (bAccesiB==false)
    {
      Accendi ();
      bAccesiA=true ;
    }
    else // (bAccesiB==true)
    {
      Spegni ();
      bAccesiB=false;
    }
  }



  if (PIR_B == HIGH)  // sensore inferiore attivato
  {
    if (bAccesiA==false)
    {
      Accendi();
      bAccesiB=true;
    } 
    else  // (bAccesiA==false)
    {
      Spegni ();
      bAccesiA=false;

    }
  }
}





Maurotec

#13
Feb 07, 2014, 01:24 pm Last Edit: Feb 07, 2014, 02:18 pm by MauroTec Reason: 1
Analizzare il problema in dettaglio è cosa da fare prima ancora di scrivere una riga di codice.
Quando il problema è conosciuto si evita l'analisi e si passa subito alla codifica.
In questo cosa sembra proprio che l'analisi debba essere fatta in quando il problema non è conosciuto nel dettaglio.

Tutto inizia con la luce spenta (è una sola luce o meglio un solo comando accensione/spegnimento lampada).
Entrambe i sensori possono imporre uno solo cambiamento di stato al circuito di comando della lampada, e il cambiamento di stato permesso può essere da spento ad acceso.

Quale dei sensori (A o B) ha modificato lo stato della lampada?
Bisogna memorizzarlo da qualche parte, perché è un dato che servirà.
Infatti serve sapere che se A ha acceso la lampada ora il codice può concentrarsi su B o viceversa.

In questo stato Il sensore che non ha acceso la lampada avrà il compito di spegnerla.

Visto che in C++ non elegante definire delle costanti, usiamo: const type varname, tuttavia HIGH e LOW
sono delle #define quindi:

Code: [Select]

// ridefinisco LOW e HIGH rispettivamente in PWR_OFF e PWR_ON
#define PWR_OFF LOW
#define PWR_ON  HIGH

// assegno un nome simbolico ad ogni pir
#define PIRA    0
#define PIRB     1    

byte stateLamp = PWR_OFF;  // la lampada è spenta
byte whoHasTurnedOn = 0;     // 0 = nessuno
                                                      //  1 = il pir A
                                                      //  2 = il pir B





Ricordo di aver visto un video di un corridoio illuminato solo al passaggio di una persona, cioè c'erano 10 lampade
e si accendevano solo quelle in corrispondenza della persona.

Es grafico x = acceso, P = persona, - = spento
-----------------------x
                                      P
----------------------x--
                                     P
---------------------x---
                                   P
--------------------x----
                                 P

Se si tratta di realizzare questo il problema non è banale e sopratutto per funzionare correttamente i sensori pir
devono avere un angolo di visuale molto stretto.
Se riuscissi a spiegare con precisione come sono posizionati i due pir e quando devono accendersi/spegnersi i due led avrei le idee più chiare.

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.



nid69ita

#14
Feb 07, 2014, 01:47 pm Last Edit: Feb 07, 2014, 01:49 pm by nid69ita Reason: 1

Ora quello che succede, attivando uno dei due sensori i LEDS rimangono accesi (questo e' un bene)  ma attivando l'altro sensore prima si spengono poi si accendono di nuovo.
La stessa cosa succede invertendo l'ordine di attivazione dei sensori (non importa se l'uno o l'altro).
Credo che quando il secondo sensore si attiva spegne i LEDS , ma essendo il suo stato HIGH li riaccende di nuovo .

No, il secondo sensore li riaccenderebbe solo se bAccesoA fosse a true. Credo invece che quando il secondo sensore è HIGH, e quindi spegne, il primo sensore è ancora HIGH. Questo è quello che credo succeda, ma non posso provarlo fisicamente.

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.
my name is IGOR, not AIGOR

Go Up