Mantener una luz encendida o apagada mediante clave [SOLUCIONADO]

Hola a todos. A ver si alguien me puede ayudar a despejar la duda que no doy con ella.

Necesito hacer que se pueda encender una luz (o relé, pero esto ya se añade sin problema) y tambien apagar. Pero lo necesito con clave (mediante keypad) para que nadie que no esté autorizado la encienda, y en caso de estar encendida quien no esté autorizado no la pueda apagar.

He conseguido que mediante clave se pueda encender la luz, pero no se como mantenerla encendida (y por supuesto una vez encendida tambien necesitaria poder apagarla, pero al no llegar a la primera parte no he podido intentar la segunda).

Os agradeceria mucho vuestra ayuda, ya que de aquí he estado aprendiendo muchisimo de lo que sé de todos estos temas, y por mucho que he mirado y mirado no doy con la tecla, que muy posiblemente hasta sea sencillo de hacer.

#include <Password.h> //Incluimos la libreria Password
#include <Keypad.h> //Incluimos la libreria Keypad
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd (0x3F, 16, 2);
 
Password password = Password("1205");  //Definimos el Password
int dlugosc = 4;                        //Largo del Password
 

int buzzer = 10; //Creamos las Variables de salida
int ledRed = 11; // Led codigo Error
int ledGreen = 12; // Led codigo correcto 
 
int ilosc; //Numero de Clicks
 
const byte ROWS = 4; // Cuatro Filas
const byte COLS = 4; // Cuatro Columnas

// Definimos el Keymap
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = { 9,8,7,6 };// Conectar los keypads ROW1, ROW2, ROW3 y ROW4 a esos Pines de Arduino.
byte colPins[COLS] = { 5,4,3,2, };// Conectar los keypads COL1, COL2, COL3 y COL4 a esos Pines de Arduino.
 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
 
void setup()
{
  Serial.begin(9600);
  keypad.addEventListener(keypadEvent);  
  pinMode(ledRed, OUTPUT);  
  pinMode(ledGreen, OUTPUT);
  pinMode(buzzer, OUTPUT);
 
  digitalWrite(ledRed, HIGH);
  digitalWrite(ledGreen, LOW);
 
  Wire.begin();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.backlight();        // Enciende la luz del LCD
  lcd.setCursor(0, 0);  
  lcd.print("   Bienvenido   ");
  lcd.setCursor(0,1);
  lcd.print(" INTRODUCE  PIN ");
}
 
void loop()
{
  keypad.getKey();
}
void keypadEvent(KeypadEvent eKey)
{
  switch (keypad.getState())
  {
    case PRESSED:
   
int i;
for( i = 1; i <= 1; i++ ) //Indica al Buzzer que suene 2 veces (=2) y los delay son el tiempo (todo se puede variar)
{
  digitalWrite(buzzer, HIGH);  
  delay(200);            
  digitalWrite(buzzer, LOW);  
  delay(100);      
}    
 
Serial.print("Pressed: ");
Serial.println(eKey);
 
switch (eKey)
{

default:
ilosc=ilosc+1;
password.append(eKey);
}
Serial.println(ilosc);
 
if(ilosc == 1)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("*_");
}
if(ilosc == 2)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("**_");
}
if(ilosc == 3)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("***_");
}
if(ilosc == 4)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("****_");
}
if(ilosc == 5)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("*****_");
}
if(ilosc == 6)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("******_");
}
if(ilosc == 7)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("*******_");
}
if(ilosc == 8)
{
lcd.clear();
lcd.setCursor(1,0);
lcd.print("   < PIN >");
lcd.setCursor(0,1);
lcd.print("********");
}
 
if(ilosc == dlugosc)
{
delay(250);
checkPassword();
ilosc = 0;
}
}
}
 
void checkPassword()
{
  if (password.evaluate())
  {
int i;
for( i = 1; i <= 3; i++ ) // Indica al buzzer que suene 3 veces (=3) con el delay siguiente
{
  digitalWrite(buzzer, HIGH);  
  delay(120);            
  digitalWrite(buzzer, LOW);  
  delay(70);      
}    
    ilosc = 0;
    password.reset();
    
    Serial.println("Correcto");    
 
    digitalWrite(ledRed, LOW);
    digitalWrite(ledGreen, HIGH);
 
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("**PIN CORRECTO**");
    lcd.setCursor(0,1);
    lcd.print("SISTEMA ACTIVADO");     
 
    delay(2000);
    digitalWrite(ledGreen, LOW);
    digitalWrite(ledRed, HIGH);    
       
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("   Bienvenido  ");
    lcd.setCursor(0,1);
    lcd.print(" INTRODUZCA PIN ");   
 
  }  
  else  
  {
int i;
for( i = 1; i <= 1; i++ )
{
  digitalWrite(buzzer, HIGH);  
  delay(300);            
  digitalWrite(buzzer, LOW);  
  delay(100);      
}  
    ilosc = 0;  
    password.reset();
 
    Serial.println("Error");
 
    digitalWrite(ledGreen, LOW);
    digitalWrite(ledRed, HIGH);    
             
    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print("  PIN ERRONEO  ");
    delay(5000);
   
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print(" PIN INCORRECTO ");
    lcd.setCursor(0,1);
    lcd.print("INTRODUCE EL PIN");    
  }
}

Hola buen dia,

Según trato de entender tu código, la función encargada de verificar que el password sea el correcto es checkPassword(). Dentro de esta función tienes un if (password.evaluate()). Esta parte del código es la que verifica que el password sea el correcto, por lo tanto es acá donde debes crear una variable para usarla como bandera la cual llamaremos estado. Por otra parte no tienes ningún pin de salida dedicado a manipular la bobina de un relé por ejemplo o un optoacoplador o lo que sea que uses para encender o apagar la luz.

Digamos que usas el pin x para encender o apagar la luz.

if (password.evaluate())
  {
   int estado; // declaro la variable estado para saber si la luz esta encendida o apagada.
   estado = digitalRead(x);    
       if (estado == HIGH)            //verifico si la luz esta encendida.....
           {
               digitalWrite(x, LOW);   //Acá apagamos la luz
           }
      if (estado == LOW)
           {
           digitalWrite(x, HIGH);   //Acá encendemos la luz
           }


// De aquí en adelante, agrega al código lo demas como por ejemplo LCD, etc........
  }

Es lo que se me ocurre. Por el tipo de arreglo que tienes no se si te quedan pines disponibles en tu arduino para manipular la salida que te mencioné para apagar y encender la luz.

Saludos

Un millon de gracias... LO HAS CLAVADO!!! :) .

Exactamente es eso lo que buscaba hacer y no lo conseguia. Un millon de gracias de verdad por tu ayuda, me has solucionado el mi problema a la primera.

Me alegra que se haya encontrado la solución, en esta comunidad estamos para servirte.... Feliz día. Por favor cambia el titulo agregándole [SOLUCIONADO]

usa una variable booleana para ello, ej

bool estadoLampara = false; // la defino como apagada

luego cuando decides o detectas que alguien introdujo bien la clave haces

estadoLampara = true; // con eso la lampara se va a encender usando otra secuencia de programa

Tu secuencia será esta

if (estadoLampara)
   digitalWrite(lamparaPin, HIGH); // la enciendo
else
  digitalWriete(lamparaPin, LOW); // la apaga

Muchisimas gracias a ambos, por fin lo he solucionado (tenia la mente saturada y no salia del enredo que me meti). Una vez mas muchisimas gracias.