A combinação fica armazenada na memória EEPROM e é possível utilizar uma senha entre 1 e 5 números, sendo cada um entre 01 e 99.
No vídeo, a trava é aberta com a combinação 38 - 21 - 54.
O projeto é funcional para ser utilizado em caixas, transformando-as em cofres, ou como controle de acesso, em portas de armários e de entrada.
Os números são exibidos em um LCD 16x2 conectado a um módulo PCF8574 de interface I2C, e para seleção dos números um potenciômetro de 10kΩ (recomendo um multi voltas).
A trava utilizada é com solenoide de 12v. Portanto, para montagem final, deve-se incluir um regulador de tensão para alimentar o circuito com 5v.
Para alterar a senha, com a trava aberta pressione o push button e selecione a nova combinação de números. Para confirmar, pressione o push button novamente. Os números selecionados serão exibidos no LCD.
Segue o esquema elétrico e o código fonte com comentários para melhor entendimento.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 | /*--------------------------------------------------------- Programa : TRAVA ANALÓGICA Autor : Fellipe Couto [ http://www.efeitonerd.com.br ] Data : 26/04/2020 ---------------------------------------------------------*/ /* INFORMAÇÕES: - Mover o potênciômetro até o valor "00" para iniciar - Girar até o número selecionado e inverter a rotação para selecionar - O sentido de giro deve ser sempre horário / anti horário (-->, <--, -->, <--) - Sendo assim, o 1º número deve ser maior que "01" - O 2º número deve, então, ser menor que o 1º, para que o sentido de giro seja invertido - O 3º número será maior que o 2º, invertendo novamente o sentido de giro - Exemplo de password aceito: 50 - 30 - 40 - 20 - 70 - Mover até o valor "00" para reiniciar a sequencia de números - Quando ainda não houver password em memória, o valor "50" é considerado para abrir a trava - Para alterar o password, enquando a trava estiver aberta, pressione o botão BTN_RESET - Selecione os números e pressione o botão novamente para confirmar - O novo password será exibido no display - Cada número do password estará entre "01" a "99" - É possível a utilização de até 5 números - http://www.efeitonerd.com.br */ /*--- BIBLIOTECAS ---*/ #include <LiquidCrystal_I2C.h> //LCD I2C [ https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library ] #include <EEPROM.h> //Memória EEPROM /*--- DEFINIÇÕES ---*/ #define POT_PIN A0 //Potenciômetro #define PADLOCK_PIN 2 //Trava #define LED_G_PIN 3 //Led verde #define LED_R_PIN 4 //Led vermelho #define BTN_RESET 5 //Botão reset de password /*--- VARIÁVEIS ---*/ LiquidCrystal_I2C lcd(0x3F, 16, 2); //LCD 16x2 no endereço 0x3F int pwd[5] = {0, 0, 0, 0, 0}; //Password que está na EEPROM. Primeiro password = 50 int pwdTyped[5] = {0, 0, 0, 0, 0}; //Password selecionado pelo usuário int pwdOld = 0; //Controle de numeros selecionados para o password bool pwdUp = true; //Controle se numero selecionado deve ser maior ou menor que o anterior bool pwdReset = false; //Controle para reset de password bool opened = true; //Controle se a trava foi aberta /*--- SETUP ---*/ void setup() { //Configuração dos pinos pinMode(PADLOCK_PIN, OUTPUT); pinMode(LED_G_PIN, OUTPUT); pinMode(LED_R_PIN, OUTPUT); pinMode(BTN_RESET, INPUT_PULLUP); //Inicializa o lcd lcd.begin(); //Leitura inicial da EEPROM ReadPasswordMemory(); //Trava fechada Padlock(false); } /*--- LOOP PRINCIPAL ---*/ void loop() { VerifyPassword(); delay(100); } /*--- RETORNA O PASSWORD SALVO NA EEPROM ---*/ void ReadPasswordMemory() { for (int i = 0; i < 5; i++) { if (EEPROM.read(i) > 0) { pwd[i] = EEPROM.read(i); } else if (i == 0) { pwd[i] = 50; } } } /*--- RETORNA A LEITURA MÉDIA DO VALOR DO POTENCIÔMETRO ---*/ int AvgReadPot() { int qtd = 300; int n = 0; for (int i = 0; i < qtd; i++) { n += map(analogRead(POT_PIN), 0, 1023, 0, 101); } int ret = n / qtd; if (ret > 99) ret = 99; return ret; } /*--- ABRE/FECHA A TRAVA ---*/ void Padlock(bool open) { if (open) { digitalWrite(LED_G_PIN, HIGH); digitalWrite(LED_R_PIN, LOW); digitalWrite(PADLOCK_PIN, HIGH); } else { digitalWrite(LED_G_PIN, LOW); digitalWrite(LED_R_PIN, HIGH); digitalWrite(PADLOCK_PIN, LOW); } } /*--- LIMPA A VARIÁVEL COM NUMEROS SELECIONADOS ---*/ void ClearPwdTyped() { for (int i = 0; i < 5; i++) { pwdTyped[i] = 0; } } /*--- SELECIONA OS NÚMEROS / VERIFICA SE O PASSWORD É VÁLIDO / ALTERA PASSWORD ---*/ void VerifyPassword() { //Leitura do potenciômetro para a variável int pwdNum = AvgReadPot(); //Exibe a mensagem no lcd com o valor do potenciômetro if (pwdReset) { lcd.setCursor(0, 0); lcd.print("NOVA SENHA"); } else { lcd.setCursor(0, 0); lcd.print("TRAVA ANALOGICA"); } lcd.setCursor(0, 1); lcd.print(">> "); if (opened) { lcd.print("__"); } else { if (pwdNum < 10) lcd.print("0"); lcd.print(pwdNum); } //Se estiver em modo de alteração de password if (pwdReset) { digitalWrite(LED_G_PIN, HIGH); //Se botão de reset de password for pressionado if (digitalRead(BTN_RESET) == LOW) { pwdReset = false; bool pwdNew = false; //Verificação se houve alteração do passwaord for (int i = 0; i < 5; i++) { if (pwdTyped[i] != 0) { pwdNew = true; } } if (pwdNew) { for (int i = 0; i < 5; i++) { EEPROM.write(i, pwdTyped[i]); pwd[i] = pwdTyped[i]; } lcd.clear(); lcd.setCursor(2, 0); lcd.print("SENHA SALVA!"); lcd.setCursor(1, 1); for (int i = 0; i < 5; i++) { if (pwd[i] != 0) { lcd.print(pwd[i]); lcd.print(" "); } } delay(10000); ClearPwdTyped(); lcd.clear(); digitalWrite(LED_G_PIN, LOW); } } } //Verificação de número selecionado if (pwdNum == 0) { pwdOld = 0; opened = false; ClearPwdTyped(); } else { //Somente verifica os numeros após ter zerado o potenciômentro if (!opened) { //Verifica se houve seleção de número bool selectedNum = false; if (pwdUp) { if (pwdNum < pwdOld) { pwdUp = false; selectedNum = true; } } else { if (pwdNum > pwdOld) { pwdUp = true; selectedNum = true; } } if (selectedNum) { for (int i = 0; i < 5; i++) { if (pwdTyped[i] == 0) { pwdTyped[i] = pwdOld; if (pwdOld > 0) { digitalWrite(LED_R_PIN, LOW); delay(150); digitalWrite(LED_R_PIN, HIGH); } break; } } } //Verifica se o password está correto int count = 0; for (int i = 0; i < 5; i++) { if (pwdTyped[i] == pwd[i]) { count++; } } if (count == 5) { Padlock(true); opened = true; lcd.setCursor(3, 1); lcd.print("ABERTO"); //Loop para delay mantendo a trava aberta e verificando o pressionamento do botão reset de password for (int i = 0; i < 40; i++) { while (digitalRead(BTN_RESET) == LOW) { pwdReset = true; ClearPwdTyped(); } if (pwdReset) break; delay(100); } Padlock(false); lcd.clear(); ClearPwdTyped(); } pwdOld = pwdNum; } } } |
Nenhum comentário:
Postar um comentário