Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

ТЕМА: Как увеличить время сигнала с датчика?

Как увеличить время сигнала с датчика? 21 янв 2015 11:38 #1

  • denisov1985@gmail.com
  • denisov1985@gmail.com аватар
  • Offline
  • Новый участник
  • Сообщений: 3
  • Репутация: 0
У меня следующая схема:
Ардуино уно, у него есть датчики - герконовый на открытие закрытие двери, датчик движения, газа и т д.
так же подключен модуль WiFi - ESP8266

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

Например:

sendWiFiData(jsonData); // эта функция отрабатывает не сразу 3-5 секунд обычно
val = digitalRead(Door_Sensor_Pin);
if (val == HIGH) {
  // двери открыты
  sendGSMAlert();
} else {
  // двери закрыты
}

Можно ли как-то сделать чтоб сигнал с датчика был еще как минимум 30 секунд после закрытия двери?
Например на датчике движения можно выставить сколько будет еще идти сигнал после срабатывания.
Последнее редактирование: 21 янв 2015 11:50 от denisov1985@gmail.com.
Администратор запретил публиковать записи гостям.

Как увеличить время сигнала с датчика? 21 янв 2015 11:44 #2

  • mszerg
  • mszerg аватар
  • Offline
  • Администратор
  • Сообщений: 526
  • Спасибо получено: 40
  • Репутация: 18
Что-то мне кажется что простого пути нет. В промышленной атоматике для решения данных колизий используются специальные протоколы, например modbus. И проблема как у вас решается на уровне этого протокола. Там есть очередь и ответ от сервера. Геркон будет слать сигнал пока не получит ответ от сервера что ок. Но тут надо отдельный контроллер под геркон.
Ну это ИМХО.
Администратор запретил публиковать записи гостям.

Как увеличить время сигнала с датчика? 21 янв 2015 12:29 #3

  • mszerg
  • mszerg аватар
  • Offline
  • Администратор
  • Сообщений: 526
  • Спасибо получено: 40
  • Репутация: 18
denisov1985@gmail.com пишет:
Можно ли как-то сделать чтоб сигнал с датчика был еще как минимум 30 секунд после закрытия двери?
Например на датчике движения можно выставить сколько будет еще идти сигнал после срабатывания.

Если вас устраивает принцип задержки как у датчике движения, то нужно идти по этому же пути.
У датчика движения есть своя обвязка которая позволяет делать такую задержку.
Поэтому датчик открытия двери нужно выносить на отдельный микроконтроллер и там писать задержку 30секунд и подавать сигнал на один из пинов. Этот сигнал передаете на ваш сервер (назовем его так) по одному проводу.
Администратор запретил публиковать записи гостям.

Как увеличить время сигнала с датчика? 21 янв 2015 12:47 #4

  • dimon_prihod
  • dimon_prihod аватар
Как по мне, так немного недостаточно данных по желаемому алгоритму обмена данными. В любом случае задержка на получение сигнала от датчика может достигнуть 1мин, поскольку данные считываются раз в мин. Работу герконового датчика нужно писать по принципу датчика движения. На сколько я понял тут вопрос в основном в программном обеспечении и алгоритму фиксирования сигнала.
Прошу более подробно описать алгоритм снятия сигнала с герконового датчика на ардуину и дальнейшую передачу на сервер.
Администратор запретил публиковать записи гостям.

Как увеличить время сигнала с датчика? 21 янв 2015 14:23 #5

  • denisov1985@gmail.com
  • denisov1985@gmail.com аватар
  • Offline
  • Новый участник
  • Сообщений: 3
  • Репутация: 0
int Door_Sensor_Pin = 6;
int val = 0; 
long previousMillis = 0;
long interval = 60000; 

void setup() {
  pinMode(Door_Sensor_Pin, INPUT);
}

void loop(){

  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    seldWiFiData(jsonData);
    // вот в этом месте может возникнуть ситуация что seldWiFiData долго отработала и дверь успели закрыть
  }

  val = digitalRead(Door_Sensor_Pin);
  if (val == HIGH) { 
    digitalWrite(Door_Led_Pin, LOW); 
  } else {
    digitalWrite(Door_Led_Pin, HIGH); 
  }
}

Задержка не достигает 1 минуты так как delay не используеться. Если законектится не вышло то конект отвалится по таймауту в течении 5 секунд и выполнение продолжиться. В данном алгоритме датчик срабатывает мгновенно, но раз в минуту, может возникнуть такая ситуация.
Мне надо чтоб digitalRead(Door_Sensor_Pin) возвращал HIGH еще в течении какого-то времени, чтоб программа успела считать значение (как это реализовано в датчике движения).
Последнее редактирование: 21 янв 2015 14:26 от denisov1985@gmail.com.
Администратор запретил публиковать записи гостям.

Как увеличить время сигнала с датчика? 21 янв 2015 14:50 #6

  • mszerg
  • mszerg аватар
  • Offline
  • Администратор
  • Сообщений: 526
  • Спасибо получено: 40
  • Репутация: 18
Попробуйте поэкспериментировать с прерываниями robocraft.ru/blog/arduino/45.html
Не уверен что поможет, но все же.

В теории оно запомнить состояние открытия двери, вопрос прервет ли оно выполнение функции seldWiFiData(jsonData) и во что это обернется.

С внешним контроллером надежнее. Можно и без контроллера там какой-то мультивибратор на простых радиодеталях сделать, но это уже тема форума по радиоэлектронике.
Администратор запретил публиковать записи гостям.

Как увеличить время сигнала с датчика? 21 янв 2015 15:20 #7

  • denisov1985@gmail.com
  • denisov1985@gmail.com аватар
  • Offline
  • Новый участник
  • Сообщений: 3
  • Репутация: 0
Не знал что в ардуине прерывания есть.
Спасибо, должно помочь поидее.
Администратор запретил публиковать записи гостям.