problema con Apertura a combinazione numerica e fotoresistenza per luci

Salve a tutti del forum… Ho un problema… guardando qua e la sul web ho fatto uno sketch che mi permetta, tramite combinazione numerica di aprire un cancello con elettroserratura tramite relè e volevo che mettendo un unico codice mi apra il cancello e solo di sera (cioè tramite una fotoresistenza che misuri la luce) con un altro rele mi accenda la luce… tutto funziona perfettamente tranne l’eccitamento del relè dedicato alle luci… sicuramente è un problema di codice ma non riesco a capire dove…

vi posto il codice e… speriamo bene…

ringrazio anticipatamente…

//keypad with password


#include <Keypad.h>
const int RELE = 10;
const int RELE1 = 9;
const byte myRows = 4;  // number of rows
const byte myCols = 3;  //number of columns
long Luce = 450;
long Val = 0;
const int FOTORES = 0;    //Pulsante ON/OFF

char keys[myRows][myCols] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
}; //character array to map the button layout of the keypad

byte rowPins[myRows] = {7, 5, 8, 2 }; //array to map keypad to MCU pins
byte colPins[myCols] = {6, 3, 4 }; //array to map keypad to MCU pins

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, myRows, myCols ); //keypad library map function

char inputArray[4]; //array to gather user keypad presses
char Main[4] = {'5','5','5','5'}; //array to hold keypad password
char Guest[4] = {'2','4','6','8'};
char Lock[4] = {'1','1','1','1'};
char Unlock[4] = {'2','2','2','2'};

#define ledPin 13 //led to register keypad pressses
#define registerPin 12 //led that registers correct password entry

int i = 0;
int state = 1; //Creates the state

void setup()
{
  Serial.begin(9600); //open serial porrt
pinMode(FOTORES, INPUT);  //Impostazione PIN come ingresso
pinMode(ledPin, OUTPUT); //define led pin as output
pinMode(registerPin, OUTPUT); //define led pin as output
pinMode(RELE, OUTPUT);
pinMode(RELE1, OUTPUT);
}

void loop()
{
 {
   
  Val=analogRead(FOTORES);
  //Visualizzazione su seriale del valore analogico della fotoresistenza
  Serial.print("Fotoresistenza: ");
  Serial.println(Val);
 while (state = 1)
 
  {
       
       
  char key = kpd.getKey();

  //if a key is presseds
    if(key)
      {

      //turn on ledPin
      digitalWrite(ledPin, HIGH);
      delay(100);
      digitalWrite(ledPin, LOW);
      delay(100);
      inputArray[i] = key; //store entry into array
      i++;
      Serial.println(key); //print keypad character entry to serial port

      if (key=='*')
        {
          Serial.println("Reset");
          i=0; //reset i
        }

      if (i == 4) //if 4 presses have been made
        {
          {

          //match input array to password array

            if (inputArray[0] == Main[0] &&
            inputArray[1] == Main[1] &&
            inputArray[2] == Main[2] &&
            inputArray[3] == Main[3])
               {
                digitalWrite(registerPin, HIGH); //turn on registerPin led
                digitalWrite(RELE,HIGH);
                delay(1000);
                digitalWrite(RELE,LOW);
                digitalWrite(registerPin, LOW);
               }
                if (Val<=Luce)  //Se il valore della fotoresistenza è inferiore di quello desiderato per la luce, si attiva il relè
  {
    digitalWrite(RELE1,HIGH);
    delay(1000);
    digitalWrite(RELE1,LOW);
     Serial.println("Sera");
  }
  else
  {
    digitalWrite(RELE1,LOW);
    Serial.println("Giorno");
  }
  delay(1000);
          }
          
          {

          //match input array to password array

            if (inputArray[0] == Guest[0] &&
            inputArray[1] == Guest[1] &&
            inputArray[2] == Guest[2] &&
            inputArray[3] == Guest[3])
               {
                digitalWrite(registerPin, HIGH); //turn on registerPin led
                digitalWrite(RELE,HIGH);
                delay(1000);
                digitalWrite(RELE,LOW);
                digitalWrite(registerPin, LOW);
               }
                if (Val<=Luce)  //Se il valore della fotoresistenza è inferiore di quello desiderato per la luce, si attiva il relè
  {
    digitalWrite(RELE1,HIGH);
    delay(1000);
    digitalWrite(RELE1,LOW);
     Serial.println("Sera");
  }
  else
  {
    digitalWrite(RELE1,LOW);
    Serial.println("Giorno");
  }
  delay(1000);
          }
          
          {

          //match input array to password array

            if (inputArray[0] == Lock[0] &&
            inputArray[1] == Lock[1] &&
            inputArray[2] == Lock[2] &&
            inputArray[3] == Lock[3])
               {
                
                Serial.println("State 2");
                state = 2;
                break;
               }
          }
          
          {
          i=0; //reset i
          }
        }
      }
    };
   }
  
 {
  
  while (state = 2)
 
  {
       
       
  char key = kpd.getKey();

  //if a key is presseds
    if(key)
      {

      //turn on ledPin
      digitalWrite(ledPin, HIGH);
      delay(100);
      digitalWrite(ledPin, LOW);
      delay(100);
      inputArray[i] = key; //store entry into array
      i++;
      Serial.println(key); //print keypad character entry to serial port

      if (key=='*')
        {
          Serial.println("Reset");
          i=0; //reset i
        }

      if (i == 4) //if 4 presses have been made
        {
          {

          //match input array to password array

            if (inputArray[0] == Main[0] &&
            inputArray[1] == Main[1] &&
            inputArray[2] == Main[2] &&
            inputArray[3] == Main[3])
               {
                digitalWrite(registerPin, HIGH); //turn on registerPin led
                delay(1000);
                digitalWrite(registerPin, LOW);
               }
          }
          
          {

          //match input array to password array

            if (inputArray[0] == Unlock[0] &&
            inputArray[1] == Unlock[1] &&
            inputArray[2] == Unlock[2] &&
            inputArray[3] == Unlock[3])
               {
                digitalWrite(RELE,HIGH);
                delay(1000);
                digitalWrite(RELE,LOW);
                 Serial.println("State 1"); 
                state = 1;
                break;
               }
          }
          
          {
          i=0; //reset i
          }
        }
      }
    };
  
 }
  
  
}

Quando usi while fai un confronto, non un'assegnazione quindi

while (state = 1)

diventa

while (state == 1)

Non ho visto tutto il resto dello sketch, intanto modifica questo

Grazie, errore corretto…

ma pensi che possa essere questo il problema?? :frowning:

//keypad with password


#include <Keypad.h>
const int RELE = 10;
const int RELE1 = 9;
const byte myRows = 4;  // number of rows
const byte myCols = 3;  //number of columns
long Luce = 450;
long Val = 0;
const int FOTORES = 0;    //Pulsante ON/OFF

char keys[myRows][myCols] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
}; //character array to map the button layout of the keypad

byte rowPins[myRows] = {7, 5, 8, 2 }; //array to map keypad to MCU pins
byte colPins[myCols] = {6, 3, 4 }; //array to map keypad to MCU pins

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, myRows, myCols ); //keypad library map function

char inputArray[4]; //array to gather user keypad presses
char Main[4] = {'5','5','5','5'}; //array to hold keypad password
char Guest[4] = {'2','4','6','8'};
char Lock[4] = {'1','1','1','1'};
char Unlock[4] = {'2','2','2','2'};

#define ledPin 13 //led to register keypad pressses
#define registerPin 12 //led that registers correct password entry

int i = 0;
int state = 1; //Creates the state

void setup()
{
  Serial.begin(9600); //open serial porrt
pinMode(FOTORES, INPUT);  //Impostazione PIN come ingresso
pinMode(ledPin, OUTPUT); //define led pin as output
pinMode(registerPin, OUTPUT); //define led pin as output
pinMode(RELE, OUTPUT);
pinMode(RELE1, OUTPUT);
}

void loop()
{
 {
   
  Val=analogRead(FOTORES);
  //Visualizzazione su seriale del valore analogico della fotoresistenza
  Serial.print("Fotoresistenza: ");
  Serial.println(Val);
 while (state == 1)
 
  {
       
       
  char key = kpd.getKey();

  //if a key is presseds
    if(key)
      {

      //turn on ledPin
      digitalWrite(ledPin, HIGH);
      delay(100);
      digitalWrite(ledPin, LOW);
      delay(100);
      inputArray[i] = key; //store entry into array
      i++;
      Serial.println(key); //print keypad character entry to serial port

      if (key=='*')
        {
          Serial.println("Reset");
          i=0; //reset i
        }

      if (i == 4) //if 4 presses have been made
        {
          {

          //match input array to password array

            if (inputArray[0] == Main[0] &&
            inputArray[1] == Main[1] &&
            inputArray[2] == Main[2] &&
            inputArray[3] == Main[3])
               {
                digitalWrite(registerPin, HIGH); //turn on registerPin led
                digitalWrite(RELE,HIGH);
                delay(1000);
                digitalWrite(RELE,LOW);
                digitalWrite(registerPin, LOW);
               }
                if (Val<=Luce)  //Se il valore della fotoresistenza è inferiore di quello desiderato per la luce, si attiva il relè
  {
    digitalWrite(RELE1,HIGH);
    delay(1000);
    digitalWrite(RELE1,LOW);
     Serial.println("Sera");
  }
  else
  {
    digitalWrite(RELE1,LOW);
    Serial.println("Giorno");
  }
  delay(1000);
          }
          
          {

          //match input array to password array

            if (inputArray[0] == Guest[0] &&
            inputArray[1] == Guest[1] &&
            inputArray[2] == Guest[2] &&
            inputArray[3] == Guest[3])
               {
                digitalWrite(registerPin, HIGH); //turn on registerPin led
                digitalWrite(RELE,HIGH);
                delay(1000);
                digitalWrite(RELE,LOW);
                digitalWrite(registerPin, LOW);
               }
                if (Val<=Luce)  //Se il valore della fotoresistenza è inferiore di quello desiderato per la luce, si attiva il relè
  {
    digitalWrite(RELE1,HIGH);
    delay(1000);
    digitalWrite(RELE1,LOW);
     Serial.println("Sera");
  }
  else
  {
    digitalWrite(RELE1,LOW);
    Serial.println("Giorno");
  }
  delay(1000);
          }
          
          {

          //match input array to password array

            if (inputArray[0] == Lock[0] &&
            inputArray[1] == Lock[1] &&
            inputArray[2] == Lock[2] &&
            inputArray[3] == Lock[3])
               {
                
                Serial.println("State 2");
                state = 2;
                break;
               }
          }
          
          {
          i=0; //reset i
          }
        }
      }
    };
   }
  
 {
  
  while (state == 2)
 
  {
       
       
  char key = kpd.getKey();

  //if a key is presseds
    if(key)
      {

      //turn on ledPin
      digitalWrite(ledPin, HIGH);
      delay(100);
      digitalWrite(ledPin, LOW);
      delay(100);
      inputArray[i] = key; //store entry into array
      i++;
      Serial.println(key); //print keypad character entry to serial port

      if (key=='*')
        {
          Serial.println("Reset");
          i=0; //reset i
        }

      if (i == 4) //if 4 presses have been made
        {
          {

          //match input array to password array

            if (inputArray[0] == Main[0] &&
            inputArray[1] == Main[1] &&
            inputArray[2] == Main[2] &&
            inputArray[3] == Main[3])
               {
                digitalWrite(registerPin, HIGH); //turn on registerPin led
                delay(1000);
                digitalWrite(registerPin, LOW);
               }
          }
          
          {

          //match input array to password array

            if (inputArray[0] == Unlock[0] &&
            inputArray[1] == Unlock[1] &&
            inputArray[2] == Unlock[2] &&
            inputArray[3] == Unlock[3])
               {
                digitalWrite(RELE,HIGH);
                delay(1000);
                digitalWrite(RELE,LOW);
                 Serial.println("State 1"); 
                state = 1;
                break;
               }
          }
          
          {
          i=0; //reset i
          }
        }
      }
    };
  
 }
  
  
}

Correggi anche l'altro:

while (state = 2)

corretto anche l'altro, ma non funziona lo stesso...

cosa potrebbe essere non lo so....

Ci sarà un problema di logica. Così com'è lo sketch è però difficile da seguire... usi doppie parentesi graffe per aprire blocchi di codice anche dove non servono (ad esempio il loop(), metti una graffa e poi dopo un'altra graffa), poi c'è un if molto spostato a destra mentre il blocco di codice che lo segue è molto rientrato a sinistra. Insomma, diventa difficile capire un codice scritto così, pensa correggerlo :sweat_smile:

Ciao Leo72, innanzitutto grazie per l’aiuto e scusa ma come programmazione sono un pò a terra… :blush:

per l’indentatura credo vada bene un pò così ma per quanto riguarda le parentesi graffe non so come risolvere… ho provato a toglierne qualcuna, per me inutile, ma quando poi verifico con l’iDE mi da degli errori… non riesco proprio a capire quali sono quelle in più…

mi potresti dare una mano non tanto a sistemare il mio sketch, ma a capire cosa si deve fare e perchè??? tanto per non ricadere nello stesso errore al prossimo sketch…

grazie anticipatamente…

//keypad with password


#include <Keypad.h>
const int RELE = 10;
const int RELE1 = 9;
const byte myRows = 4;  // number of rows
const byte myCols = 3;  //number of columns
long Luce = 450;
long Val = 0;
const int FOTORES = 0;    //Pulsante ON/OFF

char keys[myRows][myCols] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
}; //character array to map the button layout of the keypad

byte rowPins[myRows] = {7, 5, 8, 2 }; //array to map keypad to MCU pins
byte colPins[myCols] = {6, 3, 4 }; //array to map keypad to MCU pins

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, myRows, myCols ); //keypad library map function

char inputArray[4]; //array to gather user keypad presses
char Main[4] = {'5','5','5','5'}; //array to hold keypad password
char Guest[4] = {'2','4','6','8'};
char Lock[4] = {'1','1','1','1'};
char Unlock[4] = {'2','2','2','2'};

#define ledPin 13 //led to register keypad pressses
#define registerPin 12 //led that registers correct password entry

int i = 0;
int state = 1; //Creates the state

void setup()
{
  Serial.begin(9600); //open serial porrt
pinMode(FOTORES, INPUT);  //Impostazione PIN come ingresso
pinMode(ledPin, OUTPUT); //define led pin as output
pinMode(registerPin, OUTPUT); //define led pin as output
pinMode(RELE, OUTPUT);
pinMode(RELE1, OUTPUT);
}

void loop()
{
 {
   
  Val=analogRead(FOTORES);
  //Visualizzazione su seriale del valore analogico della fotoresistenza
  Serial.print("Fotoresistenza: ");
  Serial.println(Val);
 while (state == 1)
 
  {
       
       
  char key = kpd.getKey();

  //if a key is presseds
    if(key)
      {

      //turn on ledPin
      digitalWrite(ledPin, HIGH);
      delay(100);
      digitalWrite(ledPin, LOW);
      delay(100);
      inputArray[i] = key; //store entry into array
      i++;
      Serial.println(key); //print keypad character entry to serial port

      if (key=='*')
        {
          Serial.println("Reset");
          i=0; //reset i
        }

      if (i == 4) //if 4 presses have been made
        {
          {

          //match input array to password array

            if (inputArray[0] == Main[0] &&
            inputArray[1] == Main[1] &&
            inputArray[2] == Main[2] &&
            inputArray[3] == Main[3])
               {
                digitalWrite(registerPin, HIGH); //turn on registerPin led
                digitalWrite(RELE,HIGH);
                delay(1000);
                digitalWrite(RELE,LOW);
                digitalWrite(registerPin, LOW);
               }
                   if (Val<=Luce)  //Se il valore della fotoresistenza è inferiore di quello desiderato per la luce, si attiva il relè
                          {
                            digitalWrite(RELE1,HIGH);
                            delay(1000);
                            digitalWrite(RELE1,LOW);
                             Serial.println("Sera");
                          }
                          else
                          {
                            digitalWrite(RELE1,LOW);
                            Serial.println("Giorno");
                          }
                          delay(1000);
                                        }
                                        
                                        {

          //match input array to password array

            if (inputArray[0] == Guest[0] &&
            inputArray[1] == Guest[1] &&
            inputArray[2] == Guest[2] &&
            inputArray[3] == Guest[3])
               {
                digitalWrite(registerPin, HIGH); //turn on registerPin led
                digitalWrite(RELE,HIGH);
                delay(1000);
                digitalWrite(RELE,LOW);
                digitalWrite(registerPin, LOW);
               }
                if (Val<=Luce)  //Se il valore della fotoresistenza è inferiore di quello desiderato per la luce, si attiva il relè
                            {
                              digitalWrite(RELE1,HIGH);
                              delay(1000);
                              digitalWrite(RELE1,LOW);
                               Serial.println("Sera");
                            }
                            else
                            {
                              digitalWrite(RELE1,LOW);
                              Serial.println("Giorno");
                            }
                            delay(1000);
                                    }
                                    
                                    {

          //match input array to password array

            if (inputArray[0] == Lock[0] &&
            inputArray[1] == Lock[1] &&
            inputArray[2] == Lock[2] &&
            inputArray[3] == Lock[3])
               {
                
                Serial.println("State 2");
                state = 2;
                break;
               }
          }
          
          {
          i=0; //reset i
          }
        }
      }
    };
   }
  
 {
  
  while (state == 2)
 
  {
       
       
  char key = kpd.getKey();

  //if a key is presseds
    if(key)
      {

      //turn on ledPin
      digitalWrite(ledPin, HIGH);
      delay(100);
      digitalWrite(ledPin, LOW);
      delay(100);
      inputArray[i] = key; //store entry into array
      i++;
      Serial.println(key); //print keypad character entry to serial port

      if (key=='*')
        {
          Serial.println("Reset");
          i=0; //reset i
        }

      if (i == 4) //if 4 presses have been made
        {
          {

          //match input array to password array

            if (inputArray[0] == Main[0] &&
            inputArray[1] == Main[1] &&
            inputArray[2] == Main[2] &&
            inputArray[3] == Main[3])
               {
                digitalWrite(registerPin, HIGH); //turn on registerPin led
                delay(1000);
                digitalWrite(registerPin, LOW);
               }
          }
          
          {

          //match input array to password array

            if (inputArray[0] == Unlock[0] &&
            inputArray[1] == Unlock[1] &&
            inputArray[2] == Unlock[2] &&
            inputArray[3] == Unlock[3])
               {
                digitalWrite(RELE,HIGH);
                delay(1000);
                digitalWrite(RELE,LOW);
                 Serial.println("State 1"); 
                state = 1;
                break;
               }
          }
          
          {
          i=0; //reset i
          }
        }
      }
    };
  
 }
  
  
}

Appena ho letto il titolo ho pensato che avessi dimenticato la combinazione. :cold_sweat:

Per l'indentazione, nell'IDE, c'è la funzione --> Strumenti --> Formattazione automatica (ctrl + T)

Ma come mai il rele dedicato alle luci lo accendi e poi lo spegni dopo 1 secondo?

Ciao Paulus1969... il relè dedicato alle luci lo eccito per un secondo per dare l'impulso al relè passo-passo già esistente a casa mia che comanda le luci a 220volts.... lo uso come un pulsante di casa... mi serve solo per questo....

:open_mouth:

Bene, era per capire un po' meglio. Riassumendo... metti il codice, il cancello si apre quindi il primo relè si eccita correttamente. Il secondo relè invece non si eccita anche se metti una coperta nera sul sensore di luce. E' questa la situazione? Ma dove e come hai collegato la fotoresistenza? Leggo che definisci un intero FOTORES = 0 e poi fai un pinmode FOTORES come input e poi fai un analogread su questo pin... forse l'inghippo è qui?

E mi sa che l’inghippo sta proprio qua…non mi funziona neanche se copro la fotoresistenza…

però in monitor seriale i valori della luce aumentano e diminuiscono regolarmente…

io ho collegato la fotoresistenza seguendo questo schema…

per “const int FOTORES = 0;” io ho inteso il collegamento all’ ANALOG IN 0 della scheda Arduino…

Oops, ho dimenticato di dire che uso un Atmega 328 in stand alone programmato direttamente con Arduino uno… e che mi sono sincerato con il tester che tutti i collegamenti vanno bene…

=(