Всем привет! Решил собрать часы-игрушку. С часами и их установкой вопросов нет, а вот с игрушкой… Вообщем не могу сделать так, что бы устанавливать свой пароль с помощью библиотеки. Получается только задать заранее прописанный, и еще не могу найти как сделать что бы пароль отображался при вводе. Вот мой код
#include <SoftwareSerial.h> // Библиотека для для обмена данными
#include <DFPlayer_Mini_Mp3.h> // Подключаем библиотеку для DFPlayer Mini
#include <iarduino_RTC.h> // Подключаем библиотеку часов реального времени
#include <Wire.h> // Подключаем библиотеку обмена данными по i2c
#include <LiquidCrystal_I2C.h> // Подключаем библиотеку дисплея
#include <Keypad.h> // Подключаем библиотеку клавиатуры
#include <Password.h> // Библиотека управления паролями
LiquidCrystal_I2C lcd(0x27,16,2); // Дисплей 16 символов и 2 строки
iarduino_RTC watch(RTC_DS3231); // Часы DS3231 для работы с библиотекой
#define DS3231_ADDRESS 0x68 // Адрес шины данных часов реального времени
#define PIN_PHOTO_SENSOR A0 // Автояркость дисплея
#define PIN_LED 9 // Подсветка дисплея
int switchPin = 10; // Пин тумблера
const int buzzer = 11; // Пищалка кнопок
int relay = 12; // Реле бомбы
#define PIN_BLINK 13 // Мигание бомбы
int previousState = LOW; // Состояние тумблера
int currentState = LOW; // Состояние тумблера
int number = 0; // Переменная для хранения двухзначного числа
const byte ROWS = 4; // Клавиатура 4 строки
const byte COLS = 3; // Клавиатура 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 ); // Какая то хрень для клавиатуры
byte cel[8] = {0b00111,0b00101,0b00111,0b00000,0b00000,0b00000,0b00000,0b00000}; // Значек градуса цельсия
uint8_t bell[8] = {0x4, 0xe, 0xe, 0xe, 0x1f, 0x0, 0x4}; // Колокольчик
int flagRead=0; //переменные для блинка
int regim=1; // Режим часов
int seconds;
int Hours;
int minutes;
int day;
int month;
int year;
int weekday;
int bombtimeH; //таймер бомбы часы
int bombtimeM; //минуты
int bombtimeS; //секунды
String newPassword; //hold the new password
char passchars[10]; //charaters of newPassword
Password password1 = Password("7355608"); // Если введен этот пароль, то таймер на 40сек. этот пароль не поменять
Password password2 = Password("1234"); // Этот пароль хочу задавать самостоятельно каждый раз при включении рержима
Password password3 = Password("0000"); // А этот просто сделать каким ни будь секретным, типа пасхалки, а может вообще уберу
byte maxPasswordLength = 10; // Максимальная длинна пароля
byte currentPasswordLength = 0; // Текущий набранный пароль
void setup() {
Serial.begin(9600); // Монитор порта для отладки
pinMode(PIN_LED, OUTPUT); // Светодиод подсветки дисплея
pinMode(PIN_BLINK, OUTPUT); // Светодиод мигания бомбы
pinMode(buzzer, OUTPUT); // Пищалка кнопок
pinMode(switchPin, INPUT_PULLUP); // Устанавливаем пин тумблера как вход с подтяжкой к питанию
pinMode(relay, OUTPUT); // Реле бомбы как выход
Wire.begin();
watch.begin();
lcd.init();
//lcd.begin();
//lcd.clear();
lcd.backlight();
lcd.createChar(0, cel); // Цельсия
lcd.createChar(1, bell); // Колокольчик
mp3_set_serial(Serial); // включаем передачу данных с DFPlayer mini mp3
mp3_set_volume(25); // устанавливаем громкость от 0 до 30
mp3_set_EQ(0); // устанавливаем эквалайзер от 0 до 5
}
void Regim_Clock(){
lcd.setCursor(0,0);
lcd.print(watch.gettime("H:i:s"));
Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(0x11);
Wire.endTransmission();
Wire.requestFrom(DS3231_ADDRESS,2);
byte msb = Wire.read();
byte lsb = Wire.read();
byte temperature = ((msb << 8)|lsb)/256.0;
lcd.setCursor(12,0);
lcd.print(temperature);
lcd.write(byte(0));
lcd.print("C");
lcd.setCursor(0,1);
lcd.print(watch.gettime("d-m-Y D"));
currentState = digitalRead(switchPin); //Проверяем состояние тумблера, если он выключен, и будет включен
if (currentState != previousState && currentState == LOW){ //переходим в режим бомбы
Regim_Bomb();}
previousState = currentState;
char key = keypad.getKey();
if(key){tone(buzzer, 750, 100);}
if(key == '*'){;Set_Time();}
if (key == '1'){mp3_play(1);}
if (key == '2'){mp3_play(2);}
}
//Установка времени
void Set_Time(){
watch.gettime();
Hours=(watch.gettime(Hours));
minutes=(watch.gettime(minutes));
day=(watch.gettime(day));
month=(watch.gettime(month));
year=(watch.gettime(year));
weekday=(watch.gettime(weekday));
regim=2;
while(regim==2){ //установка часов
char key = keypad.getKey();
if (key){tone(buzzer, 750, 100);
lcd.setCursor(0, 0);
lcd.print(watch.gettime("H:i:s"));
lcd.setCursor(0, 1);
lcd.print(watch.gettime("d-m-Y D"));
watch.blinktime(3);
if (key >= '0' && key <= '9'){ // проверяем, введено ли однозначное или двухзначное число
Hours = Hours * 10 + (key - '0');
if (Hours >= 24){Hours=0;}}}
watch.settime(-1, -1, Hours);
if (key == '*') {regim++;}
if (key == '#') {watch.blinktime(0);regim=1;lcd.clear();}}
while(regim==3){ //установка минут
char key = keypad.getKey();
if (key){tone(buzzer, 750, 100);
lcd.setCursor(0, 0);
lcd.print(watch.gettime("H:i:s"));
lcd.setCursor(0, 1);
lcd.print(watch.gettime("d-m-Y D"));
watch.blinktime(2);
if (key >= '0' && key <= '9'){ // проверяем, введено ли однозначное или двухзначное число
minutes = minutes * 10 + (key - '0');
if (minutes >= 60){minutes=0;}}}
watch.settime(0, minutes);
if (key == '*') {regim++;}
if (key == '#') {watch.blinktime(0);regim=1;lcd.clear();}}
while(regim==4){ //установка числа
char key = keypad.getKey();
if (key){tone(buzzer, 750, 100);
lcd.setCursor(0, 0);
lcd.print(watch.gettime("H:i:s"));
lcd.setCursor(0, 1);
lcd.print(watch.gettime("d-m-Y D"));
watch.blinktime(4);
if (key >= '0' && key <= '9'){ // проверяем, введено ли однозначное или двухзначное число
day = day * 10 + (key - '0');
if (day>32 || day==32){day=0;}}} //if(day<0){day=31;}}}
watch.settime(-1, -1, -1, day);
if (key == '*') {regim++;}
if (key == '#') {watch.blinktime(0);regim=1;lcd.clear();}}
while(regim==5){ //установка месяца
char key = keypad.getKey();
if (key){tone(buzzer, 750, 100);
lcd.setCursor(0, 0);
lcd.print(watch.gettime("H:i:s"));
lcd.setCursor(0, 1);
lcd.print(watch.gettime("d-m-Y D"));
watch.blinktime(5);
if (key >= '0' && key <= '9'){ // проверяем, введено ли однозначное или двухзначное число
month = month * 10 + (key - '0');
if (month>13 || month ==13){month=0;}}} //if(month<0){month=12;}}}
watch.settime(-1, -1, -1, -1, month);
if (key == '*') {regim++;}
if (key == '#') {watch.blinktime(0);regim=1;lcd.clear();}}
while(regim==6){ //установка года
char key = keypad.getKey();
if (key){tone(buzzer, 750, 100);
lcd.setCursor(0, 0);
lcd.print(watch.gettime("H:i:s"));
lcd.setCursor(0, 1);
lcd.print(watch.gettime("d-m-Y D"));
watch.blinktime(6);
if (key >= '0' && key <= '9'){ // проверяем, введено ли однозначное или двухзначное число
year = year * 10 + (key - '0');
if (year>100 || year ==100){year=0;}}} //if(year<0){year=99;}}}
watch.settime(-1, -1, -1, -1, -1, year);
if (key == '*') {regim++;}
if (key == '#') {watch.blinktime(0);regim=1;lcd.clear();}}
while(regim==7){ //установка дня недели
char key = keypad.getKey();
if (key){tone(buzzer, 750, 100);
lcd.setCursor(0, 0);
lcd.print(watch.gettime("H:i:s"));
lcd.setCursor(0, 1);
lcd.print(watch.gettime("d-m-Y D"));
watch.blinktime(7);
weekday = (key - '0');
if(weekday == 7){weekday = 0;}}
watch.settime(-1, -1, -1, -1, -1, -1, weekday);
if (key == '*') {watch.blinktime(0);Set_Time();lcd.clear();}
if (key == '#') {watch.blinktime(0);regim=1;lcd.clear();}}}
//Режим установки бомбы
void Regim_Bomb(){
regim=8;
lcd.clear();
while(regim==8){ //установка пароля бомбы
auto_light();
char key = keypad.getKey();
if(key){tone(buzzer, 750, 100);}
lcd.setCursor(0, 0);
lcd.print(("Set Pass"));
lcd.setCursor(0, 1);
lcd.print(("Press 1 2 3"));
if (key != NO_KEY) {
switch (key) {
//case 'A': break;
//case 'B': break;
//case 'C': break;
case '1': changePassword1(); break;
case '2': changePassword2(); break;
case '3': changePassword3(); break;
case '#': lcd.clear();regim++; break;
case '*': resetPassword(); break;
//default: processNumberKey(key);
}}
//if (key=='#'){watch.blinktime(0);regim++;lcd.clear();}
}
while(regim==9){ //установка таймера часов бомбы
auto_light();
char key = keypad.getKey();
if(key){tone(buzzer, 750, 100);}
blink_H(flagRead * 250);
if (key){
if (key >= '0' && key <= '9'){ // проверяем, введено ли однозначное или двухзначное число
bombtimeH = bombtimeH * 10 + (key - '0');
if (bombtimeH>23){bombtimeH=0;}if(bombtimeH<0){bombtimeH=23;}}
else if (key == '*'){ // введен символ окончания числа
if (bombtimeH >= 0){ // проверяем, что число было введено
}}}
if (key=='#'){lcd.clear();regim++;}}
while(regim==10){ //установка таймера минут бомбы
auto_light();
char key = keypad.getKey();
if(key){tone(buzzer, 750, 100);}
blink_M(flagRead * 250);
if (key){
if (key >= '0' && key <= '9'){ // проверяем, введено ли однозначное или двухзначное число
bombtimeM = bombtimeM * 10 + (key - '0'); // добавляем введенную цифру к числу
if (bombtimeM>59){bombtimeM=0;}if(bombtimeM<0){bombtimeM=59;}}
else if (key == '*'){ // введен символ окончания числа
if (bombtimeM >= 0){ // проверяем, что число было введено
}}}
if (key=='#'){lcd.clear();regim++;}}
while(regim==11){ //установка таймера секунд бомбы
auto_light();
char key = keypad.getKey();
if(key){tone(buzzer, 750, 100);}
blink_S(flagRead * 250);
if (key){
if (key >= '0' && key <= '9'){ // проверяем, введено ли однозначное или двухзначное число
bombtimeS = bombtimeS * 10 + (key - '0'); // добавляем введенную цифру к числу
if (bombtimeS>59){bombtimeS=0;}if(bombtimeS<0){bombtimeS=59;}}
else if (key == '*'){ // введен символ окончания числа
if (bombtimeS >= 1){ // проверяем, что число было введено
}}}
if (key=='#'){lcd.clear();regim++;}}
while(regim==12){ //тиканье бомбы (таймер)
auto_light();
char key = keypad.getKey();
if(key){tone(buzzer, 750, 100);}
if (key != NO_KEY) {
//delay(60);
switch (key) {
//case 'A': break;
//case 'B': break;
//case 'C': break;
//case '1': changePassword1(); break;
//case '2': changePassword2(); break;
//case '3': changePassword3(); break;
case '#': checkPassword(); break;
case '*': resetPassword(); break;
default: processNumberKey(key);
}}
bomb_tik(flagRead * 500);
if (bombtimeH>23){bombtimeH=0;}if(bombtimeH<0){bombtimeH=23;}
if (bombtimeM>59){bombtimeM=0;bombtimeH--;}if(bombtimeM<0){bombtimeM=59;bombtimeH--;}
if (bombtimeS>59){bombtimeS=0;bombtimeM--;}if(bombtimeS<0){bombtimeS=59;bombtimeM--;}
lcd.setCursor(0,0);
lcd.print(currentPasswordLength);
if (bombtimeH<10){lcd.setCursor(4,1);
lcd.print("0");lcd.print(bombtimeH);}
else{lcd.setCursor(4,1);lcd.print(bombtimeH);}
lcd.setCursor(6,1);lcd.print(":");
if(bombtimeM<10){lcd.setCursor(7,1);
lcd.print("0");lcd.print(bombtimeM);}
else{lcd.setCursor(7,1);lcd.print(bombtimeM);}
lcd.setCursor(9,1);lcd.print(":");
if(bombtimeS<10){lcd.setCursor(10,1);
lcd.print("0");lcd.print(bombtimeS);}
else{lcd.setCursor(10,1);lcd.print(bombtimeS);}
if(bombtimeH==0&bombtimeM==0&bombtimeS==0){ //взрыв бомбы условие
mp3_play(4);mp3_play(1);digitalWrite(relay, HIGH);delay(1000);digitalWrite(relay, LOW);regim=1;lcd.clear();}
}}
//Тиканье бомбы (убавление секунд, мигание светодиода)
void bomb_tik(unsigned long interval){ //мигаем светодиодом бомбы
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
bombtimeS--;
digitalWrite(PIN_BLINK, LOW);
flagRead = 1;}
else{
digitalWrite(PIN_BLINK, HIGH);mp3_play(5);
flagRead = 1;}}}
void changePassword1() { // Устанавливается первыый пароль
newPassword = "7355608";
newPassword.toCharArray(passchars, newPassword.length() + 1); //convert string to char array
password1.set(passchars);
resetPassword();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(("SETUP"));
lcd.setCursor(0,1);
lcd.print(newPassword);
delay(1000);
lcd.clear();
}
void changePassword2() { // Устанавливается второй пароль
newPassword = "1234";
newPassword.toCharArray(passchars, newPassword.length() + 1); //convert string to char array
password2.set(passchars);
resetPassword();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(("SETUP"));
lcd.setCursor(0,1);
lcd.print(newPassword);
delay(1000);
lcd.clear();
}
void changePassword3() { // Устанавливается третии пароль
newPassword = "0000";
newPassword.toCharArray(passchars, newPassword.length() + 1); //convert string to char array
password3.set(passchars);
resetPassword();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(("SETUP"));
lcd.setCursor(0,1);
lcd.print(newPassword);
delay(1000);
lcd.clear();
}
void resetPassword() { // Сбрасывает набранный ввод пароля
password1.reset();
password2.reset();
password3.reset();
currentPasswordLength = 0;
}
void checkPassword(){ // Проверка паролей на совпадение
if (password1.evaluate()){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bomb has ben");
lcd.setCursor(0,1);
lcd.print(" defuse...");
delay(3000);
digitalWrite(PIN_BLINK, LOW);lcd.clear();regim=1;
}
else if (password2.evaluate()){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bomb has ben");
lcd.setCursor(0,1);
lcd.print(" defuse...");
delay(3000);
digitalWrite(PIN_BLINK, LOW);lcd.clear();regim=1;
}
else if (password3.evaluate()){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bomb has ben");
lcd.setCursor(0,1);
lcd.print(" defuse...");
delay(3000);
digitalWrite(PIN_BLINK, LOW);lcd.clear();regim=1;
}
else{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Wrong");
delay(1000);
lcd.clear();
}
}
void processNumberKey(char key) { // Ввод пароля
currentPasswordLength++;
password1.append(key); // Добавляет символ к текущему вводу пароля
password2.append(key);
password3.append(key);
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
}
}
void blink_H(unsigned long interval){ //мигаем переменной часов таймера бомбы
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Set Time");
if(bombtimeH<10){
lcd.setCursor(4, 1);
lcd.print("0");
lcd.setCursor(5, 1);}
else{lcd.setCursor(4, 1);}
lcd.print(bombtimeH); //показать врем
lcd.print(":");
if(bombtimeM<10){
lcd.setCursor(7, 1);
lcd.print("0");
lcd.setCursor(8, 1);}
else{lcd.setCursor(7, 1);}
lcd.print(bombtimeM);
lcd.print(":");
if(bombtimeS<10){
lcd.setCursor(10, 1);
lcd.print("0");
lcd.setCursor(11, 1);}
else{lcd.setCursor(10, 1);}
lcd.print(bombtimeS);
flagRead = 1;}
else{
lcd.setCursor(4, 1);
lcd.print(" ");
flagRead = 1;}}}
void blink_M(unsigned long interval){ //мигаем переменной минут таймера бомбы
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Set Time");
if(bombtimeH<10){
lcd.setCursor(4, 1);
lcd.print("0");
lcd.setCursor(5, 1);}
else{lcd.setCursor(4, 1);}
lcd.print(bombtimeH); //показать врем
lcd.print(":");
if(bombtimeM<10){
lcd.setCursor(7, 1);
lcd.print("0");
lcd.setCursor(8, 1);}
else{lcd.setCursor(7, 1);}
lcd.print(bombtimeM);
lcd.print(":");
if(bombtimeS<10){
lcd.setCursor(10, 1);
lcd.print("0");
lcd.setCursor(11, 1);}
else{lcd.setCursor(10, 1);}
lcd.print(bombtimeS);
flagRead = 1;}
else{
lcd.setCursor(7, 1);
lcd.print(" ");
flagRead = 1;}}}
void blink_S(unsigned long interval){ //мигаем переменной секунд таймера бомбы
static unsigned long prevTime=0;
if(millis() - prevTime > interval){
static boolean flag = 0;
prevTime = millis();
flag =! flag;
if(flag){
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Set Time");
if(bombtimeH<10){
lcd.setCursor(4, 1);
lcd.print("0");
lcd.setCursor(5, 1);}
else{lcd.setCursor(4, 1);}
lcd.print(bombtimeH); //показать врем
lcd.print(":");
if(bombtimeM<10){
lcd.setCursor(7, 1);
lcd.print("0");
lcd.setCursor(8, 1);}
else{lcd.setCursor(7, 1);}
lcd.print(bombtimeM);
lcd.print(":");
if(bombtimeS<10){
lcd.setCursor(10, 1);
lcd.print("0");
lcd.setCursor(11, 1);}
else{lcd.setCursor(10, 1);}
lcd.print(bombtimeS);
flagRead = 1;}
else{
lcd.setCursor(10, 1);
lcd.print(" ");
flagRead = 1;}}}
void alarm_work(){
}
//Автоматическая регулировка яркости
void auto_light(){
int val = analogRead(PIN_PHOTO_SENSOR);
int ledPower = map(val, 0, 1023, 1, 255);
analogWrite(PIN_LED, ledPower); // Меняем яркость
//Serial.println(val);
}
void loop() {
auto_light();
if(regim = 1){Regim_Clock();}
}
Помогите пожалуйста, я не программист не разу, но с железками люблю поковыряться. Знаю что программисты добрые и не пройдут мимо нуждающегося))