Keypad azzeramento

SAlve, Il codice è stato creato che ogni qual volta che metto il pin esatto si attiva il relè, premento il tasto “" il relè si disattiva. E fino a qua ci siamo, però se provo a mettere di nuovo il pin al terzo carattere mi da errore perchè conta il carattere "”. E’ possibile azzerare il codice dopo aver premuto “*”?

Codice:

#include <Keypad.h>

// keypad configuration
const byte rows = 4;
const byte cols = 4;
char keys[rows][cols] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[rows] = {2, 3, 4, 5};
byte colPins[cols] = {6, 7, 8, 9};

char psw[5] = "1234";// PASSWORD
char inputCode[5];// CODICE INSERIMENTO
int rele = 10;// USCITA PER ATTIVARE IL RELE'
int LED1 = 11;
int LED2 = 12;
int inputCode_idx;//CONTATORE PER DODICE INSERITO

String password = "0000";

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);

void setup() {
  Serial.begin(9600);
  keypad.setDebounceTime(150);
  pinMode(rele, OUTPUT);
  digitalWrite(rele, HIGH);

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);

  inputCode_idx = 0;// RESETTA IL CONTATORE DEL CODICE
}


void loop() {
  char key = keypad.getKey();
  //Serial.println(psw[1]);

  if (key != NO_KEY) {
    if (key == '#') {
      inputCode_idx = 0;// RESETTA IL CODICE
      Serial.println("CODICE RESETTATO");
      delay(1000);
    } else {
      inputCode[inputCode_idx++] = key;
      Serial.print(key);
      if (inputCode_idx == 4) {
        inputCode[inputCode_idx] = '\0';
        inputCode_idx = 0;
        Serial.println();
        Serial.println(inputCode);
        if (strcmp(inputCode, psw) != 0) {
          digitalWrite(LED1, HIGH);
          delay(1000);
          digitalWrite(LED1, LOW);
        }
      }
    }
  }
  if (strcmp(inputCode, psw) == 0) {
    digitalWrite(rele, LOW);
    Serial.println("APERTO");
    digitalWrite(LED2, HIGH);

  }

  if  (key == '*') {
    digitalWrite(rele, HIGH);
    digitalWrite(LED2, LOW);


    delay(1000);
  }
}

ciao Gunstr94,

trasforma il primo else, quello riferito all' if(key=='#') in un else if (key!='#' && key!='*')

Fatto, si spegne per un secondo e si riaccende il relè e il led

#include <Keypad.h>

// keypad configuration
const byte rows = 4;
const byte cols = 4;
char keys[rows][cols] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[rows] = {2, 3, 4, 5};
byte colPins[cols] = {6, 7, 8, 9};

char psw[5] = "1234";// PASSWORD
char inputCode[5];// CODICE INSERIMENTO
int rele = 10;// USCITA PER ATTIVARE IL RELE'
int LED1 = 11;
int LED2 = 12;
int inputCode_idx;//CONTATORE PER DODICE INSERITO

String password = "0000";

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);

void setup() {
  Serial.begin(9600);
  keypad.setDebounceTime(150);
  pinMode(rele, OUTPUT);
  digitalWrite(rele, HIGH);

  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);

  inputCode_idx = 0;// RESETTA IL CONTATORE DEL CODICE
}


void loop() {
  char key = keypad.getKey();
  //Serial.println(psw[1]);

  if (key != NO_KEY) {
    if (key == '#') {
      inputCode_idx = 0;// RESETTA IL CODICE
      Serial.println("CODICE RESETTATO");
      delay(1000);
    } else  if (key != "#" && key!='*') {
      inputCode[inputCode_idx++] = key;
      Serial.print(key);
      if (inputCode_idx == 4) {
        inputCode[inputCode_idx] = '\0';
        inputCode_idx = 0;
        Serial.println();
        Serial.println(inputCode);
        if (strcmp(inputCode, psw) != 0) {
          digitalWrite(LED1, HIGH);
          delay(1000);
          digitalWrite(LED1, LOW);
          }
        
      }
    }
  }
  if (strcmp(inputCode, psw) == 0) {
    digitalWrite(rele, LOW);
    Serial.println("APERTO");
    digitalWrite(LED2, HIGH);

  }

  if  (key == '*') {
    digitalWrite(rele, HIGH);
    digitalWrite(LED2, LOW);


    delay(1000);
  }
}

Aggiungi:

inputCode_idx = 0;

Nell'if dell'*.

Però accidenti, il programma non è molto complicato, dovresti almeno provare a capire come funziona...

Già aggiunto, si spegne per pochi secondi e poi si riaccende

secondo me il problema ce l'hai con questo if:

  if (strcmp(inputCode, psw) == 0) {
    digitalWrite(rele, LOW);
    Serial.println("APERTO");
    digitalWrite(LED2, HIGH);

  }

essendo svincolato da altri controlli verrà sempre controllato dal ciclo loop()...

E' un relè a logica inversa, ed il programma è stato fatto quando il codice è uguale a 0.

cosa succede se mantieni premuto '*'?

Si disattiva per un secondo il relè e si riattiva

Il codice mi funziona, metto la password e si attiva il relè, premo * e si disattiva. L'unico problema è che poi inserendo di nuovo la password il carattere * me lo memorizza; quindi inserendo altri 3 caratteri mi da password sbagliata.

il codice che hai incluso al post #2 è quello che stai utilizzando?
qui c’è un errore:

} else  if (key != "#" && key!='*') {

key è char quindi apici singole e non doppie su #

se scritto giusto questo if() fa si che tutti i caratteri tranne ‘#’ ed ‘*’ vengano salvati nella string…altri posti dove salvi key non ne vedo…

quello che invece viene fatto ad ogni ciclo loop() è:

  if (strcmp(inputCode, psw) == 0) {
    digitalWrite(rele, LOW);
    Serial.println("APERTO");
    digitalWrite(LED2, HIGH);

  }

  if  (key == '*') {
    digitalWrite(rele, HIGH);
    digitalWrite(LED2, LOW);


    delay(1000);
  }