Сигнализатор открытия двери (геркон)

SultanRR
Offline
Зарегистрирован: 03.01.2019

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

на двери в офисе стоит геркон ( в закрытом состоянии двери геркон замкнут ) . Необходимо что бы при открытии двери срабатывало реле (на нем будет стоять звонок ) на 1-3 сек и отключилось , и только при следующем открытии двери сработало вновь 

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

uint32_t  myTimer1; 

#define RELE1 8



void setup() {
  Serial.begin(115200);
  pinMode (RELE1, OUTPUT);
  pinMode (4, INPUT_PULLUP);
  digitalWrite(RELE1, LOW);
}

void loop() {
 
if(digitalRead(4) == 1)          // датчик окрытия двери 1 и запуск реле 1 , желтый провод
  {digitalWrite(RELE1, HIGH);
  myTimer1 = millis();
  }

  if (millis() - myTimer1 > 2000)  
  {digitalWrite(RELE1,  LOW);
  myTimer1 += 2000;
  }
}

 

а тут реле при открытой двери стробит  с переодичностью в 4 сек :

#define ledPin1 8  //Реле 1 - управление

byte valA; //переменная времени 
byte flagA;
long previousMillisA = 0;

void setup()    
{ 

  pinMode(ledPin1, OUTPUT);
} 
void loop() 

{ 
  
 if(digitalRead(2)==HIGH)//если кнопка нажата ... 
  { 
    flagA=1;
    
  }
  if(flagA==1)
  {

    if (millis() -previousMillisA >4000) 
    { 
      previousMillisA = millis();     
      valA++;                      
      digitalWrite(ledPin1,HIGH); 
    } 
  } 

  if(valA>=2) 
  { 
    digitalWrite(ledPin1,LOW);


  }
  if(digitalRead(2)==LOW)//если кнопка не нажата ... 
  { 
    flagA=0;
    digitalWrite(ledPin1,LOW); //выключаем 
     
  } 

}

 

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Что говорит наука отладки для таких случаев ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы можете написать сначала словами что Вам нужно. Чётко и поняно. А потом, прямо тут рядом со словами написать то же самое кодом? Пока же у Вас словами написано что-то невнятное, а код писался отдельно от слов, никакого отношения к ним не имеет и выглядит как бредовые галлюцинации.

Попробуйте для начала расписать словами, а потом прямо "под строкой" превратить слова в код. Давайте, посмотрим.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dmitron1036 пишет:

Что говорит наука отладки для таких случаев ?

Помалкивает

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Сигнализацию делает...
Есть два варианта постановки на сигнализацию, с открытой дверью и с закрытой дверью, похоже хочет решить задачу постановки на сигнализацию с закрытой дверью )))

SultanRR
Offline
Зарегистрирован: 03.01.2019

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

допустим на таком примере  : при подаче на вход (4) постоянных +5в (то есть нажали фиксируемую кнопку ), нужно что бы на выходе (8) продолжительностью только на 3 сек появилось +5в ,  спустя каке то время допустим +-5 мин  кнопку отжали сняв +5 с входа (4)  спустя еще какое то время кнопку вновь зажали тем самым подав +5 в на пин (4) и снова на 3 сек на выходе (8) должны появиться 5в .

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

В магазинах для этого колокольчики на дверях висят. Можешь вместо язычка ардуину прицепить для технологичности.

И, я заметил, что слова ЕвгенияП восприняли как приглашение к оформлению заказа и начали излагать свои потребности (что нужно).

Он же предлагал написать русским языком инструкцию для МК - как и какие действия следует последовательно совершать для достижения цели: проверить вход, если да - активировать выход, подождать, повторить. И.т.д.

nik182
Offline
Зарегистрирован: 04.05.2015

Здесь уже обсуждалась подобная проблема. Там основные траблы были с направлением движения. При выходе нет нужды звонить. решилась проблема вторым датчиком пересечения.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

SultanRR пишет:

допустим на таком примере  

Вы без "допустим" и без примера просто распишите логику работы строго и однозначно, а потом натяните на неё код *как я Вам советовал в #2). А тогда посмотрим, что у Вас получится и, может, чего ещё посоветуем.

Зачем Вы пришли за советом, если полученным советам не следуете?

vk007
Offline
Зарегистрирован: 16.06.2015

А тут точно нужна целая ардуина? Одновибратор на 555 никак не спасет отца русской демократии?

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

vk007 пишет:

А тут точно нужна целая ардуина? Одновибратор на 555 никак не спасет отца русской демократии?

ардуина в разы проще :)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Перемудрили...тут релейная логика. Чего там выдумывать:

loop(){

1. ПОКА контакт замкнут - сидим и ждем

2. Звоним 3 секунды (можно с delay())

3. ПОКА контакт разомкнут - сидим и ждем

}

Осталось на си перевести - там строк 5-7 будет.

v258
Offline
Зарегистрирован: 25.05.2020

mykaida пишет:

Перемудрили...тут релейная логика. Чего там выдумывать:

loop(){

1. ПОКА контакт замкнут - сидим и ждем

2. Звоним 3 секунды (можно с delay())

3. ПОКА контакт разомкнут - сидим и ждем

}

Осталось на си перевести - там строк 5-7 будет.

3. ПОКА контакт разомкнут - сидим и ждем Не обращаем внимания на состояние контакта, пока он снова не замкнется, после этого переходим к п.1

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

v258 пишет:

3. ПОКА контакт разомкнут - сидим и ждем Не обращаем внимания на состояние контакта, пока он снова не замкнется, после этого переходим к п.1

Попробуйте - и сильно удивитесь :)

Дверь могут держать открытой и 10 и 20 секунд, да и час...

v258
Offline
Зарегистрирован: 25.05.2020

mykaida пишет:

Попробуйте - и сильно удивитесь :)

Дверь могут держать открытой и 10 и 20 секунд, да и час...

У меня с этим проблем нет ))

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Но для общего случая я бы написал так:


void loop(void) {
        while(DigitalRead(kontakt));
        tone(Buzzer,4000);
        delay(3000);
        noTone(Buzzer);
       while(!DigitalRead(kontakt));
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mykaida, чё буззер будет целых три секунды бузить? Его же успеют разбить за это время!

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ЕвгенийП пишет:

mykaida, чё буззер будет целых три секунды бузить? Его же успеют разбить за это время!

В ТЗ у ТС от 1 до 3 секунд. Я взял по максимуму :) А бузер надо в вандалозащищенном исполнении

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А вот так 3 секунды или пока с-ки дверь не закроют:

void loop(void) {
        while(DigitalRead(kontakt));
        tone(Buzzer,4000);
        lastMillis=millis();
        while( (millis()-lastMillis<3000) || !DigitalRead(kontakt) ); //И никакого переполнения millis()
        noTone(Buzzer);
       while(!DigitalRead(kontakt));
}

 

SultanRR
Offline
Зарегистрирован: 03.01.2019

Благодарю за помощь !!))))

Работает как нужно :

unsigned long lastMillis; 

#define RELE1 8

void setup() {
  Serial.begin(115200);
  pinMode (RELE1, OUTPUT);
  pinMode (4, INPUT_PULLUP);   //INPUT_PULLUP
  digitalWrite(RELE1, LOW);
}
 
void loop(void) {
   while(digitalRead(4)==0);
   digitalWrite(RELE1, HIGH);
   lastMillis=millis();
   while( (millis()-lastMillis<3000));
   digitalWrite(RELE1, LOW);
   while(!digitalRead(4)==0);
}

на основе этого кода еще доделаю старую программу в которой нужно с rc pir  датчика движения включать свет и держать его включенным   до прекращения движения c небольшой задержкой ))

SultanRR
Offline
Зарегистрирован: 03.01.2019

mykaida пишет:

А вот так 3 секунды или пока с-ки дверь не закроют:

void loop(void) {
        while(DigitalRead(kontakt));
        tone(Buzzer,4000);
        lastMillis=millis();
        while( (millis()-lastMillis<3000) || !DigitalRead(kontakt) ); //И никакого переполнения millis()
        noTone(Buzzer);
       while(!DigitalRead(kontakt));
}

 

Большое спасибо ))

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

Опять форум всё сделал.

Нахрен вообще напрягаться - пришел, понял, получил готовое.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

sadman41 пишет:
Опять форум всё сделал. Нахрен вообще напрягаться - пришел, понял, получил готовое.

Зато он ушел. Я потратил на это под самогончик минут 10, но в теме, я надеюсь, останутся вопросы программирования, а не эта шняга...

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

sadman41 пишет:
Опять форум всё сделал. Нахрен вообще напрягаться - пришел, понял, получил готовое.

это же мелочи...вот к примеру я вчера часа два с одним сервером провозился, пока нашёл Микрософтовский косяк, эту информацию конечно не озвучишь, коммерция однако )))
PS не эксплуатация, инсталляция только

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

mykaida пишет:

sadman41 пишет:
Опять форум всё сделал. Нахрен вообще напрягаться - пришел, понял, получил готовое.

Зато он ушел. 

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