Замок по секретному стуку.

leks
Offline
Зарегистрирован: 22.10.2017
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 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? 

sadman41
Offline
Зарегистрирован: 19.10.2016

Сделай гэ константной.

По строке #32 - все глобалы и статики инициализируются нулями автоматически.

Messiah
Messiah аватар
Offline
Зарегистрирован: 10.11.2018

Супер идея, но могут подслушать. А в старые добрые времена нужно было вынуть секретный болт, или наоборот в скрытое отверстие вставить тонкий гвоздь :)

leks
Offline
Зарегистрирован: 22.10.2017

sadman41 пишет:

Сделай гэ константной.

По строке #32 - все глобалы и статики инициализируются нулями автоматически.

Понял.

 

leks
Offline
Зарегистрирован: 22.10.2017

Messiah пишет:

Супер идея, но могут подслушать. А в старые добрые времена нужно было вынуть секретный болт, или наоборот в скрытое отверстие вставить тонкий гвоздь :)

Тут тоже болт есть :) Перед повтором комбинации надо лишний разок стукнуть.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Класс!!!! Супер! Как раз для Ардуино и разминки мозги занятие. Привязать + к шифру ещё число месяца или текущее "который час" ... так и подслушивать бесполезно.

leks
Offline
Зарегистрирован: 22.10.2017

Чего то вдруг подумалось.., а если датчик стука просто заменить на кнопку, увеличив значение паузы между ловлей уровней сигнала, то можно сделать "умнейшую кнопку" с паролями на разные объекты управления или их функции.