Сигнализатор открытия двери (геркон)
- Войдите на сайт для отправки комментариев
Чт, 05/11/2020 - 19:28
Доброго времени . Подскажите не как не могу настроить програму что бы срабатывало без ошибок (ложных срабатываний и т.д.)
на двери в офисе стоит геркон ( в закрытом состоянии двери геркон замкнут ) . Необходимо что бы при открытии двери срабатывало реле (на нем будет стоять звонок ) на 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); //выключаем
}
}
Что говорит наука отладки для таких случаев ?
Вы можете написать сначала словами что Вам нужно. Чётко и поняно. А потом, прямо тут рядом со словами написать то же самое кодом? Пока же у Вас словами написано что-то невнятное, а код писался отдельно от слов, никакого отношения к ним не имеет и выглядит как бредовые галлюцинации.
Попробуйте для начала расписать словами, а потом прямо "под строкой" превратить слова в код. Давайте, посмотрим.
Что говорит наука отладки для таких случаев ?
Помалкивает
Сигнализацию делает...
Есть два варианта постановки на сигнализацию, с открытой дверью и с закрытой дверью, похоже хочет решить задачу постановки на сигнализацию с закрытой дверью )))
что то вроде сигнализации (но без постановки на охрану просто при каждом открытии двери нужно что бы один раз в момент открытия двери щелкнула реле ) дверь не просматривается и что бы посторонние не зашли незамеченными .
допустим на таком примере : при подаче на вход (4) постоянных +5в (то есть нажали фиксируемую кнопку ), нужно что бы на выходе (8) продолжительностью только на 3 сек появилось +5в , спустя каке то время допустим +-5 мин кнопку отжали сняв +5 с входа (4) спустя еще какое то время кнопку вновь зажали тем самым подав +5 в на пин (4) и снова на 3 сек на выходе (8) должны появиться 5в .
В магазинах для этого колокольчики на дверях висят. Можешь вместо язычка ардуину прицепить для технологичности.
И, я заметил, что слова ЕвгенияП восприняли как приглашение к оформлению заказа и начали излагать свои потребности (что нужно).
Он же предлагал написать русским языком инструкцию для МК - как и какие действия следует последовательно совершать для достижения цели: проверить вход, если да - активировать выход, подождать, повторить. И.т.д.
Здесь уже обсуждалась подобная проблема. Там основные траблы были с направлением движения. При выходе нет нужды звонить. решилась проблема вторым датчиком пересечения.
допустим на таком примере
Вы без "допустим" и без примера просто распишите логику работы строго и однозначно, а потом натяните на неё код *как я Вам советовал в #2). А тогда посмотрим, что у Вас получится и, может, чего ещё посоветуем.
Зачем Вы пришли за советом, если полученным советам не следуете?
А тут точно нужна целая ардуина? Одновибратор на 555 никак не спасет отца русской демократии?
А тут точно нужна целая ардуина? Одновибратор на 555 никак не спасет отца русской демократии?
ардуина в разы проще :)
Перемудрили...тут релейная логика. Чего там выдумывать:
loop(){
1. ПОКА контакт замкнут - сидим и ждем
2. Звоним 3 секунды (можно с delay())
3. ПОКА контакт разомкнут - сидим и ждем
}
Осталось на си перевести - там строк 5-7 будет.
Перемудрили...тут релейная логика. Чего там выдумывать:
loop(){
1. ПОКА контакт замкнут - сидим и ждем
2. Звоним 3 секунды (можно с delay())
3. ПОКА контакт разомкнут - сидим и ждем
}
Осталось на си перевести - там строк 5-7 будет.
3.
ПОКА контакт разомкнут - сидим и ждемНе обращаем внимания на состояние контакта, пока он снова не замкнется, после этого переходим к п.13.
ПОКА контакт разомкнут - сидим и ждемНе обращаем внимания на состояние контакта, пока он снова не замкнется, после этого переходим к п.1Попробуйте - и сильно удивитесь :)
Дверь могут держать открытой и 10 и 20 секунд, да и час...
Попробуйте - и сильно удивитесь :)
Дверь могут держать открытой и 10 и 20 секунд, да и час...
У меня с этим проблем нет ))
Но для общего случая я бы написал так:
void loop(void) { while(DigitalRead(kontakt)); tone(Buzzer,4000); delay(3000); noTone(Buzzer); while(!DigitalRead(kontakt)); }mykaida, чё буззер будет целых три секунды бузить? Его же успеют разбить за это время!
mykaida, чё буззер будет целых три секунды бузить? Его же успеют разбить за это время!
В ТЗ у ТС от 1 до 3 секунд. Я взял по максимуму :) А бузер надо в вандалозащищенном исполнении
А вот так 3 секунды или пока с-ки дверь не закроют:
void loop(void) { while(DigitalRead(kontakt)); tone(Buzzer,4000); lastMillis=millis(); while( (millis()-lastMillis<3000) || !DigitalRead(kontakt) ); //И никакого переполнения millis() noTone(Buzzer); while(!DigitalRead(kontakt)); }Благодарю за помощь !!))))
Работает как нужно :
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 небольшой задержкой ))
А вот так 3 секунды или пока с-ки дверь не закроют:
void loop(void) { while(DigitalRead(kontakt)); tone(Buzzer,4000); lastMillis=millis(); while( (millis()-lastMillis<3000) || !DigitalRead(kontakt) ); //И никакого переполнения millis() noTone(Buzzer); while(!DigitalRead(kontakt)); }Большое спасибо ))
Опять форум всё сделал.
Нахрен вообще напрягаться - пришел, понял, получил готовое.
Зато он ушел. Я потратил на это под самогончик минут 10, но в теме, я надеюсь, останутся вопросы программирования, а не эта шняга...
это же мелочи...вот к примеру я вчера часа два с одним сервером провозился, пока нашёл Микрософтовский косяк, эту информацию конечно не озвучишь, коммерция однако )))
PS не эксплуатация, инсталляция только
Зато он ушел.
Зато теперь увеличится поток таких как он, благодаря Вам.