open_door();//вынесли этот фрагмент в отдельную функцию
34
}
35
ds.reset_search();
36
}
вот в этих строках у вас val постоянно набирается, а нигде не обнуляется. надо давать какое то время на обработку, если времся превышено, то сбросить val в 0
или делать так, if (addr[i] != key[i]) val = 0;т.е. последовательность ключа не совпала, то прерываем функцию пока весь ключ не пройдет как положено символ за символом
#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;//устанавливаем флаг что дверь открыта
}
#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;//устанавливаем флаг что дверь открыта
}
#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;//устанавливаем флаг что дверь открыта
}
#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;//устанавливаем флаг что дверь открыта
}
Спасибо. Пока все четко работает. Пока менять ничего не буду. Буду изучать. Хочу все таки создать массив. Тогда и внесу все предложенные изменения. Есть еще 4 ключа которые не перезаписываются. Выкинуть ключи - "не наш метод". Еще раз спасибо за то, что помогли быстро решить проблему.
хахах)) да он для тебя, меня и еще 10 людям на форуме с первого взгляда понятен)), а человек который логически рассуждал в одну сторону, в лоб, ему предлагают обойти другим путем, не объяснив причины, может не допереть так сразу, и для него будет казатся что его путают) вот и все
Спасибо. Пока все четко работает. Пока менять ничего не буду. Буду изучать. Хочу все таки создать массив. Тогда и внесу все предложенные изменения. Есть еще 4 ключа которые не перезаписываются. Выкинуть ключи - "не наш метод". Еще раз спасибо за то, что помогли быстро решить проблему.
да не за что, захотите вносить ключи в энергонезависимую память, смогу объяснить, П.С. что бы появилась возможность добавлять ключи не подключая даже к компьютеру, просто нравится мне такая тема) и мне будет интересно подсказать, реализовать
Да код правил, у меня электромеханический замок. Нужно, что бы питание на магнит поступало когда ключ приложен к лузе.
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
или делать так, if (addr[i] != key[i]) val = 0;т.е. последовательность ключа не совпала, то прерываем функцию пока весь ключ не пройдет как положено символ за символом
Здесь я ничего не правил, все как в 39 посте. Помогите пожалуста поправить код. Домофон уже собран, хочется довести до ума.
Вместо строки:
32
if
(val == 8)
Вставить:
if (addr[i] != key[i]) val = 0;
Так?
не понятно) за вас доделать)
Выдает ошибку при компилляции
'i' was not declared in this scope
а блин, не учел
Теперь не видит "свой" ключ тоже.
а так?
или вот так лучше даже будет
Докрутился, провод в лузе оторвал. Последний скетч, все отлично. "Чужой" не видит (держал 30сек) "свой" видит четко. Еще погоняю и отпишусь.
замените еще 38 строку с
if
(addr[0] == 0x1)
наif
(addr[0] ==
key[0])тогда вся вот эта хрень
уложица в
но, возможно понадабица приведение типа в ds.search(addr)
да, так симпотичнее, но я пытался показать почему не работает тот код, а не полностью менять еще более запутывать человека
хорошо, я отменил свой "запутанный" код
Спасибо. Пока все четко работает. Пока менять ничего не буду. Буду изучать. Хочу все таки создать массив. Тогда и внесу все предложенные изменения. Есть еще 4 ключа которые не перезаписываются. Выкинуть ключи - "не наш метод". Еще раз спасибо за то, что помогли быстро решить проблему.
хорошо, я отменил свой "запутанный" код
хахах)) да он для тебя, меня и еще 10 людям на форуме с первого взгляда понятен)), а человек который логически рассуждал в одну сторону, в лоб, ему предлагают обойти другим путем, не объяснив причины, может не допереть так сразу, и для него будет казатся что его путают) вот и все
Спасибо. Пока все четко работает. Пока менять ничего не буду. Буду изучать. Хочу все таки создать массив. Тогда и внесу все предложенные изменения. Есть еще 4 ключа которые не перезаписываются. Выкинуть ключи - "не наш метод". Еще раз спасибо за то, что помогли быстро решить проблему.
да не за что, захотите вносить ключи в энергонезависимую память, смогу объяснить, П.С. что бы появилась возможность добавлять ключи не подключая даже к компьютеру, просто нравится мне такая тема) и мне будет интересно подсказать, реализовать
Да. Это было бы лучше без компа. Если есть время и возможность. Буду благодарен.