Замок по секретному стуку.
- Войдите на сайт для отправки комментариев
Пнд, 06/05/2019 - 20:45
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Arduino UNO // //////////////////////// //ПОВТОРИТЕЛЬ СТУКОВ - ЗАМОК // #define V1 7 //вывод датчика int P=2000;//переменная минимальной длительности между сериями стуков-ударов int p=50;//переменная длительности задержки между проверками уровня сигнала датчика int dP=100;//величина погрешности совпадения длительностей в массивах (СТЕПЕНЬ ПОГРЕШНОСТИ В ВЫСТУКИВАНИИ КОМБИНАЦИИ) long Y=0;//переменная для фиксации моментов времени ударов long Y1=0;//переменная для фиксации времени int i=0;//счётчик int j=0;//счётчик int k=0;//счётчик int g=50;//число элементов в массивах byte flag_A=0;//флаг состояний фиксации длительности между последовательными ударами boolean flag_B=0;//флаг состояний исполнения и запоминания стуков boolean flag_C=0;//флаг выбора состояний заполнения массивов int tabl[50]={};// массив длительностей между ударами (ХРАНЕНИЕ ТЕКУЩЕЙ КОМБИНАЦИИ СТУКОВ) int tabl_CL[50]={};// массив ключевых длительностей между ударами (ХРАНЕНИЕ "СЕКРЕТНОГО СТУКА") ////////////////////////////////////////// void setup() { pinMode(V1, INPUT);//вход сигнала с модуля микрофона pinMode(12, OUTPUT);//вывод для пьезоизлучателя digitalWrite(12,LOW); pinMode(13, OUTPUT);//вывод для исполнительного устройства замка digitalWrite(13,LOW); for(j=0;j<g;j++){tabl[j]=0;tabl_CL[j]=0;}//присвоение начальных значений элементам массивов } /////////////////////////////////////////// void loop() { if(flag_B==1)//условие исполнения записанных стуков { for(j=0;j<g;j++) { if(flag_C==1&&tabl[j]!=0){tone(12,1000,p);delay(tabl[j]);tone(12,1000,p);}//стук -пауза нужная- стук if(flag_C==0&&tabl_CL[j]!=0){tone(12,1000,p);delay(tabl_CL[j]);tone(12,1000,p);} } flag_B=!flag_B;//переключаем в режим ожидания - постоянно вызываем функцию STUK() flag_C=1;//переход в ожидания подтверждающей комбинации стуков delay(p);// пауза, позволяющая делать два режима исполнения - бесконечный повтор исполнений и исполнение по одному стуку } else{STUK();} } /////////////////////////////////////////// void STUK() { if(flag_A==0&&digitalRead(V1)==LOW){Y=millis();flag_A=1;delay(p);}//если уловили удар ждём пока он пройдёт if(flag_A==1&&digitalRead(V1)==HIGH){flag_A=2;}//фиксируем с помощью флага, что удар прошёл if(flag_A==2&&(millis()-Y>P))//если пауза между ударами большая переходим к следующей серии ударов {flag_A=0; for(j=i;j<g;j++){tabl[j]=0;}i=g-1;flag_B=1;if(flag_C==1){PROVERKA();}} if(flag_A==2&&digitalRead(V1)==LOW)//если уловили следующий удар-стук, запоминаем длительность между ним и предидущим, заносим значение в массив {Y=(int)(millis()-Y);if(flag_C==1){tabl[i]=Y;}else{tabl_CL[i]=Y;}i++;if(i>g-1){i=0;}flag_A=0;} } /////////////////////////////////////////// void PROVERKA() { for(j=0;j<g;j++) { if(abs(tabl[j]-tabl_CL[j])<dP){k++;}//проверка совпадения длительностей } if(k==g){digitalWrite(13,!digitalRead(13));}// если комбинации стуков совпали поменять состояние замка на противоположное k=0;//обнуление счётчика совпадений } ///////////////////////////////////////////
Сделал макет замка с секретом по комбинации длительностей между короткими ударами (секретный стук - по мотивам интернета). Всё работает как и замышлялось, но (строки 18, 22, 23) не ясно почему надо конкретно указывать размер массивов числом 50, а нельзя записать g -которое равно 50?
Сделай гэ константной.
По строке #32 - все глобалы и статики инициализируются нулями автоматически.
Супер идея, но могут подслушать. А в старые добрые времена нужно было вынуть секретный болт, или наоборот в скрытое отверстие вставить тонкий гвоздь :)
Сделай гэ константной.
По строке #32 - все глобалы и статики инициализируются нулями автоматически.
Понял.
Супер идея, но могут подслушать. А в старые добрые времена нужно было вынуть секретный болт, или наоборот в скрытое отверстие вставить тонкий гвоздь :)
Тут тоже болт есть :) Перед повтором комбинации надо лишний разок стукнуть.
Класс!!!! Супер! Как раз для Ардуино и разминки мозги занятие. Привязать + к шифру ещё число месяца или текущее "который час" ... так и подслушивать бесполезно.
Чего то вдруг подумалось.., а если датчик стука просто заменить на кнопку, увеличив значение паузы между ловлей уровней сигнала, то можно сделать "умнейшую кнопку" с паролями на разные объекты управления или их функции.