Sala degenza programma

Salve ragazzi vorrei chiedervi un aiuto,il programma è formato da 3 pulsanti per stanza
1 pulsante interrompe il buzzer e spegne il led
1 pulsante accende il led sopra lettino paziente e accende il buzzer
1 pulsante accende un altro led sopra il lettino paziente e accende il buzzer.

Se appunto imposto il programma per quanto riguarda una sola stanza funziona tutto alla perfezione ( lp stesso programma sotto elencato ma solo per 1 stanza)
Se invece si aggiungono altre due stanza non risponde ai miei “comandi” (quindi il programma completo sotto elencato).
Vorrei chiederVi appunto un aiuto a capire il problema,in quanto sorge solo quando si aggiungono le ulteriori stanze, controllato più volte il programma ma mi sembra essere tutto ok.

 int ledRedSTANZA1 = 10;                              // ledRed assegnato al pin 9 
int ledRedSTANZA12 = 9;
int ledRedSTANZA13 = 8;
int pulsinterruzioneST1 = 7;                 // pulsante1 assegnato al pin 7  
int pulschiamataST1 = 6;                     // pulsante2 assegnato al pin 6  
int pulschiamataST12= 13;                    // pulsante3 assegnato al pin 10  
int statoSTANZA1=0;
int buzzerSTANZA1 = 50 ;                             // buzzer assegnato al pin 13;

int pulsinterruzioneST2 = 22;    
int pulschiamataST2 = 23;   
int pulschiamataST21= 24;
int ledRedSTANZA2= 25;
int ledRedSTANZA21= 26;
int ledRedSTANZA22= 27;
int buzzerSTANZA2= 51;
int statoSTANZA2=0;


int pulsinterruzioneST3 = 28;    
int pulschiamataST3 = 29;   
int pulschiamataST31= 30;
int ledRedSTANZA3= 31;
int ledRedSTANZA31= 32;
int ledRedSTANZA32= 33;
int buzzerSTANZA3= 52;
int statoSTANZA3=0;




int buzzerINCENDIO =53;
int statoINCENDIO=0; 
int ledVerdeINCENDIO = 34;
int ledVerdeINCENDIO1 = 35;
int ledVerdeINCENDIO2 = 36;
int ledVerdeINCENDIO3 = 37;  
int pulsINCENDIO= 38 ;



#include <LiquidCrystal.h>                    
LiquidCrystal lcd( 12, 11, 5, 4, 3, 2);   // ogni pin ha il suo rispettivo collegamento al display

void setup(){   // setto le variabili
lcd.begin(16,2);     // 16 sono i caratteri , 2 le righe.

pinMode(ledRedSTANZA1,OUTPUT);                        // ledRed assegnato come uscita    
pinMode(ledRedSTANZA12,OUTPUT);                         // ledYw assegnato come uscita
pinMode(ledRedSTANZA13,OUTPUT);
pinMode(ledRedSTANZA2,OUTPUT);
pinMode(ledRedSTANZA21,OUTPUT);
pinMode(ledRedSTANZA22,OUTPUT);
pinMode(ledRedSTANZA3,OUTPUT);
pinMode(ledRedSTANZA31,OUTPUT);
pinMode(ledRedSTANZA32,OUTPUT);

pinMode(pulsinterruzioneST1,INPUT);            // pulsinterruzioneST1 assegnato come ingresso
pinMode(pulschiamataST1,INPUT);                // pulschiamataST1 assegnato come ingresso
pinMode(pulschiamataST12,INPUT);               // pulschiamataST12 assegnato come ingresso
pinMode(pulsinterruzioneST2,INPUT);
pinMode(pulschiamataST2,INPUT);
pinMode(pulschiamataST21,INPUT);
pinMode(pulsinterruzioneST3,INPUT);
pinMode(pulschiamataST3,INPUT);
pinMode(pulschiamataST31,INPUT);

pinMode(buzzerSTANZA1,OUTPUT);
pinMode(buzzerSTANZA2,OUTPUT);                        // buzzer assegnato come uscita
pinMode(buzzerSTANZA3,OUTPUT);

pinMode(pulsINCENDIO,INPUT);                   // pulsINCENDIO assegnato come ingresso
pinMode(buzzerINCENDIO,OUTPUT);                // buzzerINCENDIO assegnato come uscita
pinMode(ledVerdeINCENDIO,OUTPUT);
pinMode(ledVerdeINCENDIO1,OUTPUT);
pinMode(ledVerdeINCENDIO2,OUTPUT);
pinMode(ledVerdeINCENDIO3,OUTPUT);
}

void loop(){        // ciclo da svolgere all'infinito

if (statoSTANZA1 == 0){         // se lo stato è 0 (pulsante1 premuto)
noTone(buzzerSTANZA1);                // il buzzer non emette nessun suono
digitalWrite(ledRedSTANZA12,LOW);      // ledRed spento
digitalWrite(ledRedSTANZA1,LOW);       // ledYw spento
digitalWrite(ledRedSTANZA13,LOW);
lcd.display();                  
lcd.clear();
lcd.print("Interruzione");      // scrivi sopra al display interruzione Stanza1
lcd.setCursor(0,1);             
lcd.print("Stanza 1,2,3");         

}

if (statoSTANZA1 == 1 ){            // se lo stato è 1 (puls2 premuto)
  tone(buzzerSTANZA1,450,200);       // emetti un suono di frequenza 450,200
digitalWrite(ledRedSTANZA1,HIGH);    // ledRed acceso
digitalWrite(ledRedSTANZA12,HIGH);     // ledYw acceso
lcd.display();
lcd.clear();
lcd.print("Chiamata");        // scrivi sopra al display chiamata Staanza1
lcd.setCursor(12,1);
lcd.print("Stanza 1");
  
}

if (statoSTANZA1==2){                             // se lo stato è 2 (puls3 premuto)
 tone(buzzerSTANZA1,450,200);            // emette un suono differente di frequenza 600,400
digitalWrite(ledRedSTANZA13,HIGH);    // ledRed acceso
digitalWrite(ledRedSTANZA1,HIGH);     // ledYw acceso
lcd.display();
lcd.clear();
lcd.print("Chiamata");        // scrivi sopra al display chiamata Staanza1
lcd.setCursor(12,1);
lcd.print("Stanza 1");    
}

// STANZA 2


if (statoSTANZA2==0){
noTone(buzzerSTANZA2);                // il buzzer non emette nessun suono
digitalWrite(ledRedSTANZA2,LOW);      // ledRed spento
digitalWrite(ledRedSTANZA21,LOW);       // ledYw spento
digitalWrite(ledRedSTANZA22,LOW);
lcd.display();                  
lcd.clear();
lcd.print("Interruzione");      // scrivi sopra al display interruzione Stanza1
lcd.setCursor(0,1);             
lcd.print("Stanza 1,2,3");    
}

if (statoSTANZA2==1){
tone(buzzerSTANZA2,450,200);       // emetti un suono di frequenza 450,200
digitalWrite(ledRedSTANZA2,HIGH);    // ledRed acceso
digitalWrite(ledRedSTANZA21,HIGH);     // ledYw acceso
lcd.display();
lcd.clear();
lcd.print("Chiamata");        // scrivi sopra al display chiamata Staanza1
lcd.setCursor(12,1);
lcd.print("Stanza 2");
  
}

if (statoSTANZA2==2){
tone(buzzerSTANZA2,450,200);       // emetti un suono di frequenza 450,200
digitalWrite(ledRedSTANZA2,HIGH);    // ledRed acceso
digitalWrite(ledRedSTANZA22,HIGH);     // ledYw acceso
lcd.display();
lcd.clear();
lcd.print("Chiamata");        // scrivi sopra al display chiamata Staanza1
lcd.setCursor(12,1);
lcd.print("Stanza 2");
}

// STANZA 3 

if (statoSTANZA3==0){
noTone(buzzerSTANZA3);                // il buzzer non emette nessun suono
digitalWrite(ledRedSTANZA3,LOW);      // ledRed spento
digitalWrite(ledRedSTANZA31,LOW);       // ledYw spento
digitalWrite(ledRedSTANZA32,LOW);
lcd.display();                  
lcd.clear();
lcd.print("Interruzione");      // scrivi sopra al display interruzione Stanza1
lcd.setCursor(0,1);             
lcd.print("Stanza 1,2,3");    
}

if (statoSTANZA3==1){
tone(buzzerSTANZA3,450,200);       // emetti un suono di frequenza 450,200
digitalWrite(ledRedSTANZA3,HIGH);    // ledRed acceso
digitalWrite(ledRedSTANZA31,HIGH);     // ledYw acceso
lcd.display();
lcd.clear();
lcd.print("Chiamata");        // scrivi sopra al display chiamata Staanza1
lcd.setCursor(12,1);
lcd.print("Stanza 3");
  
}

if (statoSTANZA3==2){
tone(buzzerSTANZA3,450,200);       // emetti un suono di frequenza 450,200
digitalWrite(ledRedSTANZA3,HIGH);    // ledRed acceso
digitalWrite(ledRedSTANZA32,HIGH);     // ledYw acceso
lcd.display();
lcd.clear();
lcd.print("Chiamata");        // scrivi sopra al display chiamata Staanza1
lcd.setCursor(12,1);
lcd.print("Stanza 3");
}

// ALLARME INCENDIO

if (statoINCENDIO==0) {
  tone ( buzzerINCENDIO,600,400);
  digitalWrite (ledVerdeINCENDIO,HIGH);
  delay(300);
  digitalWrite(ledVerdeINCENDIO1,HIGH);
  delay(300);
  digitalWrite(ledVerdeINCENDIO2,HIGH);
  delay(300);
  digitalWrite(ledVerdeINCENDIO3,HIGH);
  
 }


// STANZA 1 CICLO IF

if(digitalRead(pulsinterruzioneST1)==HIGH){        
  statoSTANZA1=0;                           

}

if (digitalRead(pulschiamataST1)==HIGH){      
  statoSTANZA1=1;                          
}

if (digitalRead(pulschiamataST12)==HIGH){       
  statoSTANZA1=2;                          
}


// STANZA 2 CICLO IF


if(digitalRead(pulsinterruzioneST2)==HIGH){        
  statoSTANZA2=0;                           

}

if (digitalRead(pulschiamataST2)==HIGH){      
  statoSTANZA2=1;                          
}

if (digitalRead(pulschiamataST21)==HIGH){       
  statoSTANZA2=2;                           
}


// STANZA 3 CICLO IF

if(digitalRead(pulsinterruzioneST3)==HIGH){        
  statoSTANZA3=0;                           

}

if (digitalRead(pulschiamataST3)==HIGH){      
  statoSTANZA3=1;                          
}

if (digitalRead(pulschiamataST31)==HIGH){        
  statoSTANZA3=2;                           
}


// ALLARME INCENDIO

if (digitalRead(pulsINCENDIO)==HIGH){
  statoINCENDIO=0;
  
}

}

Ciao, il programma sembra corretto, il fatto che smette di risponderti dipende dal fatto che ad ogni ciclo del loop scrivi sull'lcd. A me è capitato che nelle solite condizioni tue scrivendo di continuo sull'lcd iniziavo a vedere caratteri strani e funzionamenti anomali.
Potresti provare a crearti delle variabili di statoPrecedenteStanza per ciascuna stanza e se il vecchio stato è uguale all'attuale eviti di entrare nell'if e fare scritture e operazioni.
Non so come funziona la funzione tone, se una volta invocata continua a suonare all'infinito finché non arriva la noTone dovrebbe andare, altrimenti potresti escludere solo il refresh dei led e dell'lcd.
Come ottimizzazioni ulteriori potresti evitare di scomodare un int per lo stato delle stanze ti basta un byte.
Infine se per gestire stati e stanze vai ad utilizzare degli array anziché delle variabili singole potresti evitare il copia-incolla ripetendo il solito codice n volte ma potresti crearti una funzione che dato l'indice dell'array va a verificare stati, accendere il led corretti ecc.

Per la tone, se gli passi solo il pin e la frequenza continua a suonare fino al notone, se gli passi anche i millisecondi di durata, smette da sola dopo quelli ... :wink:

fabpolli:
Ciao, il programma sembra corretto, il fatto che smette di risponderti dipende dal fatto che ad ogni ciclo del loop scrivi sull'lcd. A me è capitato che nelle solite condizioni tue scrivendo di continuo sull'lcd iniziavo a vedere caratteri strani e funzionamenti anomali.
Potresti provare a crearti delle variabili di statoPrecedenteStanza per ciascuna stanza e se il vecchio stato è uguale all'attuale eviti di entrare nell'if e fare scritture e operazioni.
Non so come funziona la funzione tone, se una volta invocata continua a suonare all'infinito finché non arriva la noTone dovrebbe andare, altrimenti potresti escludere solo il refresh dei led e dell'lcd.
Come ottimizzazioni ulteriori potresti evitare di scomodare un int per lo stato delle stanze ti basta un byte.
Infine se per gestire stati e stanze vai ad utilizzare degli array anziché delle variabili singole potresti evitare il copia-incolla ripetendo il solito codice n volte ma potresti crearti una funzione che dato l'indice dell'array va a verificare stati, accendere il led corretti ecc.

Ti ringrazio per la risposta, eliminando quibdi lcd display, lcd clear, aggiungendo byte a posto di int DOVREBBE andare?
Per quanto riguarfa il fatto del creare una variabile "statoprecedenteStanza" non saprei come impostarlo,se potresto farmi un esempio te ne sarei grato.

Etemenanki:
Per la tone, se gli passi solo il pin e la frequenza continua a suonare fino al notone, se gli passi anche i millisecondi di durata, smette da sola dopo quelli ... :wink:

Se ti riferivi a me il buzzer deve suonare fin quando non vado a premere il pulsante ecco perché non ho messo nessun tempo.

Dovrebbe andare se il problema è nei troppi aggiornamenti dell'lcd, se non è quello... no :slight_smile:
byte al posto di int non risolve nessun problema è solo un ottimizzazione dell'occupazione delle risorse.
Per la variabile di stato:
nel setup metti una cosa del tipo

statoPrecedenteStanza1 = 254;  //un valore qualsiasi che non sia valido nel caso attuale 0,1 e 2

L'if

if (statoSTANZA1 == 0){

putrebbe diventare

if (statoSTANZA1 == 0 && statoSTANZA1 != statoPrecedenteStanza1){

e dopo i vari controlli della stanza 1 metti una cosa del tipo

statoPrecedenteStanza1 = statoSTANZA1;

ma a questo punto deve verificare se il comportamento del programma è quello desiderato, io per sicurezza lo verificherei nel programma con una sola stanza che funziona secondo le tue specifiche, fai le modifiche e vedi se tutto continua a funzionare come previsto, a quel punto lo porti nella versione con più stanze, che se hai voglia di imparare e scrivere un codice migliore torno a consigliarti l'uso delle funzioni in modo da riutilizzare il solito codice funzionante per una, due, cento, mille stanze

Il fatto è ché con l’uso delle funzioni non saprei neanche dove mettere mano…

Una "funzione" non e' altro che un pezzo di codice a cui assegni un nome, e che poi richiami nei punti in cui ti serve che quella sequenza venga eseguita, invece di scriverli tutte le volte ... ad esempio, molto banalmente ... metti di avere uno sketch in cui, in parecchi punti, tu devi invertire lo stato di una decina di uscite ... o scrivi il blocco delle istruzioni necessarie tutte le volte che devi farlo, quindi duplicandolo parecchie volte, oppure ti scrivi una funzione che contiene tutti i comandi, una volta sola, gli dai il nome che vuoi tu (ad esempio "inverti" ), e poi la richiami in tutti i punti dove ti serve, tipo:

... definizioni, setup, ecc

void inverti()      //questa e' la tua funzione
{
   ...
   blocco di istruzioni
   necessario per invertire
   lo stato di tutte le
   uscite che vuoi invertire
}

void loop()
{ 
   ...
   ... il tuo sketch
   ...
   inverti()      //ogni volta che devi eseguire tutto il contenuto della funzione,
   ...            //invece di riscriverlo tutto, ti limiti a richiamarla come un comando 
   ...
   ...
   inverti()       //e questo ogni volta che ti serve
   ...
   ...
}

Funziona solo che il pulsante devo tenerlo premuto…come posso fare per far sì che cliccando una sola volta il pulsante rimangano accesi i rispettivi led?
Mi spiego meglio, ad esempio pulsante chiamata1 si accendono i 2 rispettivi led; come posso fare in modo che cliccando una sola volta diciamo memorizzi lo stato e rimanga così?Fino alla pressione del pulsante interruzione che spegne i rispettivi led?

   const int INDICE_PIN = 3; // definisce una costante per il numero di pin  
  
int pinPulsanti[INDICE_PIN] = {6,7,8};    // create un array of pin per gli input  
                                            // costituiti dai pulsanti  
  
int pinLed[INDICE_PIN] = {9,10,11};     // crea un array di pin di output per il LED  
  
void setup()  
{  
  for(int indice = 0; indice < INDICE_PIN; indice++)  
  {  
    pinMode(pinLed[indice], OUTPUT);            // dichiara il LED come output  
    pinMode(pinPulsanti[indice], INPUT);        // dichiara il pulsante come input  
    digitalWrite(pinPulsanti[indice],HIGH);     // abilita la resistenza di pull-up  
      
    // l'abilitazione della resistenza di pull-up mi permette di non utilizzare  
    // una resistenza esterna in serie al pulsante  
  }  
}  
  
void loop(){  
  for(int indice = 0; indice < INDICE_PIN; indice++)  
  {  
    int val = digitalRead(pinPulsanti[indice]);  // legge il valore di input  
    if (val == LOW)                              // controlla se il pulsante è premuto  
    {  
      if (indice == 0)  
      {  
        chiamata1(pinLed[indice]);  
      }  
      if (indice == 1)  
      {  
        chiamata2(pinLed[indice]);  
      }  
      if (indice == 2)  
      {  
        interruzione12(pinLed[indice]);  
      }  
       
    }  
    else  
    {  
      digitalWrite(pinLed[indice], LOW);          // spegne il LED  
    }  
  }  
}  
  
void chiamata1(int pin)  
{  
  digitalWrite(pinLed[0],HIGH);       // accende il LED  
            // attende 50 millisecondi  
  digitalWrite(pinLed[1],HIGH);// spegne il LED  
    
}  
  
void chiamata2 ( int pin)
{  
  digitalWrite(pinLed[0],HIGH);   
   // attende 100 millisecondi  
  digitalWrite(pinLed[2],HIGH); 
   
}  
  
void interruzione12( int pin)
{  
  digitalWrite(pinLed[0],LOW);
  digitalWrite(pinLed[1],LOW);
  digitalWrite(pinLed[2],LOW);
                      
}

Se vuoi che lo sketch "memorizzi" degli stati, devi usare delle flag (banali variabili bin in piu, che metti tu nello stato che ti serve per poter poi fare dei confronti sullo stato delle uscite) ... ad esempio, se vuoi che il programma "ricordi" che un'uscita e' accesa, dichiari una variabile, la chiami come vuoi, ad esempio uscita1, e quando mandi alta l'uscita fai anche uscita1=1; ... cosi nello sketch puoi condizionare l'esecuzione di certe cose allo stato delle varie flag (sempre ad esempio, accendere l'uscita solo se il pulsante e' premuto E la variabile e' a zero, che vuol dire che l'uscita prima era spenta, ed allo stesso tempo, la spegni solo se premi il pulsante per spegnere E l'uscita e' accesa, e cosi via) ...