Магнитный замок

space
Offline
Зарегистрирован: 18.12.2016

Да код правил, у меня электромеханический замок. Нужно, что бы питание на магнит поступало когда ключ приложен к лузе.

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015
30   if (ds.search(addr)) {
31     for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;
32     if (val == 8) {
33       open_door();//вынесли этот фрагмент в отдельную функцию
34     }
35     ds.reset_search();
36   }

 

вот в этих строках у вас val постоянно набирается, а нигде не обнуляется. надо давать какое то время на обработку, если времся превышено, то сбросить val в 0

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

или делать так, if (addr[i] != key[i]) val = 0;т.е. последовательность ключа не совпала, то прерываем функцию пока весь ключ не пройдет как положено символ за символом

 

space
Offline
Зарегистрирован: 18.12.2016

Здесь я ничего не правил, все как в 39 посте. Помогите пожалуста поправить код. Домофон уже собран, хочется довести до ума.

Вместо строки:

32

    if (val == 8)

Вставить:

if (addr[i] != key[i]) val = 0;

Так?

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

не понятно) за вас доделать) 

#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 4000 // сколько будет открыта дверь
#define DOOR 13 // зададим пин для двери
#define BUZZER 12 // зададим пин для звонка
#define BUTTON 11// зададим пин для кнопки

unsigned long time_door = 0;
unsigned long time_buzzer = 0;

boolean flag_buzzer = 0;
boolean flag_door = 0;

byte key[8] = {0x1, 0x66, 0xA9, 0x31, 0xF, 0x0, 0x0, 0x14}; // ключ
byte addr[8];
byte val = 0;

OneWire  ds(10);

void setup(void) {
  pinMode(DOOR, OUTPUT );
  digitalWrite(DOOR,LOW );
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, LOW);
  pinMode(BUTTON, INPUT);
  digitalWrite(BUTTON, HIGH);
}
void loop(void) {
  if (ds.search(addr)) {
    for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;  if (addr[i] != key[i]) val = 0;// тут надо было строку добавить
    if (val == 8) {
      open_door();//вынесли этот фрагмент в отдельную функцию
    }
    ds.reset_search();
  }
  door(); //функция двери
  if  (flag_door == 1) //если дверь еще открыта значит будем пищать
  {
    buzzer(); // функция пищалки
  }
  else if (flag_door == 0) // иначе если дверь уже закрылась то:
  {
    digitalWrite(BUZZER, LOW); // выключаем пищалку и больше не пищим пока дверь не откроется
    flag_buzzer = 0; // запоминаем что пищалка выключена
  }
  /* милисекунды в ардуино обнуляются каждые 49 суток
    для того чтобы в случае если включенное состояние замка небыло еще 49 суток
    нужно обнулить и время отсчета, при этом пищать buzzer либо открыта дверь будет вдвое больше обычного что не кретично.*/
  if (millis() < time_door)
  {
    time_door = 0;
    time_buzzer = 0;
  }
  //тут запишем что если нажали на кнопку - выполним функцию открытия двери
  if (digitalRead(BUTTON) == 0) //если нажал на кнопку
  {
    open_door();//функция открытия двери
  }
}
void door()
{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, LOW); //то закрываем ее
    flag_door = 0; // и запоминаем что она закрыта
  }
}
void buzzer()
{
  if  ((millis() >= time_buzzer + TIME_PERIOD_BUZZER) && (flag_buzzer == 1))//если прошло время которое задавали для пищалки и она включена
  {
    digitalWrite(BUZZER, LOW); //мы ее выключаем
    time_buzzer = millis(); //запоминаем время когда выключили
    flag_buzzer = 0; //запоминаем что она выключена
  }
  else if ((millis() >= time_buzzer + TIME_PERIOD_BUZZER) && (flag_buzzer == 0)) //если прошло время которое задавали для пищалки и она выключена
  {
    digitalWrite(BUZZER, HIGH); //то включаем ее
    time_buzzer = millis(); //запоминаем время выключение пищалки
    flag_buzzer = 1; // запоминаем что она выключина
  }
}
void open_door()//функция открытия двери
{
  time_buzzer = millis(); //зададим отсчет времени для пищалки
  time_door = millis(); //зададим отсчет времени для двери
  digitalWrite(BUZZER, HIGH);//включаем пищалку
  digitalWrite(DOOR, HIGH);//открываем дверь
  flag_buzzer = 1;//устанавливаем флаг что пищалка включена
  flag_door = 1;//устанавливаем флаг что дверь открыта
}

 

 

space
Offline
Зарегистрирован: 18.12.2016

Выдает ошибку при компилляции

'i' was not declared in this scope

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

а блин, не учел

#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 4000 // сколько будет открыта дверь
#define DOOR 13 // зададим пин для двери
#define BUZZER 12 // зададим пин для звонка
#define BUTTON 11// зададим пин для кнопки

unsigned long time_door = 0;
unsigned long time_buzzer = 0;

boolean flag_buzzer = 0;
boolean flag_door = 0;

byte key[8] = {0x1, 0x66, 0xA9, 0x31, 0xF, 0x0, 0x0, 0x14}; // ключ
byte addr[8];
byte val = 0;

OneWire  ds(10);

void setup(void) {
  pinMode(DOOR, OUTPUT );
  digitalWrite(DOOR,LOW );
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, LOW);
  pinMode(BUTTON, INPUT);
  digitalWrite(BUTTON, HIGH);
}
void loop(void) {
  if (ds.search(addr)) {
    for (byte i = 0; i < 8; i++){ if (addr[i] == key[i]) val++;  if (addr[i] != key[i]) val = 0;}// тут надо было строку добавить {} - скобки не поставил
    if (val == 8) {
      open_door();//вынесли этот фрагмент в отдельную функцию
    }
    ds.reset_search();
  }
  door(); //функция двери
  if  (flag_door == 1) //если дверь еще открыта значит будем пищать
  {
    buzzer(); // функция пищалки
  }
  else if (flag_door == 0) // иначе если дверь уже закрылась то:
  {
    digitalWrite(BUZZER, LOW); // выключаем пищалку и больше не пищим пока дверь не откроется
    flag_buzzer = 0; // запоминаем что пищалка выключена
  }
  /* милисекунды в ардуино обнуляются каждые 49 суток
    для того чтобы в случае если включенное состояние замка небыло еще 49 суток
    нужно обнулить и время отсчета, при этом пищать buzzer либо открыта дверь будет вдвое больше обычного что не кретично.*/
  if (millis() < time_door)
  {
    time_door = 0;
    time_buzzer = 0;
  }
  //тут запишем что если нажали на кнопку - выполним функцию открытия двери
  if (digitalRead(BUTTON) == 0) //если нажал на кнопку
  {
    open_door();//функция открытия двери
  }
}
void door()
{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, LOW); //то закрываем ее
    flag_door = 0; // и запоминаем что она закрыта
  }
}
void buzzer()
{
  if  ((millis() >= time_buzzer + TIME_PERIOD_BUZZER) && (flag_buzzer == 1))//если прошло время которое задавали для пищалки и она включена
  {
    digitalWrite(BUZZER, LOW); //мы ее выключаем
    time_buzzer = millis(); //запоминаем время когда выключили
    flag_buzzer = 0; //запоминаем что она выключена
  }
  else if ((millis() >= time_buzzer + TIME_PERIOD_BUZZER) && (flag_buzzer == 0)) //если прошло время которое задавали для пищалки и она выключена
  {
    digitalWrite(BUZZER, HIGH); //то включаем ее
    time_buzzer = millis(); //запоминаем время выключение пищалки
    flag_buzzer = 1; // запоминаем что она выключина
  }
}
void open_door()//функция открытия двери
{
  time_buzzer = millis(); //зададим отсчет времени для пищалки
  time_door = millis(); //зададим отсчет времени для двери
  digitalWrite(BUZZER, HIGH);//включаем пищалку
  digitalWrite(DOOR, HIGH);//открываем дверь
  flag_buzzer = 1;//устанавливаем флаг что пищалка включена
  flag_door = 1;//устанавливаем флаг что дверь открыта
}

 

space
Offline
Зарегистрирован: 18.12.2016

Теперь не видит "свой" ключ тоже.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

а так? 

#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 4000 // сколько будет открыта дверь
#define DOOR 13 // зададим пин для двери
#define BUZZER 12 // зададим пин для звонка
#define BUTTON 11// зададим пин для кнопки

unsigned long time_door = 0;
unsigned long time_buzzer = 0;

boolean flag_buzzer = 0;
boolean flag_door = 0;

byte key[8] = {0x1, 0x66, 0xA9, 0x31, 0xF, 0x0, 0x0, 0x14}; // ключ
byte addr[8];
byte val = 0;

OneWire  ds(10);

void setup(void) {
  pinMode(DOOR, OUTPUT );
  digitalWrite(DOOR,LOW );
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, LOW);
  pinMode(BUTTON, INPUT);
  digitalWrite(BUTTON, HIGH);
}
void loop(void) {
  if (ds.search(addr)) {
    if (val > 7)
    {
      val=0;
    }
    for (byte i = 0; i < 8; i++){ if (addr[i] == key[i]) val++;  if (addr[i] != key[i]) val = 0;}// тут надо было строку добавить {} - скобки не поставил
    if (val == 8) {
      open_door();//вынесли этот фрагмент в отдельную функцию
    }
    ds.reset_search();
  }
  door(); //функция двери
  if  (flag_door == 1) //если дверь еще открыта значит будем пищать
  {
    buzzer(); // функция пищалки
  }
  else if (flag_door == 0) // иначе если дверь уже закрылась то:
  {
    digitalWrite(BUZZER, LOW); // выключаем пищалку и больше не пищим пока дверь не откроется
    flag_buzzer = 0; // запоминаем что пищалка выключена
  }
  /* милисекунды в ардуино обнуляются каждые 49 суток
    для того чтобы в случае если включенное состояние замка небыло еще 49 суток
    нужно обнулить и время отсчета, при этом пищать buzzer либо открыта дверь будет вдвое больше обычного что не кретично.*/
  if (millis() < time_door)
  {
    time_door = 0;
    time_buzzer = 0;
  }
  //тут запишем что если нажали на кнопку - выполним функцию открытия двери
  if (digitalRead(BUTTON) == 0) //если нажал на кнопку
  {
    open_door();//функция открытия двери
  }
}
void door()
{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, LOW); //то закрываем ее
    flag_door = 0; // и запоминаем что она закрыта
  }
}
void buzzer()
{
  if  ((millis() >= time_buzzer + TIME_PERIOD_BUZZER) && (flag_buzzer == 1))//если прошло время которое задавали для пищалки и она включена
  {
    digitalWrite(BUZZER, LOW); //мы ее выключаем
    time_buzzer = millis(); //запоминаем время когда выключили
    flag_buzzer = 0; //запоминаем что она выключена
  }
  else if ((millis() >= time_buzzer + TIME_PERIOD_BUZZER) && (flag_buzzer == 0)) //если прошло время которое задавали для пищалки и она выключена
  {
    digitalWrite(BUZZER, HIGH); //то включаем ее
    time_buzzer = millis(); //запоминаем время выключение пищалки
    flag_buzzer = 1; // запоминаем что она выключина
  }
}
void open_door()//функция открытия двери
{
  time_buzzer = millis(); //зададим отсчет времени для пищалки
  time_door = millis(); //зададим отсчет времени для двери
  digitalWrite(BUZZER, HIGH);//включаем пищалку
  digitalWrite(DOOR, HIGH);//открываем дверь
  flag_buzzer = 1;//устанавливаем флаг что пищалка включена
  flag_door = 1;//устанавливаем флаг что дверь открыта
}

 

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

или вот так лучше даже будет 

#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 4000 // сколько будет открыта дверь
#define DOOR 13 // зададим пин для двери
#define BUZZER 12 // зададим пин для звонка
#define BUTTON 11// зададим пин для кнопки

unsigned long time_door = 0;
unsigned long time_buzzer = 0;

boolean flag_buzzer = 0;
boolean flag_door = 0;

byte key[8] = {0x1, 0x66, 0xA9, 0x31, 0xF, 0x0, 0x0, 0x14}; // ключ
byte addr[8];
byte val = 0;

OneWire  ds(10);

void setup(void) {
  pinMode(DOOR, OUTPUT );
  digitalWrite(DOOR,LOW );
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, LOW);
  pinMode(BUTTON, INPUT);
  digitalWrite(BUTTON, HIGH);
}
void loop(void) {
  if (ds.search(addr)) {
    if (addr[0] == 0x1)
    {
      val=0;
    }              // еще одна проверка на начало кода
    if (val > 7)
    {
      val=0;
    }
    for (byte i = 0; i < 8; i++){ if (addr[i] == key[i]) val++;  if (addr[i] != key[i]) val = 0;}// тут надо было строку добавить {} - скобки не поставил
    if (val == 8) {
      open_door();//вынесли этот фрагмент в отдельную функцию
    }
    ds.reset_search();
  }
  door(); //функция двери
  if  (flag_door == 1) //если дверь еще открыта значит будем пищать
  {
    buzzer(); // функция пищалки
  }
  else if (flag_door == 0) // иначе если дверь уже закрылась то:
  {
    digitalWrite(BUZZER, LOW); // выключаем пищалку и больше не пищим пока дверь не откроется
    flag_buzzer = 0; // запоминаем что пищалка выключена
  }
  /* милисекунды в ардуино обнуляются каждые 49 суток
    для того чтобы в случае если включенное состояние замка небыло еще 49 суток
    нужно обнулить и время отсчета, при этом пищать buzzer либо открыта дверь будет вдвое больше обычного что не кретично.*/
  if (millis() < time_door)
  {
    time_door = 0;
    time_buzzer = 0;
  }
  //тут запишем что если нажали на кнопку - выполним функцию открытия двери
  if (digitalRead(BUTTON) == 0) //если нажал на кнопку
  {
    open_door();//функция открытия двери
  }
}
void door()
{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, LOW); //то закрываем ее
    flag_door = 0; // и запоминаем что она закрыта
  }
}
void buzzer()
{
  if  ((millis() >= time_buzzer + TIME_PERIOD_BUZZER) && (flag_buzzer == 1))//если прошло время которое задавали для пищалки и она включена
  {
    digitalWrite(BUZZER, LOW); //мы ее выключаем
    time_buzzer = millis(); //запоминаем время когда выключили
    flag_buzzer = 0; //запоминаем что она выключена
  }
  else if ((millis() >= time_buzzer + TIME_PERIOD_BUZZER) && (flag_buzzer == 0)) //если прошло время которое задавали для пищалки и она выключена
  {
    digitalWrite(BUZZER, HIGH); //то включаем ее
    time_buzzer = millis(); //запоминаем время выключение пищалки
    flag_buzzer = 1; // запоминаем что она выключина
  }
}
void open_door()//функция открытия двери
{
  time_buzzer = millis(); //зададим отсчет времени для пищалки
  time_door = millis(); //зададим отсчет времени для двери
  digitalWrite(BUZZER, HIGH);//включаем пищалку
  digitalWrite(DOOR, HIGH);//открываем дверь
  flag_buzzer = 1;//устанавливаем флаг что пищалка включена
  flag_door = 1;//устанавливаем флаг что дверь открыта
}

 

space
Offline
Зарегистрирован: 18.12.2016

Докрутился, провод в лузе оторвал. Последний скетч, все отлично. "Чужой" не видит (держал 30сек) "свой" видит четко. Еще погоняю и отпишусь.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

замените еще 38 строку с  if (addr[0] == 0x1)  на if (addr[0] == key[0])

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

DetSimen пишет:

тогда вся вот эта хрень

уложица в 

if (ds.search(addr)) {
    if (addr == key)      open_door();// открыть
    ds.reset_search();
}

но, возможно понадабица приведение типа в ds.search(addr)

да, так симпотичнее, но я пытался показать почему не работает тот код, а не полностью менять еще более запутывать человека

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

хорошо, я отменил свой "запутанный" код

space
Offline
Зарегистрирован: 18.12.2016

Спасибо. Пока все четко работает. Пока менять ничего не буду. Буду изучать. Хочу все таки создать массив. Тогда и внесу все предложенные изменения. Есть еще 4 ключа которые не перезаписываются. Выкинуть ключи - "не наш метод". Еще раз спасибо за то, что помогли быстро решить проблему.

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

DetSimen пишет:

хорошо, я отменил свой "запутанный" код

хахах)) да он для тебя, меня и еще 10 людям на форуме с первого взгляда понятен)), а человек который логически рассуждал в одну сторону, в лоб, ему предлагают обойти другим путем, не объяснив причины, может не допереть так сразу, и для него будет казатся что его путают) вот и все

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015

space пишет:

Спасибо. Пока все четко работает. Пока менять ничего не буду. Буду изучать. Хочу все таки создать массив. Тогда и внесу все предложенные изменения. Есть еще 4 ключа которые не перезаписываются. Выкинуть ключи - "не наш метод". Еще раз спасибо за то, что помогли быстро решить проблему.

да не за что, захотите вносить ключи в энергонезависимую память, смогу объяснить, П.С. что бы появилась возможность добавлять ключи не подключая даже к компьютеру, просто нравится мне такая тема) и мне будет интересно подсказать, реализовать

 

space
Offline
Зарегистрирован: 18.12.2016

Да. Это было бы лучше без компа. Если есть время и возможность. Буду благодарен.