problema compilazione sottoprogramma

Salve, ripubblico questo topic che ho pubblicato ieri nella sezione Hardware, avendo sbagliato sezione nel quale pubblicare il topic non ho avuto molti suggerimenti, quindi ho deciso di ripubblicarlo qui.Chiedo scusa per il disagio, se un moderatore puo' eliminare il vecchio topic ne sarò felice, grazie e ancora scusa. Bene, arrivo al dunque: devo realizzare un circuito che attraverso un tastierino 4x4 mi riconosca un codice di accesso esatto dagli altri, immesso il codice giusto mi deve fare la cosa che io voglio, all'inizio uso un led. Mi sono documentato su vecchi topic presenti su questo forum, ho preso spunto e ho cominciato a scrivere il programma e funziona, mi riconosce il codice corretto e mi accende il led. Ho deciso di aggiungere oltre al led anche un piccolo sistema d'allarme, ovvero un fotoresistore sul quale c'è un led rosso fisso, nel caso in cui il fascio luminoso venga interrotto scatta un buzzer. Ho provato lo sketch del piccolo sistema d'allarme separatamente dal precedente sketch e funziona. Adesso ho deciso di fondere insieme i due sketch, ma ho alcuni problemi. All'inizio ho inserito il sistema d'allarme in un if else all'interno del programma del keypad, ma quando inserivo il codice esatto partiva il buzzer e non si spegneva neanche se c'era il fascio luminoso sul fotoresistore. Ho chiesto ad una persona che ne capisce più di me e mi ha consigliato di togliere quell'if...else perchè fa conflitto con l'if del programma base e quindi non va. Ho provato a cercare un'istruzione che andasse bene per il mio programma e ho deciso di usare lo switch-case , ma non so se è adeguato. Quindi ho cambiato inizialmente il mio programma nel seguente:

#include <Keypad.h>
#define LED 13
#define fotor  0
#define buzzer 7
int valfotor;



const byte ROWS = 4; // Quattro righe
const byte COLS = 4; // Quattro colonne

// Definizione mappa della tastiera
byte keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[ROWS] = {
 2, 3, 4, 5 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {
 8, 9, 10, 11 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino. 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 
// Creazione della tastiera

char code [4]; 
char i;


void setup() {
 Serial.begin(9600);
 pinMode (LED, OUTPUT);
 pinMode (buzzer,OUTPUT);
}

void loop()
{
 valfotor = analogRead(fotor);
 Serial.print("DIGITA CODICE:");
 

 
 for (i=0; i<4; i++) {
 	code[i] = keypad.waitForKey();
 	Serial.print("Tasto numero ");
 	//Serial.print(i);
 	//Serial.print(" - valore ");
 	Serial.println(code[i]);
 
    
       
        if((code[0] == '1') && (code[1] == '2') && (code[2] == '3') && (code[3] == 'A')) {
 	digitalWrite (LED, HIGH);
 	Serial.print ("CODICE ESATTO!");
        Serial.print("LED ACCESO");
        }
        switch(valfotor){
          
    case(valfotor <=1000): {
      digitalWrite(buzzer,HIGH);
      }
      case(valfotor >1000): {
        digitalWrite(buzzer,LOW);
        }
    
     }   
     
   
      if((code[0] == '7') && (code[1] == '9') && (code[2] == '3') && (code[3] == 'B')) {
 	digitalWrite(LED,LOW);
        Serial.println("LED SPENTO");
     }
    

}
}

Però mi dava questi errori nella compilazione: sketch_feb24a.ino: In function 'void loop()':
sketch_feb24a.ino:59:10: error: 'valfotor' cannot appear in a constant-expression
sketch_feb24a.ino:62:12: error: 'valfotor' cannot appear in a constant-expression
Errore durante la compilazione

Quindi ho modificato ancora una volta il programma nel seguente:

#include <Keypad.h>
#define LED 13
#define fotor  0
#define buzzer 7
int valfotor;



const byte ROWS = 4; // Quattro righe
const byte COLS = 4; // Quattro colonne

// Definizione mappa della tastiera
byte keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[ROWS] = {
 2, 3, 4, 5 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {
 8, 9, 10, 11 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino. 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 
// Creazione della tastiera

char code [4]; 
char i;


void setup() {
 Serial.begin(9600);
 pinMode (LED, OUTPUT);
 pinMode (buzzer,OUTPUT);
}

void loop()
{
 valfotor = analogRead(fotor);
 Serial.print("DIGITA CODICE:");
 

 
 for (i=0; i<4; i++) {
 	code[i] = keypad.waitForKey();
 	Serial.print("Tasto numero ");
 	//Serial.print(i);
 	//Serial.print(" - valore ");
 	Serial.println(code[i]);
 
    
       
        if((code[0] == '1') && (code[1] == '2') && (code[2] == '3') && (code[3] == 'A')) {
 	digitalWrite (LED, HIGH);
 	Serial.print ("CODICE ESATTO!");
        Serial.print("LED ACCESO");
        }
        switch(fotor){
          
    case(fotor <=1000): {
      digitalWrite(buzzer,HIGH);
      }
      case(fotor >1000): {
        digitalWrite(buzzer,LOW);
        }
    
     }   
     
   
      if((code[0] == '7') && (code[1] == '9') && (code[2] == '3') && (code[3] == 'B')) {
 	digitalWrite(LED,LOW);
        Serial.println("LED SPENTO");
     }
    

}
}

Grazie a tutti per l'aiuto.

Direi che ... devi STUDIARTI bene l'uso dell'istruzione switch/case ... :smiling_imp:

...e magari QUESTO aiuta (pag. 30).

Guglielmo

Si lo so che devo studiare, sono alle prime armi :smiley: però volevo risolvere in fretta il problema perchè poi devo aggiungere anche altre cose :sweat_smile:

Come posso risolvere al meglio per adesso?
Grazie 8)

... nella situazione attuale, quale è esattamente il problema che hai ?

Inoltre non mi sembra di vedere da nessuna parte una variabile in cui ti segni, e ti ricordi, se il "sistema di controllo" della fotoresistenza deve essere attivo o meno (ovvero se hai il led acceso o lo hai spento) per comportarti di conseguenza ... :roll_eyes:

Guglielmo

guglielmotorta:
Si lo so che devo studiare, sono alle prime armi :smiley: però volevo risolvere in fretta il problema perchè poi devo aggiungere anche altre cose :sweat_smile:

Nell'IDE usa anche CTRL+T che indenta e spazia meglio il codice, come scrivi tu non si capisce nulla.
Togli anche quei kg di righe vuote che non servono a un tubo.
Esempio, a che servono quelle righe vuote? a nulla; piuttosto metti una riga con un commmento utile:

Serial.println(code[i]);

   
      
       if((code[0] ==

nid69ita:
Esempio, a che servono quelle righe vuote?

Servono per gonfiare il numero di righe del programma e farsi belli dicendo che hai scritto un software di millemila righe anche se in realtà sono poche centinaia. :smiley:

Scusate, avete ragione non servono a nulla quegli spazi vuoti e non l'ho lasciato solo per vantarmi di scrivere programmi ultra sofisticati, anzi! Come ripeto adesso mi sto avvicinando ad Arduino e alla programmazione e non sono certo un esperto, sono errori di cui mi scuso. Per quanto riguarda il programma il problema che ho è che la parte del sistema con la foto resistenza non funziona quando lo inserisco insieme al keypad. grazie. :grin:

ciao.
Vedo un po' di confusione.
Cominci con:

...
#define fotor  0
...

Ovvero dici al compilatore che dove trova "fotor" deve sostituirlo con "0"
poi scrivi:

...
valfotor = analogRead(fotor);
...

quindi stai facendo un analogRead su un pin digitale (il pin 0) :fearful: :fearful: .
Anche lo switc non è male :wink:

switch(fotor){
          
    case(fotor <=1000): {
      digitalWrite(buzzer,HIGH);
      }
      case(fotor >1000): {
        digitalWrite(buzzer,LOW);
        }
    
     }

fotor è sempre uguale a 0 (zero) quindi direi che 0 <=1000 è sempre vera.

ciao
pippo72

Allora, parti dal tuo codice rimesso in ordine e, tenendo conto di quanto ti ha anche detto pippo72 prova a ricontrollarlo, correggerlo e ... capire cosa c'è che non va :

#include <Keypad.h>

#define LED 13
#define fotor  0
#define buzzer 7

int valfotor;

const byte ROWS = 4; // Quattro righe
const byte COLS = 4; // Quattro colonne

// Definizione mappa della tastiera
byte keys[ROWS][COLS] = {
   {'1','2','3','A'},
   {'4','5','6','B'},
   {'7','8','9','C'},
   {'*','0','#','D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {8, 9, 10, 11 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino. 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 
// Creazione della tastiera
char code [4]; 
char i;

void setup() {
   Serial.begin(9600);
   pinMode (LED, OUTPUT);
   pinMode (buzzer,OUTPUT);
}

void loop()
{
   valfotor = analogRead(fotor);
   Serial.print("DIGITA CODICE:");

   for (i=0; i<4; i++) {
      code[i] = keypad.waitForKey();
      Serial.print("Tasto numero ");
      //Serial.print(i);
      //Serial.print(" - valore ");
      Serial.println(code[i]);
      if((code[0] == '1') && (code[1] == '2') && (code[2] == '3') && (code[3] == 'A')) {
         digitalWrite (LED, HIGH);
         Serial.print ("CODICE ESATTO!");
         Serial.print("LED ACCESO");
      }
      switch(fotor){

         case(fotor <=1000): 
         {
            digitalWrite(buzzer,HIGH);
         }
         case(fotor >1000): 
         {
            digitalWrite(buzzer,LOW);
         }
      }   
      if((code[0] == '7') && (code[1] == '9') && (code[2] == '3') && (code[3] == 'B')) {
         digitalWrite(LED,LOW);
         Serial.println("LED SPENTO");
      }
   }
}

... aggiungo che, come ti ho già detto, se non ti memorizzi da nessuna parte lo stato del LED, ovvero se la rilevazione della fotoresistenza è attiva o meno ... come fai poi a decidere se leggerla o no ?

Guglielmo

#define fotor  0

int valfotor;

Ma il preprocessore cambia anche il fotor di valfotor trasformandolo in val0?
Credo di no, ma ho il dubbio.

PaoloP:
Ma il preprocessore cambia anche il fotor di valfotor trasfor andolo in val0?

:smiley: ... no, no, ci mancherebbe, sarebbe grave !

Guglielmo

Allora questo è lo sketch funzionante della lettura della fotoresistenza e a seconda della condizione mette in HIGH o LOW il buzzer:

#define fotor 0
int buzzer = 7;
int valfotor;

void setup(){
  pinMode (buzzer,OUTPUT);
  }
  
  void loop(){
    valfotor = analogRead(fotor);
    if(valfotor <= 1000) {
      digitalWrite(buzzer,HIGH);
      }
      else{
        digitalWrite(buzzer,LOW);
        }
        }

ciao.
Vedo un po' di confusione.
Cominci con:
Code: [Select]

...
#define fotor 0
...

Ovvero dici al compilatore che dove trova "fotor" deve sostituirlo con "0"
poi scrivi:

Non dovrebbe essere il pin 0 ma bensì il pin analogico A0, poi con analogRead leggo il valore che mi da il fotoresistore e a seconda se è <= o > di 1000 fa suonare o meno il buzzer.

Forse è questo che è sbagliato? Premetto che lo sketch con il fotoresistore e il solo laser rosso funziona se lo compilo da solo.

... aggiungo che, come ti ho già detto, se non ti memorizzi da nessuna parte lo stato del LED, ovvero se la rilevazione della fotoresistenza è attiva o meno ... come fai poi a decidere se leggerla o no ?

Forse non mi sono spiegato bene :sweat_smile: io non devo leggere lo stato del LED, il led l'ho aggiunto solo per vedere che il codice corretto sia stato inserito, infatti con il codice "793B" compie l'azione :LED SPENTO ovvero l'ho userei per disinserire il sistema d'allarme.
Adesso provo a ricontrollare un po', comunque se avete consigli da darmi li accetterei con molto piacere :grinning: :kissing: Grazie per l'aiuto

guglielmotorta:
Forse non mi sono spiegato bene :sweat_smile: io non devo leggere lo stato del LED, il led l'ho aggiunto solo per vedere che il codice corretto sia stato inserito, infatti con il codice "793B" compie l'azione :LED SPENTO ovvero l'ho userei per disinserire il sistema d'allarme.

... guarda che lo avevo capito ... :smiling_imp: ... sei tu che non stai capendo che ... dire "ti devi memorizzare lo stato del LED" (... che per altro io lascerei per avere un feedback visivo) equivale a dire : TE DEVI MEMORIZZA' DA QUALCHE PARTE SE L'ALLARME E' INSERITO O DISINSERITO ed agire di conseguenza !!!

Guglielmo

... guarda che lo avevo capito ... :smiling_imp: ..

Scusa :sweat_smile: :grinning:
Ok adesso provo a memorizzare lo stato del led e agire di conseguenza. Subito vi faccio sapere :grinning: Grazie :grin:

Ho provato a memorizzare lo stato del led ma mi da ancora dei problemi,

#include <Keypad.h>
#define LED 13
#define fotor  A0
#define buzzer 7
int valfotor;
int stato_led;



const byte ROWS = 4; // Quattro righe
const byte COLS = 4; // Quattro colonne

// Definizione mappa della tastiera
byte keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[ROWS] = {
 2, 3, 4, 5 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {
 8, 9, 10, 11 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino. 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 
// Creazione della tastiera

char code [4]; 
char i;


void setup() {
 Serial.begin(9600);
 pinMode (LED, OUTPUT);
 pinMode (buzzer,OUTPUT);
}

void loop()
{

 Serial.print("DIGITA CODICE:");
     
     for (i=0; i<4; i++) {
 	code[i] = keypad.waitForKey();
 	Serial.print("Tasto numero ");
 	//Serial.print(i);
 	//Serial.print(" - valore ");
 	Serial.println("*");}
        if((code[0] == '1') && (code[1] == '2') && (code[2] == '3') && (code[3] == 'A')) {
 	digitalWrite (LED, HIGH);
 	Serial.print ("CODICE ESATTO!");
        Serial.print("ALLARME INSERITO");
        stato_led == 1;
        }
       if((code[0] == '7') && (code[1] == '9') && (code[2] == '3') && (code[3] == 'B')) {
 	digitalWrite(LED,LOW);
        Serial.println("CODICE DISINSERITO");
     }
    
if(stato_led == 1){
        void allarme();
        }
       }
void allarme(){
  valfotor = analogRead(fotor);
  if(valfotor <= 1000){
    digitalWrite(buzzer,HIGH);
    }
    else{
      digitalWrite(buzzer,LOW);
      }
     }

Ho provato così ad aggiungere un void allarme(), non so se ho fatto bene, comunque il buzzer non suona, come posso fare?
Grazie

... e lo "stato_led" lo vogliamo aggiornare quando togli l'allarme o ... lo vogliamo lasciare fisso ad 1 ? ? ? :stuck_out_tongue_closed_eyes:

Guglielmo

Anche se ho aggiornato stato_led quando disinserisco l'allarme non funziona. come mai? non riesco proprio a capire. :sob:

stato_led == 1 ;
forse sarebbe meglio togliere un " = " , visto che non è un confronto ma un'assegnazione

Brunello:
stato_led == 1 ;
forse sarebbe meglio togliere un " = " , visto che non è un confronto ma un'assegnazione

Fatto come mi hai consigliato, ma niente lo stesso non va! possibile che ho sbagliato qualcosa nel far partire il void allarme() ?

Rimetti il programma completo con le ultime correzioni e vediamo ... :roll_eyes:

Guglielmo