aiuto lettura sensore

Ciao a tutti, avrei bisogno di un aiutino, cerco di spiegare il problema …….
Il punto riguarda il case 1 (sarebbe il secondo caso statocase = 1)
Piccola intro, la maggior parte degli IF riguarda il riconoscimento di comandi dati da un display lcd, quindi nello specifico c'è un tasto (userbutton) che può dare 1 o 0, i due valori che indirizzano nei due case.
Quando è 1 vorrei fare questa cosa , che non riesco a programmare…… in pratica ho un interruttore , non pulsante ma interruttore quindi costante su HIGH O LOW collegata al pin 5 con pulldown, in base al suo stato dovrebbe accendere o spengere il led, niente di più…. non riesco proprio a farlo…….
debuggando con i led ho visto che fino alla scelta del case arrivo bene , è proprio il discorso lettura e conseguente scrittura che mi incasina…..

chissà se c'è qualcuno che ha prima la pazienza di capire cosa ho scritto e poi di rispondere !!!!??!??! :slight_smile:

#include <genieArduino.h>

// Programma gestione sensori e luci
// by Emanuele
// ver 1.0.0
// per prova accenderemo alcuni led poi sostituiti da relel



  int LED10 = 10;           // Assegna alla variabile 10
  int LED11 = 11;           // Assegna alla variabile 11
  int LED12 = 12;           // Assegna alla variabile 12
  int SENSORE1 = 5;           // Assegna alla variabile 12
  int SENSORE2 = 6;           // Assegna alla variabile 12
  int SENSORE3 = 7;           // Assegna alla variabile 12
  int STATOSENSORE = LOW;
  int STATOCASE = 0;

// Queste le variabile per il toggle

  int LED10state = LOW;
  int LED11state = LOW;
  int LED12state = LOW;
  int STATOSENSORE1 = LOW;
  int STATOSENSORE2 = LOW;
  int STATOSENSORE3 = LOW;
void setup() 
{ 
  // apriamo il seriale per il display
  genieBegin (GENIE_SERIAL, 115200);  //Serial0
  //genieBegin (GENIE_SERIAL_1, 9600);  //Serial1
  //genieBegin (GENIE_SERIAL_2, 9600);  //Serial2
  //genieBegin (GENIE_SERIAL_3, 9600);  //Serial3
  
  genieAttachEventHandler(myGenieEventHandler);
  // dichiariamo il verso dei I/O
  
  pinMode(LED10, OUTPUT);
  pinMode(LED11, OUTPUT);
  pinMode(LED12, OUTPUT);
  pinMode(SENSORE1, INPUT);
  pinMode(SENSORE2, INPUT);
  pinMode(SENSORE3, INPUT);
  
  //Reset the Display 
  
  pinMode(4, OUTPUT);  //   Reset display su pin4
  digitalWrite(4, 1);
  delay(100);
  digitalWrite(4, 0);  // unreset
  
  delay (3500); //let the display start up
}

void loop() 
{ 
  genieDoEvents();  //Here the messages are received and queued.
}


void myGenieEventHandler(void) 
{

  genieFrame Event;
  genieDequeueEvent(&Event);
   
                   if(Event.reportObject.cmd == GENIE_REPORT_EVENT) // Se il cmd è riconosciuto nella libreria
                     {
                       if (Event.reportObject.object == GENIE_OBJ_USERBUTTON)// Se l'oggetto premuto è un 4DBUTTON
                         {
                           if (Event.reportObject.index == 0x00) // Se l'index dell'oggetto ovvero il numerino finale è 0
                               {
                                 
                               STATOCASE = (Event.reportObject.data_lsb == 0x01);
                                 
                               }
                                    switch (STATOCASE) 
                                   {   
                                    case 0:  // primo caso
                                    {

                                         if (LED10state == LOW)
                                         LED10state = HIGH;
                                         else
                                         LED10state = LOW;  
                                         digitalWrite(LED10, LED10state); 
                                   
                                    
                                    }
                                    break;  
                                    
                                     case 1:  // primo caso
                                     {
                                       STATOSENSORE1 = digitalRead (SENSORE1);
                                       digitalWrite(LED11, STATOSENSORE1); 
                                      
                                         
                                         
                                     }  
                                    break;  
                                   }
                                  } 
                                 }
                               

                        
                        {
                         if (Event.reportObject.object == GENIE_OBJ_4DBUTTON)// Se l'oggetto premuto è un 4DBUTTON
                         {
                           if (Event.reportObject.index == 0x07) // Se l'index dell'oggetto ovvero il numerino finale è 0
                            {
                               if (Event.reportObject.data_lsb == 0x01)
                               {
                               digitalWrite (LED10, HIGH);
                               }
                    
                                else
                                {
                                 digitalWrite (LED10, LOW);
                                 }
                            }
                          }
                        }
                  }

Prima di pubblicare il codice dovresti usare la funzione di autoformattazione dell'IDE. La trovi nel menu Strumenti --> Formattazione Automatica. (che non vuol dire che cancella in automatico il contenuto di Arduino, non è quel tipo di "formattazione")
Una volta sistemato il codice allora si può cercare di capire cosa fa.
Dovresti allegare i link al display che stai utilizzando e alla libreria inclusa. (giusto per capire che fa)

Comunque mi pare che lo switch sia interno ad un IF, quindi se è falso salta lo switch e tutto quello che c'è dentro.

Più che capire noi, devi tu descrivere per bene quello che vuoi che faccia il codice che hai scritto.

Facendo pulizia delle tante graffe inutili e riformattando il tuo codice è cosi:

void myGenieEventHandler(void) 
{ genieFrame Event;
  genieDequeueEvent(&Event);
  if(Event.reportObject.cmd == GENIE_REPORT_EVENT) // Se il cmd è riconosciuto nella libreria
  { if (Event.reportObject.object == GENIE_OBJ_USERBUTTON)// Se l'oggetto premuto è un 4DBUTTON
    { if (Event.reportObject.index == 0x00) // Se l'index dell'oggetto ovvero il numerino finale è 0
      { STATOCASE = (Event.reportObject.data_lsb == 0x01);
      }
      switch (STATOCASE) 
      { case 0:  // primo caso
          if (LED10state == LOW)
            LED10state = HIGH;
          else
            LED10state = LOW;  
          digitalWrite(LED10, LED10state); 
          break;  
        case 1:  // primo caso
          STATOSENSORE1 = digitalRead (SENSORE1);
          digitalWrite(LED11, STATOSENSORE1); 
          break;  
      }
    } 
  }
  if (Event.reportObject.object == GENIE_OBJ_4DBUTTON)// Se l'oggetto premuto è un 4DBUTTON
  { if (Event.reportObject.index == 0x07) // Se l'index dell'oggetto ovvero il numerino finale è 0
    { if (Event.reportObject.data_lsb == 0x01)
      { digitalWrite (LED10, HIGH);
      }
      else
      { digitalWrite (LED10, LOW);
      }
    }
  }
}

Noto perciò che lo switch è fuori dall' if (Event.reportObject.index == 0x00)
Perciò mi sembra ci siano dei casi che non calcola STATOCASE

Inoltre alcuni di quei if possono essere messi tutti insieme usando && operatore AND

 if(Event.reportObject.cmd == GENIE_REPORT_EVENT) // Se il cmd è riconosciuto nella libreria
  { if (Event.reportObject.object == GENIE_OBJ_USERBUTTON)// Se l'oggetto premuto è un 4DBUTTON

Diventa

// Se il cmd è riconosciuto nella libreria e Se l'oggetto premuto è un 4DBUTTON
 if(Event.reportObject.cmd == GENIE_REPORT_EVENT && Event.reportObject.object == GENIE_OBJ_USERBUTTON)

ciao a tutti e grazie per le risposte….. risolto grazie al fratellone ing che mi ha dato una dritta……
se guardate ero andato a scrivere il codice non sul loop , ma sulla funzione della libreria dell'lcd, e in pratica mi eseguiva i comandi solo se c'era un tasto premuto sul display….. macro errore….
per completezza di informazione posto il codice corretto (almeno per me).
Cmq il display è un 4d system e devo dire che è uno spettacolo , programmare la parte grafica con un ambiente proprietario di sviluppo tutto grafico senza scrivere una riga di codice (si chiama visi geni) e interfacciare i comandi del video via seriale……

#include <genieArduino.h>

// Programma gestione sensori e luci
// by Emanuele
// ver 1.0.0
// per prova accenderemo alcuni led poi sostituiti da relel



int LED10 = 10;           // Assegna alla variabile 10
int LED11 = 11;           // Assegna alla variabile 11
int LED12 = 12;           // Assegna alla variabile 12
int SENSORE1 = 5;           // Assegna alla variabile 12
int SENSORE2 = 6;           // Assegna alla variabile 12
int SENSORE3 = 7;           // Assegna alla variabile 12
int STATOSENSORE1 = 0;
int STATOSENSORE2 = 0;
int STATOSENSORE3 = 0;
int STATOALLARME = 0;
int STATOPULSANTELUCI = 0;
int STATOCASE = 0;



// Queste le variabile per il toggle

// int LED10state = LOW;
int LED11state = LOW;
int LED12state = LOW;
// int SENSORE1STATO = LOW;
// int SENSORE2STATO = LOW;
// int SENSORE3STATO = LOW;
// int statopulsante = 0;
void setup() 
{ 
  // apriamo il seriale per il display
  genieBegin (GENIE_SERIAL, 115200);  //Serial0
  //genieBegin (GENIE_SERIAL_1, 9600);  //Serial1
  //genieBegin (GENIE_SERIAL_2, 9600);  //Serial2
  //genieBegin (GENIE_SERIAL_3, 9600);  //Serial3

  genieAttachEventHandler(myGenieEventHandler);
  // dichiariamo il verso dei I/O

  pinMode(LED10, OUTPUT);
  pinMode(LED11, OUTPUT);
  pinMode(LED12, OUTPUT);
  pinMode(SENSORE1, INPUT);
  pinMode(SENSORE2, INPUT);
  pinMode(SENSORE3, INPUT);

  //Reset the Display 

  pinMode(4, OUTPUT);  //   Reset display su pin4
  digitalWrite(4, 1);
  delay(100);
  digitalWrite(4, 0);  // unreset

  delay (3500); //let the display start up
}

void loop() 
{ 
  genieDoEvents();  //Here the messages are received and queued.
  { 

    switch (STATOCASE) 
    {   
    case 0:  // primo caso
      {
        {
          STATOSENSORE1 = digitalRead (SENSORE1);
          STATOSENSORE2 = digitalRead (SENSORE2);
          STATOSENSORE3 = digitalRead (SENSORE3);
        }
        {  
          if (STATOSENSORE1 == LOW)
            digitalWrite (LED10, HIGH); 
          else 
            digitalWrite (LED10, LOW);
        }
        {
          if (STATOSENSORE2 == LOW)
            digitalWrite (LED11, HIGH); 
          else 
            digitalWrite (LED11, LOW);
        }
        {
          if (STATOSENSORE3 == LOW)
            digitalWrite (LED12, HIGH); 
          else 
            digitalWrite (LED12, LOW);          
        }
      }
      break;      

    case 1:  // primo caso
      {
        digitalWrite (LED10, LOW);
        digitalWrite (LED11, LOW);
        digitalWrite (LED12, LOW);

      }
      break;      

    case 2:  // primo caso
      {
        digitalWrite (LED10, HIGH);
        digitalWrite (LED11, HIGH);
        digitalWrite (LED12, HIGH);
      }
      break;              

    case 3:  // primo caso
      {
        digitalWrite (LED10, LOW);
        digitalWrite (LED11, LOW);
        digitalWrite (LED12, LOW);
      }
      break; 

    case 4:  // primo caso
      {
        {
          STATOSENSORE1 = digitalRead (SENSORE1);
          STATOSENSORE2 = digitalRead (SENSORE2);
          STATOSENSORE3 = digitalRead (SENSORE3);
        }
        {  
          if (STATOSENSORE1 == LOW)
          {
            digitalWrite (LED10, HIGH); 
            delay (5000);
            digitalWrite (LED10, LOW);
          }
          else 
            digitalWrite (LED10, LOW);

        }
        {
          if (STATOSENSORE2 == LOW)
          {
            digitalWrite (LED11, HIGH); 
            delay (5000); 
            digitalWrite (LED11, LOW);
          }
          digitalWrite (LED11, LOW);
        }
        {
          if (STATOSENSORE3 == LOW)
          {
            digitalWrite (LED12, HIGH); 
            delay (5000);
            digitalWrite (LED12, LOW);
          }  
          digitalWrite (LED12, LOW);       
        }
      }
      break;    
    case 5:  // primo caso
      {
        digitalWrite (LED10, LOW);
        digitalWrite (LED11, LOW);
        digitalWrite (LED12, LOW);
      }
      break;   







    }
  }
}
void myGenieEventHandler(void) 
{
  genieFrame Event;
  genieDequeueEvent(&Event);

  if(Event.reportObject.cmd == GENIE_REPORT_EVENT) // Se il cmd è riconosciuto nella libreria
  {
    if (Event.reportObject.object == GENIE_OBJ_USERBUTTON)// Se l'oggetto premuto è un 4DBUTTON
    {
      if (Event.reportObject.index == 0x00) // Se l'index dell'oggetto ovvero il numerino finale è 0
      {
        if (Event.reportObject.data_lsb == 1)
        {
          (STATOCASE = 0);
        }
        {
          if (Event.reportObject.data_lsb == 0)
            (STATOCASE = 1);
        }
      }
    }
  }

  {
    if (Event.reportObject.object == GENIE_OBJ_4DBUTTON)// Se l'oggetto premuto è un 4DBUTTON
    {
      if (Event.reportObject.index == 0x07) // Se l'index dell'oggetto ovvero il numerino finale è 0
      {
        if (Event.reportObject.data_lsb == 1)
        {
          (STATOCASE = 2);
        }
        {
          if (Event.reportObject.data_lsb == 0)
            (STATOCASE = 3);
        }

      }
    }
    {
      if (Event.reportObject.index == 0x04) // Se l'index dell'oggetto ovvero il numerino finale è 0
      {
        if (Event.reportObject.data_lsb == 1)
        {
          (STATOCASE = 4);
        }
        {
          if (Event.reportObject.data_lsb == 0)
            (STATOCASE = 5);
        }
      }
    }
  }
}