Pilotare Pin Arduino tramite monitor seriale

Salve ragazzi come faccio ad attivare un pin di arduino tramite il monitor seriale premendo ad esempio il tasto "T"

mattdj:
Salve ragazzi come faccio ad attivare un pin di arduino tramite il monitor seriale premendo ad esempio il tasto "T"

void loop(){
  if(Serial.available()>0){      //Se ci sono caratteri in arrivo.
    ricevuto=Serial.read();      //Legge un byte dalla seriale.
    delay(2);
  }
  if(ricevuto=='T'){
    ricevuto=' ';
    digitalWrite(5,HIGH);
  }
}

Puoi utilizzare questo semplice esempio.

busco:

mattdj:
Salve ragazzi come faccio ad attivare un pin di arduino tramite il monitor seriale premendo ad esempio il tasto "T"

void loop(){

if(Serial.available()>0){      //Se ci sono caratteri in arrivo.
   ricevuto=Serial.read();      //Legge un byte dalla seriale.
   delay(2);
 }
 if(ricevuto=='T'){
   ricevuto=' ';
   digitalWrite(5,HIGH);
 }
}



Puoi utilizzare questo semplice esempio.

Con un nuovo Sketch mi funziona ma quando cerco di inserirllo nel codice dove lo volevo inserire non funziona .

Se il tuo codice non è TOP SECRET ti consiglio di postarlo qui, così gli utenti esperti potranno darti una mano, altrimenti la vedo dura se non lo fai te stesso.

Analizza bene l'esempio che ti hanno postato, e tenta di rivedere il codice in cui lo hai inserito, magari, prova ad integrarlo in una sua stessa funzione, del tipo:

void loop(){

//...mio codice...

RX_Comandi_Serial_Monitor();   //stai chiamando questa funzione, al termine, l'esecuzione ritornerà qui e continuerà...

//...mio codice...

} //fine loop()
//***************************************************************************************************************
void RX_Comandi_Serial_Monitor(){                 //la nuova funzione ricezione comandi da serial monitor

//il contenuto dell'esempio dato precedentemete... 

} //fine funzione ricezione comandi seriale

Ovviamente, eventuali variabili vanno dichiarate GLOBAL o passate per riferimento/puntatore...

Così organizzato, lo sketch sarà più organizzato.
spero di esserti stato d'aiuto,

ciao

hiperformance71:
Se il tuo codice non è TOP SECRET ti consiglio di postarlo qui, così gli utenti esperti potranno darti una mano, altrimenti la vedo dura se non lo fai te stesso.

Analizza bene l'esempio che ti hanno postato, e tenta di rivedere il codice in cui lo hai inserito, magari, prova ad integrarlo in una sua stessa funzione, del tipo:

void loop(){

//...mio codice...

RX_Comandi_Serial_Monitor();   //stai chiamando questa funzione, al termine, l'esecuzione ritornerà qui e continuerà...

//...mio codice...

} //fine loop()

void RX_Comandi_Serial_Monitor(){

//il contenuto dell'esempio dato precedentemete...

} //fine funzione ricezione seriale




Ovviamente, eventuali variabili vanno dichiarate GLOBAL o passate per riferimento/puntatore...

Così organizzato, lo sketch sarà più organizzato.
spero di esserti stato d'aiuto,

ciao

Questo è il mio codice

int Chiave;
int Sensore;
int Led=3;
int Variabile;
int Allarme=0;
int Luce;

void setup()
{
  Serial.begin(9600);
  pinMode(A0,INPUT); //Sensore PIR
  pinMode(4,INPUT);  //Chiave
  pinMode(3,OUTPUT); //LED  
  pinMode(13,OUTPUT);
  pinMode(5,OUTPUT);
}

void loop()
{
  Chiave=digitalRead(4);
  Sensore=digitalRead(A0);
  if((Chiave==LOW) && (Variabile==0))
  {
    tone(13,1700);
    delay(500);
    noTone(13);
    delay(500);
    tone(13,1700);
    delay(500);
    noTone(13);
    Variabile=1;
  }
  else if ((Chiave==HIGH) && (Variabile==1))
  {
    Variabile=0;
  }
  if((Variabile==1) && (Sensore==LOW) && (Allarme==0))
  {
    Serial.println("Allarme Inserito");
    delay(5000);   
    Serial.println("Zona 1 OK!");
    digitalWrite(3,LOW);
    digitalWrite(5,HIGH);
  }
  else if((Variabile==1) && (Sensore==HIGH) && (Allarme==0))
  {
    Serial.println("Pre-Allarme"); 
    delay(20000);
    Allarme=1;
    Serial.println("Attenzione!Zona 1");
    tone(13,1700);
    delay(1000);
    Luce=1;
  }
  else if((Variabile==0) && (Sensore==LOW))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
  }
  else if((Chiave==HIGH) && (Sensore==HIGH))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
  } 
  else if (Luce==1)
  {
    noTone(13);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
    delay(250);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
  }
}

non so dove implementarlo io ho provato a metterlo sia all'inizio che alla fine del loop ma niente.

ok, ma non capisco dove/cosa dovrebbe attivare il comando ricevuto dalla seriale? potresti spiegare meglio?

hiperformance71:
ok, ma non capisco dove/cosa dovrebbe attivare il comando ricevuto dalla seriale? potresti spiegare meglio?

il comando dovrebbe attivare un test che testa tutte le funzionalita

Ho fatto qualche modifica, ma tieni presente che non è che sono esperto in questo e non ho compreso appieno cosa intendi fare, quindi ho apportato delle modifiche al tuo codice, ma ho qualche dubbio visto che hai svariati if e la condizione di test potrebbe fermarsi al primo if, visto che verrebbe valutato TRUE e quindi non eseguirebbe gli altri, purtroppo solo tu potrai testarlo. Fammi sapere e vedrò di modificarlo un pò.

eccolo:

int Chiave;
int Sensore;
int Led=3;
int Variabile;
int Allarme=0;
int Luce;
char Comando_ricevuto;

void setup()
{
  Serial.begin(9600);
  pinMode(A0,INPUT); //Sensore PIR
  pinMode(4,INPUT);  //Chiave
  pinMode(3,OUTPUT); //LED  
  pinMode(13,OUTPUT);
  pinMode(5,OUTPUT);
}

void loop()
{
  Chiave=digitalRead(4);
  Sensore=digitalRead(A0);              //<-------non sarebbe meglio usare un pin digitale invece che uno analogico?
  
  RX_Comandi_Serial_Monitor();   //secondo me è qui che dovresti inserire la chiamata a funzione RX_Comandi_Serial_Monitor()
  
  
  if((Comando_ricevuto=='T') || (Chiave==LOW) && (Variabile==0))    //<----dovrebbe trovare TRUE sia se riceve il comando T da seriale sia con le condizioni usuali di funzionam. 
  {
    tone(13,1700);
    delay(500);
    noTone(13);
    delay(500);
    tone(13,1700);
    delay(500);
    noTone(13);
    Variabile=1;
  }
  else if ((Comando_ricevuto=='T') || (Chiave==HIGH) && (Variabile==1))
  {
    Variabile=0;
  }
  if((Comando_ricevuto=='T') || (Variabile==1) && (Sensore==LOW) && (Allarme==0))                //<-----presumo che Variabili==1 sia la condizione che attiva l'allarme.
  {
    Serial.println("Allarme Inserito");
    delay(5000);   
    Serial.println("Zona 1 OK!");
    digitalWrite(3,LOW);
    digitalWrite(5,HIGH);
  }
  else if((Comando_ricevuto=='T') || (Variabile==1) && (Sensore==HIGH) && (Allarme==0))          
  {
    Serial.println("Pre-Allarme"); 
    delay(20000);
    Allarme=1;
    Serial.println("Attenzione!Zona 1");
    tone(13,1700);
    delay(1000);
    Luce=1;
  }
  else if((Comando_ricevuto=='T') || (Variabile==0) && (Sensore==LOW))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
  }
  else if((Comando_ricevuto=='T') || (Chiave==HIGH) && (Sensore==HIGH))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
  } 
  else if (Luce==1)
  {
    noTone(13);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
    delay(250);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
  }
  Comando_ricevuto==' ';  //azzera il contenuto della variabile.
} 

//*********************************************************************************************
void RX_Comandi_Serial_Monitor(){
  
  
  if(Serial.available()>0){      //Se ci sono caratteri in arrivo.
    Comando_ricevuto=Serial.read();      //Legge un byte dalla seriale.
    delay(2);
  }
 
  
}

Ragazzi ho fatto bene o esiste una forma più semplice senza riscrivere tutto? (io lo sketch lo avrei suddiviso in tante funzioni quante "situazioni" e chiamate sequenzialmente dalla loop(), sarebbe stato più facile fare il controllo), mentre in questo modo, temo che al trovare il primo IF TRUE si fermi li e non continui. (premesso che non ho analizzato il codice affondo).

Ciao

Forse ho frainteso quello che vuoi che faccia, ma con un'unico comando, come fa a testare? deve forzare le varie condizioni? ma una curiosità, lo sketch l'hai fatto tu ?

hiperformance71:
Forse ho frainteso quello che vuoi che faccia, ma con un'unico comando, come fa a testare? deve forzare le varie condizioni? ma una curiosità, lo sketch l'hai fatto tu ?

Lo sketch lo fatto io perchè?

hiperformance71:
in questo modo, temo che al trovare il primo IF TRUE si fermi li e non continui.

per il tuo dubbio sull IF non ci sono problemi perche' qui viene usato "else if" il quale e' sempre verificato, anche se il primo IF e' vero. Se ci fossero dei soli ELSE allora il tuo dubbio sarebbe corretto.

Ne aggiungo uno io invece, visto che ci sono molti delay, ed anche di grandi dimensioni, quando arriva qualcosa dalla seriale, il codice puo' essere in esecuzione in qualsiasi linea, randomicamente. Questo comporta che dal punto in cui si trova fino alla fine dello sketch il Comando_Ricevuto e' T, ma arrivato alla fine non e' piu' T perche' viene resettato.

Grazie Testato per il ragguaglio, sono contento di non aver creato confusione a mattdj. Anch'io stavo pensando al fatto che se l'esecuzione del codice é dentro gli if/else if potrebbe aver eseguito solo uno di loro, ma non ho capito cosa faresti tu per risolverlo?

a mattdj: no nulla, è che immaginavo che magari era uno sketch preso in giro e quindi magari non avevi piena comprensione su come funziona. Hai provato il codice modificato? facci sapere!

uno di noi non si e' spiegato/capito :slight_smile:
non vedo problemi alla struttura if/else if improntata

io aggiungo un secondo dubbio che ha a che fare con delay/evento seriale :slight_smile:

hiperformance71:
Grazie Testato per il ragguaglio, sono contento di non aver creato confusione a mattdj. Anch'io stavo pensando al fatto che se l'esecuzione del codice é dentro gli if/else if potrebbe aver eseguito solo uno di loro, ma non ho capito cosa faresti tu per risolverlo?

a mattdj: no nulla, è che immaginavo che magari era uno sketch preso in giro e quindi magari non avevi piena comprensione su come funziona. Hai provato il codice modificato? facci sapere!

L'ho provato non funziona si blocca su i primi due if

@Testato: Ahhhh, ok, avevo capito male, scusa!

@mattdj:

ok, prova questo, ho aggiunto un contatore di test, su ogni test eseguito si assegna diciamo l' index del test appena eseguito, alla fine viene eseguito un if che dovrebbe azzerare la variabile "Comando_ricevuto" solo se si è arrivati fino in fondo ai test,

int Chiave;
int Sensore;
int Led=3;
int Variabile;
int Allarme=0;
int Luce;
char Comando_ricevuto;
byte Test_Counter=0;                        //aggiunto contatore test

void setup()
{
  Serial.begin(9600);
  pinMode(A0,INPUT); //Sensore PIR
  pinMode(4,INPUT);  //Chiave
  pinMode(3,OUTPUT); //LED  
  pinMode(13,OUTPUT);
  pinMode(5,OUTPUT);
}

void loop()
{
  Chiave=digitalRead(4);
  Sensore=digitalRead(A0);              //<-------non sarebbe meglio usare un pin digitale invece che uno analogico?
  
  RX_Comandi_Serial_Monitor();   //secondo me è qui che dovresti inserire la chiamata a funzione RX_Comandi_Serial_Monitor()
  
  
  if((Comando_ricevuto=='T') || (Chiave==LOW) && (Variabile==0))    //<----dovrebbe trovare TRUE sia se riceve il comando 
                                                                    //     T da seriale sia con le condizioni usuali di funzionam. 
  {
    tone(13,1700);
    delay(500);
    noTone(13);
    delay(500);
    tone(13,1700);
    delay(500);
    noTone(13);
    Variabile=1;
    Test_Counter=1;      //test 1 eseguito
  }
  else if ((Comando_ricevuto=='T') || (Chiave==HIGH) && (Variabile==1))
  {
    Variabile=0;
    Test_Counter=2;      //test 2 eseguito
  }
  if((Comando_ricevuto=='T') || (Variabile==1) && (Sensore==LOW) && (Allarme==0))                //<-----presumo che Variabili==1 sia la condizione che attiva l'allarme.
  {
    Serial.println("Allarme Inserito");
    delay(5000);   
    Serial.println("Zona 1 OK!");
    digitalWrite(3,LOW);
    digitalWrite(5,HIGH);
    Test_Counter=3;      //test 3 eseguito
    
  }
  else if((Comando_ricevuto=='T') || (Variabile==1) && (Sensore==HIGH) && (Allarme==0))          
  {
    Serial.println("Pre-Allarme"); 
    delay(20000);
    Allarme=1;
    Serial.println("Attenzione!Zona 1");
    tone(13,1700);
    delay(1000);
    Luce=1;
    Test_Counter=4;        //test 4 eseguito
    
  }
  else if((Comando_ricevuto=='T') || (Variabile==0) && (Sensore==LOW))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
    Test_Counter=5;    //Test 5 eseguito
    
  }
  else if((Comando_ricevuto=='T') || (Chiave==HIGH) && (Sensore==HIGH))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
    Test_Counter=6;       //Test 6 eseguito
    
  } 
  else if (Luce==1)
  {
    noTone(13);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
    delay(250);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
  }
  
  if (Test_Counter >= 6) {   //se il contatore test ha raggiunto la sognia massima azzera il contenuto del Comando_ricevuto
                             //questo garantisce che il test venga eseguito per tutti i 6 stati dell'allarme.
  Comando_ricevuto==' ';     //azzera il contenuto della variabile.
  Test_Counter=0;            //Azzera il contatore test eseguiti
  }
  
  
  
} 

//*********************************************************************************************
void RX_Comandi_Serial_Monitor(){
  
  
  if(Serial.available()>0){      //Se ci sono caratteri in arrivo.
    Comando_ricevuto=Serial.read();      //Legge un byte dalla seriale.
    delay(2);
   Test_Conter=0;  //viene azzerato per evitare che rimanesse in memoria l'ultimo numero dall'ultimo test e quindi non venisse
                                     //eseguito più di una volta il test con comando seriale...
  }
 
  
}

provalo e facci sapere, aleno fino a quando qualche utente esperto non ti dia un suggerimento migliore (che sono sicuro esista) perché come ti ho già esposto all'inizio dei post, io non sono esperto, e qualche volta mi incasino !! mi scuso se questo è il caso!

Testato:
per il tuo dubbio sull IF non ci sono problemi perche' qui viene usato "else if" il quale e' sempre verificato, anche se il primo IF e' vero.

In che senso?

if (condizione a) {blocco1}
else if (condizione b) {blocco2}

testa (condizione b) anche se (condizione a) è true?
Io credevo che il test su (condizione b) venisse fatto solo solo se (condizione a) è false

hiperformance71:
@Testato: Ahhhh, ok, avevo capito male, scusa!

@mattdj:

ok, prova questo, ho aggiunto un contatore di test, su ogni test eseguito si assegna diciamo l' index del test appena eseguito, alla fine viene eseguito un if che dovrebbe azzerare la variabile "Comando_ricevuto" solo se si è arrivati fino in fondo ai test,

int Chiave;

int Sensore;
int Led=3;
int Variabile;
int Allarme=0;
int Luce;
char Comando_ricevuto;
byte Test_Counter=0;                        //aggiunto contatore test

void setup()
{
  Serial.begin(9600);
  pinMode(A0,INPUT); //Sensore PIR
  pinMode(4,INPUT);  //Chiave
  pinMode(3,OUTPUT); //LED 
  pinMode(13,OUTPUT);
  pinMode(5,OUTPUT);
}

void loop()
{
  Chiave=digitalRead(4);
  Sensore=digitalRead(A0);              //<-------non sarebbe meglio usare un pin digitale invece che uno analogico?
 
  RX_Comandi_Serial_Monitor();   //secondo me è qui che dovresti inserire la chiamata a funzione RX_Comandi_Serial_Monitor()
 
 
  if((Comando_ricevuto=='T') || (Chiave==LOW) && (Variabile==0))    //<----dovrebbe trovare TRUE sia se riceve il comando
                                                                    //     T da seriale sia con le condizioni usuali di funzionam.
  {
    tone(13,1700);
    delay(500);
    noTone(13);
    delay(500);
    tone(13,1700);
    delay(500);
    noTone(13);
    Variabile=1;
    Test_Counter=1;      //test 1 eseguito
  }
  else if ((Comando_ricevuto=='T') || (Chiave==HIGH) && (Variabile==1))
  {
    Variabile=0;
    Test_Counter=2;      //test 2 eseguito
  }
  if((Comando_ricevuto=='T') || (Variabile==1) && (Sensore==LOW) && (Allarme==0))                //<-----presumo che Variabili==1 sia la condizione che attiva l'allarme.
  {
    Serial.println("Allarme Inserito");
    delay(5000);   
    Serial.println("Zona 1 OK!");
    digitalWrite(3,LOW);
    digitalWrite(5,HIGH);
    Test_Counter=3;      //test 3 eseguito
   
  }
  else if((Comando_ricevuto=='T') || (Variabile==1) && (Sensore==HIGH) && (Allarme==0))         
  {
    Serial.println("Pre-Allarme");
    delay(20000);
    Allarme=1;
    Serial.println("Attenzione!Zona 1");
    tone(13,1700);
    delay(1000);
    Luce=1;
    Test_Counter=4;        //test 4 eseguito
   
  }
  else if((Comando_ricevuto=='T') || (Variabile==0) && (Sensore==LOW))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
    Test_Counter=5;    //Test 5 eseguito
   
  }
  else if((Comando_ricevuto=='T') || (Chiave==HIGH) && (Sensore==HIGH))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
    Test_Counter=6;       //Test 6 eseguito
   
  }
  else if (Luce==1)
  {
    noTone(13);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
    delay(250);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
  }
 
  if (Test_Counter >= 6) {   //se il contatore test ha raggiunto la sognia massima azzera il contenuto del Comando_ricevuto
                             //questo garantisce che il test venga eseguito per tutti i 6 stati dell'allarme.
  Comando_ricevuto==' ';     //azzera il contenuto della variabile.
  Test_Counter=0;            //Azzera il contatore test eseguiti
  }
 
 
 
}

//*********************************************************************************************
void RX_Comandi_Serial_Monitor(){
 
 
  if(Serial.available()>0){      //Se ci sono caratteri in arrivo.
    Comando_ricevuto=Serial.read();      //Legge un byte dalla seriale.
    delay(2);
   Test_Conter=0;  //viene azzerato per evitare che rimanesse in memoria l'ultimo numero dall'ultimo test e quindi non venisse
                                     //eseguito più di una volta il test con comando seriale...
  }

}




provalo e facci sapere, aleno fino a quando qualche utente esperto non ti dia un suggerimento migliore (che sono sicuro esista) perché come ti ho già esposto all'inizio dei post, io non sono esperto, e qualche volta mi incasino !! mi scuso se questo è il caso!

Ciao mi esce questo errore:

Problema.PNG

No, mi risulta che il blocco dopo l'ELSE viene controllato solo se il primo IF ritorna FALSO, se no che senso ha di esistere?

Per il codice, io personalmente racchiuderei in funzioni le azioni, e scriverei qualcosa tipo:

se (TEST_1) richiama (funzione_1)

se(combinazione_sensori_1)richiama (funzione_1)

////

funzione_1 {
bla bla..
}

...e così via. mi sembra più pulito.

mattdj:

hiperformance71:
@Testato: Ahhhh, ok, avevo capito male, scusa!

@mattdj:

ok, prova questo, ho aggiunto un contatore di test, su ogni test eseguito si assegna diciamo l' index del test appena eseguito, alla fine viene eseguito un if che dovrebbe azzerare la variabile "Comando_ricevuto" solo se si è arrivati fino in fondo ai test,

int Chiave;

int Sensore;
int Led=3;
int Variabile;
int Allarme=0;
int Luce;
char Comando_ricevuto;
byte Test_Counter=0;                        //aggiunto contatore test

void setup()
{
  Serial.begin(9600);
  pinMode(A0,INPUT); //Sensore PIR
  pinMode(4,INPUT);  //Chiave
  pinMode(3,OUTPUT); //LED 
  pinMode(13,OUTPUT);
  pinMode(5,OUTPUT);
}

void loop()
{
  Chiave=digitalRead(4);
  Sensore=digitalRead(A0);              //<-------non sarebbe meglio usare un pin digitale invece che uno analogico?
 
  RX_Comandi_Serial_Monitor();   //secondo me è qui che dovresti inserire la chiamata a funzione RX_Comandi_Serial_Monitor()
 
 
  if((Comando_ricevuto=='T') || (Chiave==LOW) && (Variabile==0))    //<----dovrebbe trovare TRUE sia se riceve il comando
                                                                    //     T da seriale sia con le condizioni usuali di funzionam.
  {
    tone(13,1700);
    delay(500);
    noTone(13);
    delay(500);
    tone(13,1700);
    delay(500);
    noTone(13);
    Variabile=1;
    Test_Counter=1;      //test 1 eseguito
  }
  else if ((Comando_ricevuto=='T') || (Chiave==HIGH) && (Variabile==1))
  {
    Variabile=0;
    Test_Counter=2;      //test 2 eseguito
  }
  if((Comando_ricevuto=='T') || (Variabile==1) && (Sensore==LOW) && (Allarme==0))                //<-----presumo che Variabili==1 sia la condizione che attiva l'allarme.
  {
    Serial.println("Allarme Inserito");
    delay(5000);   
    Serial.println("Zona 1 OK!");
    digitalWrite(3,LOW);
    digitalWrite(5,HIGH);
    Test_Counter=3;      //test 3 eseguito
   
  }
  else if((Comando_ricevuto=='T') || (Variabile==1) && (Sensore==HIGH) && (Allarme==0))         
  {
    Serial.println("Pre-Allarme");
    delay(20000);
    Allarme=1;
    Serial.println("Attenzione!Zona 1");
    tone(13,1700);
    delay(1000);
    Luce=1;
    Test_Counter=4;        //test 4 eseguito
   
  }
  else if((Comando_ricevuto=='T') || (Variabile==0) && (Sensore==LOW))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
    Test_Counter=5;    //Test 5 eseguito
   
  }
  else if((Comando_ricevuto=='T') || (Chiave==HIGH) && (Sensore==HIGH))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
    Test_Counter=6;       //Test 6 eseguito
   
  }
  else if (Luce==1)
  {
    noTone(13);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
    delay(250);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
  }
 
  if (Test_Counter >= 6) {   //se il contatore test ha raggiunto la sognia massima azzera il contenuto del Comando_ricevuto
                             //questo garantisce che il test venga eseguito per tutti i 6 stati dell'allarme.
  Comando_ricevuto==' ';     //azzera il contenuto della variabile.
  Test_Counter=0;            //Azzera il contatore test eseguiti
  }
 
 
 
}

//*********************************************************************************************
void RX_Comandi_Serial_Monitor(){
 
 
  if(Serial.available()>0){      //Se ci sono caratteri in arrivo.
    Comando_ricevuto=Serial.read();      //Legge un byte dalla seriale.
    delay(2);
   Test_Conter=0;  //viene azzerato per evitare che rimanesse in memoria l'ultimo numero dall'ultimo test e quindi non venisse
                                     //eseguito più di una volta il test con comando seriale...
  }

}




provalo e facci sapere, aleno fino a quando qualche utente esperto non ti dia un suggerimento migliore (che sono sicuro esista) perché come ti ho già esposto all'inizio dei post, io non sono esperto, e qualche volta mi incasino !! mi scuso se questo è il caso!

Ciao mi esce questo errore:

bè, però anche tu almeno prova a leggerli gli errori. magari trovi un errore di battitura....

dab77:

mattdj:

hiperformance71:
@Testato: Ahhhh, ok, avevo capito male, scusa!

@mattdj:

ok, prova questo, ho aggiunto un contatore di test, su ogni test eseguito si assegna diciamo l' index del test appena eseguito, alla fine viene eseguito un if che dovrebbe azzerare la variabile "Comando_ricevuto" solo se si è arrivati fino in fondo ai test,

int Chiave;

int Sensore;
int Led=3;
int Variabile;
int Allarme=0;
int Luce;
char Comando_ricevuto;
byte Test_Counter=0;                        //aggiunto contatore test

void setup()
{
  Serial.begin(9600);
  pinMode(A0,INPUT); //Sensore PIR
  pinMode(4,INPUT);  //Chiave
  pinMode(3,OUTPUT); //LED 
  pinMode(13,OUTPUT);
  pinMode(5,OUTPUT);
}

void loop()
{
  Chiave=digitalRead(4);
  Sensore=digitalRead(A0);              //<-------non sarebbe meglio usare un pin digitale invece che uno analogico?
 
  RX_Comandi_Serial_Monitor();   //secondo me è qui che dovresti inserire la chiamata a funzione RX_Comandi_Serial_Monitor()
 
 
  if((Comando_ricevuto=='T') || (Chiave==LOW) && (Variabile==0))    //<----dovrebbe trovare TRUE sia se riceve il comando
                                                                    //     T da seriale sia con le condizioni usuali di funzionam.
  {
    tone(13,1700);
    delay(500);
    noTone(13);
    delay(500);
    tone(13,1700);
    delay(500);
    noTone(13);
    Variabile=1;
    Test_Counter=1;      //test 1 eseguito
  }
  else if ((Comando_ricevuto=='T') || (Chiave==HIGH) && (Variabile==1))
  {
    Variabile=0;
    Test_Counter=2;      //test 2 eseguito
  }
  if((Comando_ricevuto=='T') || (Variabile==1) && (Sensore==LOW) && (Allarme==0))                //<-----presumo che Variabili==1 sia la condizione che attiva l'allarme.
  {
    Serial.println("Allarme Inserito");
    delay(5000);   
    Serial.println("Zona 1 OK!");
    digitalWrite(3,LOW);
    digitalWrite(5,HIGH);
    Test_Counter=3;      //test 3 eseguito
   
  }
  else if((Comando_ricevuto=='T') || (Variabile==1) && (Sensore==HIGH) && (Allarme==0))         
  {
    Serial.println("Pre-Allarme");
    delay(20000);
    Allarme=1;
    Serial.println("Attenzione!Zona 1");
    tone(13,1700);
    delay(1000);
    Luce=1;
    Test_Counter=4;        //test 4 eseguito
   
  }
  else if((Comando_ricevuto=='T') || (Variabile==0) && (Sensore==LOW))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
    Test_Counter=5;    //Test 5 eseguito
   
  }
  else if((Comando_ricevuto=='T') || (Chiave==HIGH) && (Sensore==HIGH))
  {
    noTone(13);
    Serial.println("Allarme Disinserito");
    digitalWrite(3,HIGH);
    digitalWrite(5,LOW);
    Luce=0;
    Allarme=0;
    Test_Counter=6;       //Test 6 eseguito
   
  }
  else if (Luce==1)
  {
    noTone(13);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
    delay(250);
    digitalWrite(5,HIGH);
    delay(250);
    digitalWrite(5,LOW);
  }
 
  if (Test_Counter >= 6) {   //se il contatore test ha raggiunto la sognia massima azzera il contenuto del Comando_ricevuto
                             //questo garantisce che il test venga eseguito per tutti i 6 stati dell'allarme.
  Comando_ricevuto==' ';     //azzera il contenuto della variabile.
  Test_Counter=0;            //Azzera il contatore test eseguiti
  }
 
 
 
}

//*********************************************************************************************
void RX_Comandi_Serial_Monitor(){
 
 
  if(Serial.available()>0){      //Se ci sono caratteri in arrivo.
    Comando_ricevuto=Serial.read();      //Legge un byte dalla seriale.
    delay(2);
   Test_Conter=0;  //viene azzerato per evitare che rimanesse in memoria l'ultimo numero dall'ultimo test e quindi non venisse
                                     //eseguito più di una volta il test con comando seriale...
  }

}




provalo e facci sapere, aleno fino a quando qualche utente esperto non ti dia un suggerimento migliore (che sono sicuro esista) perché come ti ho già esposto all'inizio dei post, io non sono esperto, e qualche volta mi incasino !! mi scuso se questo è il caso!

Ciao mi esce questo errore:

bè, però anche tu almeno prova a leggerli gli errori. magari trovi un errore di battitura....

Il problema è risolto.Ma non funziona si blocca sempre al secondo if