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

a2kuz
Offline
Зарегистрирован: 17.04.2017

Добрый вечер ! подскажите как добавить  пищалку как у домофона чтоб при открытии был сигнал на то время как будет открыта дверь. Спасибо.

// подключать считыватель + (МК) с пином 13 через резистор 4.7кОМ к нему же ( к пину  дату считывателя) 
#include <OneWire.h>

 
OneWire  ds(10);    

void setup(void) {  
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
}

void loop(void) {
  byte key[8] = {0x1, 0xCC, 0x1D, 0xF0, 0x9, 0x0, 0x0, 0xB0}; // ключ
  byte addr[8];
  byte val = 0;
  
  if (ds.search(addr)) {    
      for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;                       
      
      if (val == 8) {
       digitalWrite(13, LOW);
       delay(3000); // задержка 
       digitalWrite(13, HIGH); 
     }
  ds.reset_search();   
  }  
}

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Каким образом у Вас определяется что дверь открыта? Или Вы имели в виду пока отключён электромагнит?

a2kuz
Offline
Зарегистрирован: 17.04.2017

да, я имею введу пока отключен элмагнит чтоб был звук пишалки 

 и если возможно как добавить кнопку открытия двери из нутри ( извиняйте я только учусь буду благодарен)

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

a2kuz пишет:

да, я имею введу пока отключен элмагнит чтоб был звук пишалки 

Ну тогда включать и выключать пищалку надо вместе с электромагнитом. Есть ещё нюанс - активная или пассивная пищалка. Активная сама пищит при подаче напряжения. Пассивной нужно подавать сигнал с определённой частотой. Кусок вашего кода (строки 21 -23) изменить так:

digitalWrite(13, LOW); // выключить электромагнит
digitalWrite(buzzer, HIGH); // включить пищалку (если активная)
// или tone(buzzer, frequency); // включить пищалку (если пассивная, частоту сигнала в Герцах подобрать самому)
delay(3000); // задержка
digitalWrite(13, HIGH); // включить электромагнит
digitalWrite(buzzer, LOW); // выключить пищалку (если активная)
// или noTone(buzzer); // выключить пищалку (если пассивная)

a2kuz пишет:

 и если возможно как добавить кнопку открытия двери из нутри ( извиняйте я только учусь буду благодарен)

Как работать с кнопками уже много расписано и показано. Изучите для начала:

Тактовая кнопка

Работа с кнопками. В помощь новичку

класс титановый велосипед для тактовой кнопки

Кнопки, PWM, функции

Опрос кнопки добавить в строку 16. Или сделать через прерывание attachInterrupt().

А строку 13 надо бы вынести в setup().

a2kuz
Offline
Зарегистрирован: 17.04.2017

пищалку плюс цепляю на выход элмагнита тоесть 13 пин минус на GND   в итоге получается что пищалка постоянно  пишит а при срабатывании ключа ( мангит ВЫКЛ.) пишалка перестает пищать и через 3 сек опять начинает пишать вместе с электромагнитом 

что делаю не так?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ну дык правильно, вы же подключили пищалку и электромагнит на один пин. Включается электромагнит - включается и пищалка. Цепляйте пищалку на другой пин и управляйте инверсно относительно электромагнита. Я же написал выше пример.

a2kuz
Offline
Зарегистрирован: 17.04.2017

Да я понял ! с этим вопросов нет, а как можно реализовать чтоб он не просто пищал... а "пикал"  
Спасибо!

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

a2kuz пишет:

Да я понял ! с этим вопросов нет, а как можно реализовать чтоб он не просто пищал... а "пикал"  
Спасибо!

вам проще поставить реле, если есть питание на замке то реле включено, а пищалку подцепить к НЗ контактам. а если реализовать что бы пикал, нужно делать отдельную функцию без delay,  а спомощью millis()

a2kuz
Offline
Зарегистрирован: 17.04.2017

СПАСИБО!, я все понял что Вы имели введу.)))) затупил я что то просто!)

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015
// подключать считыватель + (МК) с пином 13 через резистор 4.7кОМ к нему же ( к пину  дату считывателя)
#include <OneWire.h>

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

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

boolean flag_buzzer = 0;
boolean flag_door = 0;

OneWire  ds(10);

void setup(void) {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(13, HIGH);
}

void loop(void) {
  byte key[8] = {0x1, 0xCC, 0x1D, 0xF0, 0x9, 0x0, 0x0, 0xB0}; // ключ
  byte addr[8];
  byte val = 0;

  if (ds.search(addr)) {
    for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;

    if (val == 8) {
      time_buzzer = millis(); //зададим отсчет времени для пищалки
      time_door = millis(); //зададим отсчет времени для двери
      digitalWrite(BUZZER, LOW);//включаем пищалку
      digitalWrite(DOOR, LOW);//открываем дверь
      flag_buzzer = 1;//устанавливаем флаг что пищалка включена
      flag_door = 1;//устанавливаем флаг что дверь открыта
    }
    ds.reset_search();

  }
  
  door(); //функция двери
  if  (flag_door == 1) //если дверь еще открыта значит будем пищать
  {
    buzzer(); // функция пищалки
  }
  else if (flag_door == 0) // иначе если дверь уже закрылась то:
  {
    digitalWrite(buzzer, HIGH); // выключаем пищалку и больше не пищим пока дверь не откроется
    flag_buzzer = 0; // запоминаем что пищалка выключена
  }
  /* милисекунды в ардуино обнуляются каждые 49 суток
    для того чтобы в случае если включенное состояние замка небыло еще 49 суток
    нужно обнулить и время отсчета, при этом пищать buzzer либо открыта дверь будет вдвое больше обычного что не кретично.*/
  if (millis() < time_door)
  {
    time_door = 0;
    time_buzzer = 0;
  }
}


void door()

{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, HIGH); //то закрываем ее
    flag_door = 0; // и запоминаем что она закрыта
  }
}
void buzzer()
  {
    if  ((millis() >= time_buzzer + TIME_PERIOD_BUZZER) && (flag_buzzer == 1))//если прошло время которое задавали для пищалки и она включена
    {
      digitalWrite(buzzer, HIGH); //мы ее выключаем
      time_buzzer = millis(); //запоминаем время когда выключили
      flag_buzzer = 0; //запоминаем что она выключена
    }
    else if ((millis() >= time_buzzer + TIME_PERIOD_BUZZER) && (flag_buzzer == 0)) //если прошло время которое задавали для пищалки и она выключена

    {
      digitalWrite(buzzer, LOW); //то включаем ее
      time_buzzer = millis(); //запоминаем время выключение пищалки
      flag_buzzer = 1; // запоминаем что она выключина
    }
  }
  
 



a2kuz пишет:

СПАСИБО!, я все понял что Вы имели введу.)))) затупил я что то просто!)

если хотите пищать, то вам придется убирать delay и все переводить на millis

вот так это будет выглядеть, проверить не на чем, попробуйте скажете что не так 

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

отпишитесь если даже работает

a2kuz
Offline
Зарегистрирован: 17.04.2017

с данным скетчем пищалка вообще не  реагирует не на что .  все подключенно  правильно на вот этом  коде она пикает один раз с короткой задержкой. 

// + через резистор на 4.7 Ком подключаем 10п и (дата) считывателя  13п. выход на магнит 
// светодиод и пищалка под вопросом


#include <OneWire.h> // http://www.pjrc.com/teensy/td_libs_OneWire.html

 
OneWire  ds(10);    

void setup(void) {  
  pinMode(13, OUTPUT);// электромагнит
  digitalWrite(13, HIGH);
  pinMode(12, OUTPUT);// пищалка
  digitalWrite(12, LOW);
}

void loop(void) {
  byte key[8] = {0x1, 0xAF, 0x85, 0xB1, 0xA, 0x0, 0x0, 0x28}; // ключ
  byte addr[8];
  byte val = 0;
  
  if (ds.search(addr)) {    
      for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;                       
      
      if (val == 8) {
         digitalWrite(13, LOW); // выключить электромагнит
         digitalWrite(12, HIGH); // включить пищалку (если активная)
         tone(12, 2780, 200); // Сирена tone(buzzer, frequency); // включить пищалку (если пассивная, частоту сигнала в Герцах подобрать самому)
         delay(3000); // задержка
         digitalWrite(13, HIGH); // включить электромагнит
         digitalWrite(12, LOW); // выключить пищалку (если активная)
         // или noTone(buzzer); // выключить пищалку (если пассивная)

     }


  ds.reset_search();   
  }  
}

не принципиально чтоб она пищала всегда когда дверь открыта ,  как сделать так чтоб она при открытии несколько раз пикнула, допустим как у обычного домофона на подьезде.

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

схему подключения пищалки и замка нарисуйте, как подключенно, через реле или напрямую

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

a2kuz пишет:

не принципиально чтоб она пищала всегда когда дверь открыта ,  как сделать так чтоб она при открытии несколько раз пикнула, допустим как у обычного домофона на подьезде.

она будет пищать 3 секунды, пока на замке нету питания 

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

попробуйте так

// подключать считыватель + (МК) с пином 13 через резистор 4.7кОМ к нему же ( к пину  дату считывателя)
#include <OneWire.h>

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

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

boolean flag_buzzer = 0;
boolean flag_door = 0;

OneWire  ds(10);

void setup(void) {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(13, HIGH);
}

void loop(void) {
  byte key[8] = {0x1, 0xCC, 0x1D, 0xF0, 0x9, 0x0, 0x0, 0xB0}; // ключ
  byte addr[8];
  byte val = 0;

  if (ds.search(addr)) {
    for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;

    if (val == 8) {
      time_buzzer = millis(); //зададим отсчет времени для пищалки
      time_door = millis(); //зададим отсчет времени для двери
      digitalWrite(BUZZER, HIGH);//включаем пищалку
      digitalWrite(DOOR, LOW);//открываем дверь
      flag_buzzer = 1;//устанавливаем флаг что пищалка включена
      flag_door = 1;//устанавливаем флаг что дверь открыта
    }
    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;
  }
}


void door()

{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, HIGH); //то закрываем ее
    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; // запоминаем что она выключина
    }
  }
  
 



 

a2kuz
Offline
Зарегистрирован: 17.04.2017

Реле пока не какого нет , сейчас собираю все на макетной, проше на "коленке" 

к 10 пину подключен считыватель  ключей таблеток
к 13 пину подключен (пока обычный светодиод)
к 12 пину подключена пищалка
в общем то вот пока вуся схема, считыватель срабатывает отключает питание на 13 пине на 3 секунды.

на данный момент пикает пишалка один раз, с задержкой 200мс. 
 

a2kuz
Offline
Зарегистрирован: 17.04.2017

Вот так все работает))))) пищалка пикнула несколько раз, в общем то как и нужно было пока что. СПАСИБО!
сейчас нужно посидеть подумать как вообще это работает. Я только учусь не обесудьте)

вопрос ! чтоб сделать кнопку допустим открытия изнутри мне нужно подключить ее паралельно считывателю?
хотя нет !.... нужен же ключь!  а как тогда сделать чтоб кнопка открыла я не понимаю. 

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

для начала надо добавить кнопку как я описывал выше 

#define BUTTON 11// зададим пин для кнопки

потом надо задать что этот пин будет работать как вход включим подтягивающий резистор на +5В что бы при отпущенной кнопке на ней была строгая 1-ца

pinMode(11, INPUT);
  digitalWrite(11,HIGH);

для данной цели вам думаю не нужно будет делать антидребезг кнопки http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku а хватит простой команды digitalRead(BUTTON == LOW) .т.е.

// подключать считыватель + (МК) с пином 13 через резистор 4.7кОМ к нему же ( к пину  дату считывателя)
#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 3000 // сколько будет открыта дверь
#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;

//OneWire  ds(10);

void setup(void) {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(11, INPUT);
  digitalWrite(11,HIGH);
  
}

void loop(void) {
  byte key[8] = {0x1, 0xCC, 0x1D, 0xF0, 0x9, 0x0, 0x0, 0xB0}; // ключ
  byte addr[8];
  byte val = 0;

  if (ds.search(addr)) {
    for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;

   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==LOW));
  {
    open_door();//функция открытия двери
  }
  
}


void door()

{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, HIGH); //то закрываем ее
    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, LOW);//открываем дверь
      flag_buzzer = 1;//устанавливаем флаг что пищалка включена
      flag_door = 1;//устанавливаем флаг что дверь открыта
}

П.С. кнопка будет работать если ее подключить одним контактом к земле ардуино(GND) а вторым к 11 пину

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

еще 

019   pinMode(13, OUTPUT);
020   digitalWrite(13, HIGH);
021   pinMode(12, OUTPUT);
022   digitalWrite(13, HIGH);
023   pinMode(11, INPUT);
024   digitalWrite(11,HIGH);

нужно заменить на 

019   pinMode(DOOR, OUTPUT);
020   digitalWrite(DOOR, HIGH);
021   pinMode(BUZZER, OUTPUT);
022   digitalWrite(BUZZER, HIGH);
023   pinMode(BUTTON, INPUT);
024   digitalWrite(BUTTON,HIGH);

что бы меняя первые строки в define можно было изменять пины не изменяя самого кода(для удобства если захотите вдруг другие пины использовать)

a2kuz
Offline
Зарегистрирован: 17.04.2017

Ок , я вас понял! Спасибо.

 time_buzzer = millis(); //зададим отсчет времени для пищалки
 time_door = millis(); //зададим отсчет времени для двери

как понимаю в скобках "()" нужно указывать время отсчета? срабатывания пишалки и магнита!?
 

a2kuz
Offline
Зарегистрирован: 17.04.2017

при компиляции последнии пример  ругается на 33 строке 

 'ds' не был объявлен в этой области

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

a2kuz пишет:

Ок , я вас понял! Спасибо.

 time_buzzer = millis(); //зададим отсчет времени для пищалки
 time_door = millis(); //зададим отсчет времени для двери

как понимаю в скобках "()" нужно указывать время отсчета? срабатывания пишалки и магнита!?
 

нет, ничего указывать не нужно это просто начали отсчет функция millis() - смотрить время которое идет в ардуино, оно сбрасывается каждые 49 суток, т.е. идет от 0 до 4,294,967,295 миллисекунд, и мы задаем переменной time_buzzer и time_door именно то время которое ардуина проходит в фоновом режиме. т.е. 0,1,2,3.....600,601 а тут мы взяли и присвоили time_buzzer = millis(); это означает что time_buzzer = 601 и потом когда мы проверяем а сколько натикало в millis() смотрим а там уже не 601 а 801 условие пройдено

if  (millis() >= time_buzzer + TIME_PERIOD_BUZZER)

т.е. if (801>=601+200)

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

a2kuz пишет:

при компиляции последнии пример  ругается на 33 строке 

 'ds' не был объявлен в этой области

да действительно, случайно забыл убрать "//" перед OneWire  ds(10);

// подключать считыватель + (МК) с пином 13 через резистор 4.7кОМ к нему же ( к пину  дату считывателя)
#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 3000 // сколько будет открыта дверь
#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;

OneWire  ds(10); //тут случайно не убрал

void setup(void) {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(11, INPUT);
  digitalWrite(11,HIGH);
  
}

void loop(void) {
  byte key[8] = {0x1, 0xCC, 0x1D, 0xF0, 0x9, 0x0, 0x0, 0xB0}; // ключ
  byte addr[8];
  byte val = 0;

  if (ds.search(addr)) {
    for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;

   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==LOW));
  {
    open_door();//функция открытия двери
  }
  
}


void door()

{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, HIGH); //то закрываем ее
    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, LOW);//открываем дверь
      flag_buzzer = 1;//устанавливаем флаг что пищалка включена
      flag_door = 1;//устанавливаем флаг что дверь открыта
}

 

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

а что бы регулировать переодичность пищалки и время срабатывания двери - нужно

004 #define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки изменить цифру 200 миллисекунд на допустим 100 тогда будет пищать быстрее
005 #define TIME_PERIOD_DOOR 3000 // сколько будет открыта дверь изменить цифру на 9000 тогда замок будет разблокирован на 9секунт вместо 3-ех мною заданных

 

a2kuz
Offline
Зарегистрирован: 17.04.2017

Прошил МК теперь не срабатывает магнит ( тоесть не срабатывает ключь) и пищалка постоянно пищит не каких реакции Вот скетч

// подключать считыватель + (МК) с пином 13 через резистор 4.7кОМ к нему же ( к пину  дату считывателя)
#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 3000 // сколько будет открыта дверь
#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;

OneWire  ds(10); //тут случайно не убрал

void setup(void) {
pinMode(DOOR, OUTPUT);
digitalWrite(DOOR, HIGH);
pinMode(BUZZER, OUTPUT);
digitalWrite(BUZZER, LOW);
pinMode(BUTTON, INPUT);
digitalWrite(BUTTON,HIGH);

 }

void loop(void) {
  byte key[8] = {0x1, 0xAF, 0x85, 0xB1, 0xA, 0x0, 0x0, 0x28}; // ключ
  byte addr[8];
  byte val = 0;

  if (ds.search(addr)) {
    for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;

   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==LOW));
  {
    open_door();//функция открытия двери
  }
  
}


void door()

{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, HIGH); //то закрываем ее
    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, LOW);//открываем дверь
      flag_buzzer = 1;//устанавливаем флаг что пищалка включена
      flag_door = 1;//устанавливаем флаг что дверь открыта
}
 

 

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

как нопку подключили? схему нарисуйте

 

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

// подключать считыватель + (МК) с пином 13 через резистор 4.7кОМ к нему же ( к пину  дату считывателя)
#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 3000 // сколько будет открыта дверь
#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;

//OneWire  ds(10);

void setup(void) {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(11, INPUT);
  digitalWrite(11,HIGH);
  
}

void loop(void) {
  //byte key[8] = {0x1, 0xCC, 0x1D, 0xF0, 0x9, 0x0, 0x0, 0xB0}; // ключ
  //byte addr[8];
  //byte val = 0;

  //if (ds.search(addr)) {
   // for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;

   //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))==LOW); //изменил тут!!!!!!!!!!!!!
  {
    open_door();//функция открытия двери
  }
  
}


void door()

{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, HIGH); //то закрываем ее
    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, LOW);//открываем дверь
      flag_buzzer = 1;//устанавливаем флаг что пищалка включена
      flag_door = 1;//устанавливаем флаг что дверь открыта
}

сам запутался... эх бывает

a2kuz
Offline
Зарегистрирован: 17.04.2017

как Вы и сказали 11пин  и земля между ними получается кнопка ( нормально разомкнутая)

d13lider
d13lider аватар
Offline
Зарегистрирован: 19.10.2015
// подключать считыватель + (МК) с пином 13 через резистор 4.7кОМ к нему же ( к пину  дату считывателя)
#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 3000 // сколько будет открыта дверь
#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;

//OneWire  ds(10);

void setup(void) {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(11, INPUT);
  digitalWrite(11,HIGH);
  
}

void loop(void) {
  byte key[8] = {0x1, 0xCC, 0x1D, 0xF0, 0x9, 0x0, 0x0, 0xB0}; // ключ
  byte addr[8];
  byte val = 0;

  if (ds.search(addr)) {
   for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;

   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))==LOW); //ТУТ ИЗМЕНИЛ СРАВНИТЕ РАЗНИЦУ МОЯ ОШИБКА!!!!!
  {
    open_door();//функция открытия двери
  }
  
}


void door()

{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, HIGH); //то закрываем ее
    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, LOW);//открываем дверь
      flag_buzzer = 1;//устанавливаем флаг что пищалка включена
      flag_door = 1;//устанавливаем флаг что дверь открыта
}

изменил строку 62

a2kuz
Offline
Зарегистрирован: 17.04.2017

все равно так же , пищит пишалка и ключ не срабатывает не каких реакции

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

Блин  Где-то ошибся ладно домой приеду разберусь сейчас просто уже не могу еду домой 

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

Измените у себя только 62 строку а не мой берите

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

В последнем варианте который вы прислали

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

// подключать считыватель + (МК) с пином 13 через резистор 4.7кОМ к нему же ( к пину дату считывателя)

#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 3000 // сколько будет открыта дверь
#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;

//OneWire  ds(10);

void setup(void) {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(11, INPUT);
  digitalWrite(11,HIGH);
  
}

void loop(void) {
  byte key[8] = {0x1, 0xCC, 0x1D, 0xF0, 0x9, 0x0, 0x0, 0xB0}; // ключ
  byte addr[8];
  byte val = 0;

  if (ds.search(addr)) {
   for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;

   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))==LOW); //ТУТ ИЗМЕНИЛ СРАВНИТЕ РАЗНИЦУ МОЯ ОШИБКА!!!!!
  {
    open_door();//функция открытия двери
  }
  
}


void door()

{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, HIGH); //то закрываем ее
    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, LOW);//открываем дверь
      flag_buzzer = 1;//устанавливаем флаг что пищалка включена
      flag_door = 1;//устанавливаем флаг что дверь открыта
}

Вот

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

 Не будет работать с ладно сейчас домой доеду и допишу нормально все будет Неудобно с телефона и за рулём

a2kuz
Offline
Зарегистрирован: 17.04.2017

без изминений  , пищит не срабатывает. и нет сигнала на магнит

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

// подключать считыватель + (МК) с пином 13 через резистор 4.7кОМ к нему же ( к пину дату считывателя)

#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 3000 // сколько будет открыта дверь
#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;

//OneWire  ds(10);

void setup(void) {
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(13, HIGH);
  pinMode(11, INPUT);
  digitalWrite(11,HIGH);
  
}

void loop(void) {
  byte key[8] = {0x1, 0xCC, 0x1D, 0xF0, 0x9, 0x0, 0x0, 0xB0}; // ключ
  byte addr[8];
  byte val = 0;

  if (ds.search(addr)) {
   for (byte i = 0; i < 8; i++) if (addr[i] == key[i]) val++;

   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))==LOW); //ТУТ ИЗМЕНИЛ СРАВНИТЕ РАЗНИЦУ МОЯ ОШИБКА!!!!!
  {
    open_door();//функция открытия двери
  }
  
}


void door()

{
  if  (millis() >= time_door + TIME_PERIOD_DOOR) //если прошло время которое задавали для двери
  {
    digitalWrite(DOOR, HIGH); //то закрываем ее
    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, LOW);//открываем дверь
      flag_buzzer = 1;//устанавливаем флаг что пищалка включена
      flag_door = 1;//устанавливаем флаг что дверь открыта
}

 

a2kuz
Offline
Зарегистрирован: 17.04.2017

 раскоментировал  //OneWire  ds(10);
ругается на 38 строку 'open_door' was not declared in this scope

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

все заработало:

#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 3000 // сколько будет открыта дверь
#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, 0xCC, 0x1D, 0xF0, 0x9, 0x0, 0x0, 0xB0}; // ключ
byte addr[8];
byte val = 0;

OneWire  ds(10);

void setup(void) {
  pinMode(DOOR, OUTPUT);
  digitalWrite(DOOR, HIGH);
  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 (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, HIGH); //то закрываем ее
    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, LOW);//открываем дверь
  flag_buzzer = 1;//устанавливаем флаг что пищалка включена
  flag_door = 1;//устанавливаем флаг что дверь открыта
}

 

a2kuz
Offline
Зарегистрирован: 17.04.2017

ДА!!! теперь все работает! Вот и готовый замок на электромагните. Может быть кому то и пригодится тоже .
Особая благодарность в помощи d13lider .

Вот картинка со схемой подключения (вроде нарисовал понятно)

Так же версия скетча который работает.

#include <OneWire.h>

#define TIME_PERIOD_BUZZER 200 //переодичность включения\выключения пищалки
#define TIME_PERIOD_DOOR 3000 // сколько будет открыта дверь
#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, 0xCC, 0x1D, 0xF0, 0x9, 0x0, 0x0, 0xB0}; // ключ
byte addr[8];
byte val = 0;

OneWire  ds(10);

void setup(void) {
  pinMode(DOOR, OUTPUT);
  digitalWrite(DOOR, HIGH);
  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 (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, HIGH); //то закрываем ее
    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, LOW);//открываем дверь
  flag_buzzer = 1;//устанавливаем флаг что пищалка включена
  flag_door = 1;//устанавливаем флаг что дверь открыта
}

 

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

Доброго времени суток. А подскажите как сюда прописать еще пару ключей? Замок собрал на замену почившему ВИЗИТУ, работает прекрасно. Вот ключи не могу добавить.

b707
Offline
Зарегистрирован: 26.05.2017

space пишет:

Доброго времени суток. А подскажите как сюда прописать еще пару ключей? Замок собрал на замену почившему ВИЗИТУ, работает прекрасно. Вот ключи не могу добавить.

Смотря как у вас с программированием.

Если понимаете - вместо одномерного массива key[8] организуйте двумерный массив keys[N][8], где N - число ключей. Забейте в него идентификаторы ключей, а в программе в цикле сравнивайте массив addr[] с каждым ключом из двумерного массива.

А если с программированием голяк - вам проще будет первый ключ скопировать в любом металлоремонте на новые болванки, чтобы все ключи имели одинаковый код.

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

Спасибо за подсказку. С программированием на 2 с плюсом. Но буду пробовать разбираться. Когда тебе за 50 как то трудновато дается изучение с нуля.

b707
Offline
Зарегистрирован: 26.05.2017

Думаю, способ с копированием ключей будет и проще, и правильней. В принципе, разные ключи нужны только в одном случае - если вы с их помощью хотите идентифицировать жильцов и, к примеру, вести запись кто когда пришел и ушел :)

А если это просто домофон - то проще всем ключам назначить один и тот же номер. На "секретность" это не влияет никак.

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

Да, я это уже понял. Собрал сейчас на НАНО копировальщик и записал 5 ключей. Но 4, хоть прибей, не хотят перезаписываться. Пока хватить и 5 шт. Буду изучать дальше, может получиться создать массив. Спасибо.

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

Прошу помощи. Как оказалось не так уж замок прекрасно работает Если к замку приложить "чужой" ключ на 3-5сек. то замок открывается, но потом "свой" ключ перестает открывать. После сброса "свой" ключ открывает замок. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Значить, ошибка где-то в логике, в коде.   Вангую, портица память массива правильных ключей.

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

Там всего один ключ записан.

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

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

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

space пишет:

Там всего один ключ записан.

Вот он и портица.  Код правил какнить, или тот же, 1 в 1 как в #39?

space
Offline
Зарегистрирован: 18.12.2016
#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 (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;//устанавливаем флаг что дверь открыта
}