/**
Arduino Laser Trip Wire
Copyright (C) 2020, Uri Shaked.
Released under the MIT License.
*/
#include <LiquidCrystal_I2C.h>
//#define I2C_ADDR 0x27
//#define LCD_COLUMNS 16
//#define LCD_LINES 2
//LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <Wire.h>
#include <Keypad.h>
#include "SafeState.h"
#include "icons.h"
/* Mechanism definitions */
const int laserPin = 6;
const int greenLed = 7;
const int redLedPin = 11;
const int buzzerPin = 12;
const int ldrPin = A0;
/* Keypad setup */
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 3;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {8, 9, 10}; // Conecte aos pinos das colunas do teclado
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
/* SafeState stores the secret code in EEPROM */
SafeState safeState;
void lock() {
digitalWrite(laserPin, HIGH); // Ligue o laser
digitalWrite(redLedPin, HIGH); // Ligua o led vermelho
digitalWrite(greenLed, LOW); // Desliga o led verde
safeState.lock();
}
void unlock() {
digitalWrite(laserPin, LOW); // Desliga o laser
digitalWrite(redLedPin, LOW); // Desliga o led vermelho
digitalWrite(greenLed, HIGH); // Liga o led verde
}
void showStartupMessage() {
lcd.setCursor(4, 0);
lcd.print("Welcome!");
delay(1000);
lcd.setCursor(0, 1);
String message = "ArduinoSafe v1.0";
for (byte i = 0; i < message.length(); i++) {
lcd.print(message[i]);
delay(100);
}
delay(500);
}
String inputSecretCode() {
lcd.setCursor(5, 1);
lcd.print("[____]");
lcd.setCursor(6, 1);
String result = "";
while (result.length() < 4) {
char key = keypad.getKey();
if (key >= '0' && key <= '9') {
lcd.print('*');
result += key;
}
}
return result;
}
void showWaitScreen(int delayMillis) {
lcd.setCursor(2, 1);
lcd.print("[..........]");
lcd.setCursor(3, 1);
for (byte i = 0; i < 10; i++) {
delay(delayMillis);
lcd.print("=");
}
}
bool setNewCode() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nova Senha:");
String newCode = inputSecretCode();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Confirme a senha");
String confirmCode = inputSecretCode();
if (newCode.equals(confirmCode)) {
safeState.setCode(newCode);
return true;
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Senha nao confere");
lcd.setCursor(0, 1);
lcd.print("Laser Desativado!");
delay(2000);
return false;
}
}
void showUnlockMessage() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(ICON_UNLOCKED_CHAR);
lcd.setCursor(0, 1);
lcd.print("Acesso Liberado!");
lcd.setCursor(15, 0);
lcd.write(ICON_UNLOCKED_CHAR);
delay(3000);
}
void safeUnlockedLogic() {
lcd.clear();
lcd.setCursor(0, 1);
lcd.write(ICON_UNLOCKED_CHAR);
lcd.setCursor(0, 0);
lcd.print("# P/ Ligar");
lcd.setCursor(14, 1);
lcd.write(ICON_UNLOCKED_CHAR);
bool newCodeNeeded = true;
if (safeState.hasCode()) {
lcd.setCursor(0, 1);
lcd.print(" * = nova senha");
newCodeNeeded = false;
}
auto key = keypad.getKey();
while (key != '*' && key != '#') {
key = keypad.getKey();
}
bool readyToLock = true;
if (key == '*' || newCodeNeeded) {
readyToLock = setNewCode();
}
if (readyToLock) {
lcd.clear();
lcd.setCursor(5, 0);
lcd.write(ICON_UNLOCKED_CHAR);
lcd.print(" ");
lcd.write(ICON_RIGHT_ARROW);
lcd.print(" ");
lcd.write(ICON_LOCKED_CHAR);
safeState.lock();
lock();
showWaitScreen(100);
}
}
void safeLockedLogic() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(ICON_LOCKED_CHAR);
lcd.print("Laser Ativado! ");
lcd.write(ICON_LOCKED_CHAR);
String userCode = inputSecretCode();
bool unlockedSuccessfully = safeState.unlock(userCode);
showWaitScreen(200);
if (unlockedSuccessfully) {
showUnlockMessage();
unlock();
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Accesso Negado!");
showWaitScreen(1000);
}
}
void setup() {
lcd.init(); // Inicializa o LCD
lcd.backlight(); // Liga a luz de fundo
pinMode(laserPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(buzzerPin, OUTPUT);
digitalWrite(laserPin, LOW); // Laser começa desativado
digitalWrite(redLedPin, LOW); // Led vermelho começa desativado
digitalWrite(greenLed, LOW); // Led verde começa desativado
digitalWrite(buzzerPin, LOW); // Buzzer começa desativado
/* Make sure the physical lock is sync with the EEPROM state */
Serial.begin(115200);
if (safeState.locked()) {
lock();
} else {
unlock();
}
showStartupMessage();
}
void loop() {
int ldrValue = analogRead(ldrPin);
if (safeState.locked()) {
safeLockedLogic();
if (ldrValue < 200) {
digitalWrite(buzzerPin, HIGH); // Ligue o alarme (buzzer ou LED)
digitalWrite(redLedPin, HIGH);
digitalWrite(laserPin, HIGH);
}
} else {
safeUnlockedLogic();
}
}