Cerradura con código de seguridad

#include <Servo.h>
#include <Keypad.h>
#include <EEPROM.h>

Servo seguro;

char* secretCode = "1397";
int position = 0;


const byte rows = 4; 
const byte cols = 3; 
char keys[rows][cols] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[rows] = {7, 2, 3, 5}; 
byte colPins[cols] = {6, 8, 4}; 
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);

int redPin = 13;
int greenPin = 12;
int solenoidPin = 10;

void setup()                    
{
  seguro.attach(11);
 seguro.write(90); 
  
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(solenoidPin, OUTPUT);
  loadCode();
  flash();
  lock();
  Serial.begin(9600);
  while(!Serial);
  Serial.print("Code is: "); Serial.println(secretCode);
  Serial.println("Change code: cNNNN");
  Serial.println("Unloack: u");
  Serial.println("Lock: l");
}

void loop() 
{
  
  if (Serial.available())
  {
    char c = Serial.read();
    if (c == 'u')
    {
      unlock();
     
    }
    if (c == 'l')
    {
      lock();
    }
    if (c == '*')
    {
      getNewCode();
    }
  }
  char key = keypad.getKey();
  if (key == '#')
  {
    lock();
  }
  if (key == secretCode[position])
  {
    position ++;
  }
  else if (key != 0)
  {
    lock();
  }
  if (position == 4)
  {
    unlock();

  }
  delay(100);
}


void lock()
{
  position = 0;
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin, LOW);  
  digitalWrite(solenoidPin, LOW);
  seguro.write(90);
  Serial.println("LOCKED");
}

void unlock()
{
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, HIGH);  
  digitalWrite(solenoidPin, HIGH);
  seguro.write(10); 
  Serial.println("UN-LOCKED");
delay(8000);
  lock();
  
}


void getNewCode()
{
  for (int i = 0; i < 4; i++ )
  {
    char ch = Serial.read();
    secretCode[i] = ch;
  }
  saveCode();
  flash();flash();
  Serial.print("Code changed to: "); Serial.println(secretCode);
}

void loadCode()
{
  if (EEPROM.read(0) == 1)
  {
    secretCode[0] = EEPROM.read(1);
    secretCode[1] = EEPROM.read(2);
    secretCode[2] = EEPROM.read(3);
    secretCode[3] = EEPROM.read(4);
  }
}

void saveCode()
{
  EEPROM.write(1, secretCode[0]);
  EEPROM.write(2, secretCode[1]);
  EEPROM.write(3, secretCode[2]);
  EEPROM.write(4, secretCode[3]);
  EEPROM.write(0, 1);  
}

void flash()
{
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, HIGH);    
    delay(500);
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);    
}

Muy buenos días a todos, les agradezco de antemano por tomarse el tiempo de leer esto, el problema que no he podio resolver es el siguiente: no puedo cambiarle la contraseña a la cerradura, el código que les presento es de una cerradura con opción de cambiar la contraseña, el cambio de contraseña debe hacerse cuando esta desbloqueada la cerradura y se pulsa "asterisco" por consiguiente los siguientes 4 dígitos que se ingresen serán la nueva contraseña, pero al pulsar "asterisco" cuando esta desbloqueada la cerradura e introduzco 4 dígitos la contraseña no cambia, lo he intentado varias veces pero no consigo resolver este problema, quisiera que me ayudaran ya que no soy muy conocedor de la programación de arduino, solo conozco la programación básica, poseo un arduino Mega2560. Gracias por su tiempo.

¿Te aparece algún mensaje en la consola al intentar hacer el cambio?

gepd:
¿Te aparece algún mensaje en la consola al intentar hacer el cambio?

perdón por no poder contestarte a tiempo, no muestra cambio alguno, y es que al cambiar la contraseña hay una función flash que muestra que se cambiara la contraseña a continuacion

Mira he corregido un poco el código y parece funcionar, sin embargo creo que debes re plantearte como implementaste algunas funciones, como por ejemplo:

Puedes cambiar la contraseña tan solo con ingresar una letra o presionar una tecla, no hay una verificación del código anterior, esto quiere decir que cualquiera puede cambiarlo.

Cuando desbloqueas el sistema, utilizas un delay, por lo que la aplicación completa se queda congelada. Deberías utilizar millis() y en esos 8 segundos, dar la posibilidad de cambiar la contraseña. Aunque sería mejor hacerlo en una función aparte

Revisa las correcciones que he realizado e intenta implementar lo otro que te he comentado:

#include <Servo.h>
#include <EEPROM.h>

Servo seguro;

char* secretCode = "1397";
int position = 0;
bool new_code = false;
int index_new_code=0;

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

int redPin = 13;
int greenPin = 12;
int solenoidPin = 10;

void setup()                    
{
  seguro.attach(11);
  seguro.write(90); 
  
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(solenoidPin, OUTPUT);
  loadCode();
  flash();
  lock();
  Serial.begin(9600);
  while(!Serial);
  Serial.print("Code is: "); Serial.println(secretCode);
  Serial.println("Change code: *");
  Serial.println("Unlock: u");
  Serial.println("Lock: l");
}

void loop() 
{
  
  if (Serial.available())
  {
    char c = Serial.read();
    if (c == 'u' and !new_code) // unlock
    {
      unlock();
     
    }
    else if (c == 'l' and !new_code) // lock
    {
      lock();
    }
    else if (c == '*' and !new_code) // change code
    {
      Serial.println("Insert the new code");
      new_code = true;
    }

    if (c == secretCode[position] and !new_code)
    {
      position ++;
    }

    if (position == 4 and !new_code)
    {
      unlock();
      position = 0;
    }

    if(new_code){
      getNewCode(c);    
    }
    delay(100);
  }  
}


void lock()
{
  position = 0;
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin, LOW);  
  digitalWrite(solenoidPin, LOW);
  seguro.write(90);
  Serial.println("LOCKED");
}

void unlock()
{
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, HIGH);  
  digitalWrite(solenoidPin, HIGH);
  seguro.write(10); 
  Serial.println("UN-LOCKED");
  delay(8000);
  lock();
  
}


void getNewCode(char c)
{
   if(c != '*'){   
    secretCode[index_new_code] = c;
    index_new_code++;
    
    if(index_new_code == 4){
      index_new_code = 0;
      new_code = false;
      saveCode();
      flash();
      flash();
      Serial.print("Code changed to: ");
      Serial.println(secretCode);      
    }
   }
  
}

void loadCode()
{
  if (EEPROM.read(0) == 1)
  {
    secretCode[0] = EEPROM.read(1);
    secretCode[1] = EEPROM.read(2);
    secretCode[2] = EEPROM.read(3);
    secretCode[3] = EEPROM.read(4);
  }
}

void saveCode()
{
  EEPROM.write(1, secretCode[0]);
  EEPROM.write(2, secretCode[1]);
  EEPROM.write(3, secretCode[2]);
  EEPROM.write(4, secretCode[3]);
  EEPROM.write(0, 1);
}

void flash()
{
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin, HIGH);
  delay(500);
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, LOW);    
}

PD: como no tengo un keypad, he quitado todo lo relacionado con el, pero no debería ser problema para ti volver a colocarlo. De todas maneras te recomiendo hacer esto una vez que tengas todo lo demás funcionando.

hombre, muchas gracias!!!

lo voy a probar pero de todas formas muchas gracias por responderme y es que me tardo mucho respondiéndote, pero muchas gracias

porque se usa char* secretCode =

porque lleva * el char?????? char*

porque lo definió como un puntero a char.

Pudo definirlo asi

char secretCode[4] = "1397";

o

String secretCode = "1397"; // esta opcion mucho no me gusta.

pero en ambos casos requiere cambios en el código siguiente.

Cuidado, surbyte, con cosillas tan aparentemente inocentes, pues te pueden volver (por experiencia lo digo) totalmente loco:

char secretCode[4] = "1397";

¿Has caído ya? :wink:
.
.
.
.
.
.
.
"1397" son cinco caracteres. Podrían haber sido cuatro si lo hubieras definido así:
char secretCode[4]={'1', '3', '9', '7'};

Lo pensé pero dije, si me equivoco vendra Serafín y me corregirá. No hay problema.
Estaba tentado en poner

char secretCode[] = "1397";

pero luego puse eso y mi duda estaba en el final \0 que no tendría lugar.. dije será el compilador o cuando yo lo programe me dirá que no tiene lugar.
Algo que salta al compilar.

De todas formas mi error.