Умные туалет и ванная.

Araris
Offline
Зарегистрирован: 09.11.2012

Это славно.

Hamster
Offline
Зарегистрирован: 12.07.2015

Araris пишет:

У меня везде автоматика и ручное управление дублирируют друг друга. Простыми словами, контакты реле включены параллельно контактам ручного выключателя.  

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

Araris
Offline
Зарегистрирован: 09.11.2012

Hamster пишет:

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

Да, приблизительно так. "Посвященные" настенным выключателем не воспользуются, а человеку, попавшему впервые, проще привычно щелкнуть выключателем.

std
Offline
Зарегистрирован: 05.01.2012

После пыток два таймера родили мне дешёвый аналог датчика, в который можно втыкать китайские TSOPы, VS1838 например. Логика работы инверсная.

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

std пишет:

После пыток два таймера родили мне дешёвый аналог датчика, в который можно втыкать китайские TSOPы, VS1838 например. Логика работы инверсная.

тоже вариант,пробывал в процессе поиска )

Но остановился на своем, у меня излучающий ИК светодиод запитан через резистор от 5 вольт и все ,а приемник ИК фотодиод с кампаратором. При этом за год никаких ложных срабатываний не от чего , правда прямой солнечный свет в это место не попадает.

Villi
Offline
Зарегистрирован: 06.09.2015

avton, если не сложно, расскажите почему отказались от TSOP-ов?

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

Габариты ,отсутствие необходимости модулировать излучающий ИК светодиод. Не было смысла усложнять для конкретно моих условий.

Rick_KRD
Rick_KRD аватар
Offline
Зарегистрирован: 20.11.2015

Здравствуйте можно ли с вами пообщаться можно в ЛС на мперке в ВК или по почте. По поводу подсчета людей и автом. освещения

https://vk.com/madjon1990

madjon1990@mail.ru

http://forum.amperka.ru/members/%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D0%...

http://forum.amperka.ru/threads/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%...

Rick_KRD
Rick_KRD аватар
Offline
Зарегистрирован: 20.11.2015
Sleepy
Offline
Зарегистрирован: 24.12.2015

Доброго времени суток!

Хочу повторить опыт avton и собрать свои ИК датчики + atmega328 + nrf24l01, чтобы контролировать людей в той или иной комнате.

Мне бы схему датчика. Если есть в lay для Sprint Layout, то вообще шикарно будет :)

В первую очередь обращаюсь к  avton, но если у кого-то есть его труды или похожие схемы, то с удовольствие взгляну!

skalinas
Offline
Зарегистрирован: 13.01.2016

Добрый день!

Заказал датчики HC-SR501, поигрался с ними, выяснил. Время удержание минимальное порядка 5 секунд, а время сработки после отпускания порядка 2-5 секунд. Хотя датчик может быстро отрабатывать по движению. Посмотрев схему датчика, там стоит микросхема BISS0001, схема позволяет уменьшить время сработки датчика (тем самым сильно возрастает чувствительность) и время удержания. Пришлось допилить этот датчик, уменьшить сопротивление с 1 МОм до 10кОм между 5 и 6 ножками микросхемы (подпаял к ножкам микросхемы 10кОм), это увеличило скорость сработки датчика, пришлось уменьшить чувствительность до предела и что бы была направленность, вставить под линзу бумажную гильзу - обернуть датчик бумагой. К 4 и 5 ножкам микросхемы подпаял сопротивление 620Ом-1кОм, время отпускания уменьшилось до 0,5 секунды (при этом не будет работать регулировка времени), если нужна регулировка то паять нужно паралельно резистору R13.

Теперь можно применять HC-SR501 в проектах, где нужно быстродействие сработки на движение возле датчика.

Как можно вставить картинку с компа? 

 

Gres
Gres аватар
Offline
Зарегистрирован: 26.03.2013

skalinas пишет:

Как можно вставить картинку с компа? 

Сохранение картинок на форуме.

nzl
Offline
Зарегистрирован: 05.12.2015

Сделал привязку к таймеру прерывания для своего проекта, используя библиотеку  https://geektimes.ru/post/255770/ Код взял из сообщения http://arduino.ru/forum/proekty/umnye-tualet-i-vannaya?page=8#comment-76777 за Nec_32   большое спасибо. Так как  код от avton не всегда срабатывает. Датчики использую самые дешевые http://ru.aliexpress.com/item/1pcs-IR-Infrared-Obstacle-Avoidance-Sensor-Module-for-Arduino-Smart-Car-Robot-3-wire-Reflective-Photoelectric/32465285698.html две штуки выпаяв излучающий диод.

#include "leOS.h"
leOS myOS;

#define IR_SWITCH1_PIN 2   // pin connected to IR switch 1
#define IR_SWITCH2_PIN 3   // pin connected to IR switch 2
bool IR1_state_old = 0;
bool IR2_state_old = 0;
bool IR1_state_new = 0;
bool IR2_state_new = 0;
int Human_Counter_New = 0;

void setup() {
  pinMode(IR_SWITCH1_PIN, INPUT);
  pinMode(IR_SWITCH2_PIN, INPUT);
  myOS.begin();
  myOS.addTask(IR_state, 35); 

}

void loop() {}

void IR_state() {
  IR1_state_new = !digitalRead(IR_SWITCH1_PIN); 
  IR2_state_new = !digitalRead(IR_SWITCH2_PIN); 
  if (IR1_state_new != IR1_state_old || IR2_state_new != IR2_state_old)
  {
    if (IR1_state_new != IR1_state_old && IR2_state_new != IR2_state_old)
    {}
      else
      {
        if (IR2_state_new != IR2_state_old)
        {
          if (IR2_state_new == 1 && IR1_state_new == 1) Human_Counter_New++;
          if (IR2_state_new == 0 && IR1_state_new == 1) Human_Counter_New--;
        }
      }
    IR1_state_old = IR1_state_new;
    IR2_state_old = IR2_state_new;
  }
  if ( Human_Counter_New < 0 ) Human_Counter_New = 0;
}

 

Hamster
Offline
Зарегистрирован: 12.07.2015

nzl пишет:

... Так как  код от avton не всегда срабатывает....

Перейдите на работу с прерываниями - проблема исчезнет.

Использую такие же датчики как у Вас - расстояние между двумя приемниками за счет прерываний удалось у меньшить в разы. Сейчас у меня это расстояние порядка 20-25 мм, что вполне позволяет внедрить датчики в любую дверную коробку. Случаев несрабатывания не было замечено.

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

Код не мой,я об этом изначально говорил  . У меня светом рулит тини13 ,уже 1.5 года трудится,срабатывание 100% ) могу вечером померять расстояние между фотоприемниками. 

Hamster
Offline
Зарегистрирован: 12.07.2015

avton, о расстоянии можно судить по фото выше. но ведь работает же! как говорится - не мешай машине ездить ;-) у меня на Arduino Nano 3.0 (ATmega328) были пропуски фронтов от датчиков и на BeagleBone Black тоже. может в датчиках дело было... а может и в прокладке :-) вообщем, прерывания реально помогли сделать устройсво не глючным и компактным. Вы, кстати, не экспериментировали с максимальным расстоянием между ИК излучателем и приемником? На какую ширину проема можно поставить такие датчики интересно.

И еще вопрос. Может кто ставил аналогичное устройство на проем жилой комнаты. Имеются ложные срабатывания от пультов бытовых устройств. Как с этим бороться?

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

Hamster пишет:

Вы, кстати, не экспериментировали с максимальным расстоянием между ИК излучателем и приемником? На какую ширину проема можно поставить такие датчики интересно.

Нет,не было такой необходимости

DenVik
Offline
Зарегистрирован: 03.03.2016

Прочитал с самого начала и до последнего поста, пришел к выводу, что решения пока не найдено по поводу определения присутствия человека . Остается рассматривать алгоритмы во временном факторе.

Araris
Offline
Зарегистрирован: 09.11.2012

Прочитать всю тему - труд немалый, а вот с выводами не могу согласиться. Тут приведено множество рабочих вариантов, особенно хорош счётчик входящих/выходящих для дверного проёма (когда-нибудь я его таки реализую..). Не будьте столь пессимистичны, Вам достаточно лишь выбрать вариант под свою конкретику.

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

Туалет.

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

Ванная.

Коробка слева от двери, на правой стенке коробки инфракрасный дальномер, реагирует на вход/выход человека (кот его срабатывать так и не научился))), датчик движения срабатывает на движение человека и кота.

Алгоритм простейший :

1. Если сработал дальномер и затем в течение определённого периода времени сработал датчик движения - включаем свет.

2. Если сработал дальномер и затем в течение определённого периода времени нет сработки датчика движения - выключаем свет.

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

Andrey-S
Offline
Зарегистрирован: 02.01.2015

 Тему полностью не перечитывал, но решил спросить тут про такой момент, тем более в тему он залазит: вытяжной вентилятор по датчику влажности, делал кто-нибудь? Есть ли вообще в этом смысл или же лучше просто на выключатель посадить? 

Araris
Offline
Зарегистрирован: 09.11.2012

Я сделал, пользуюсь и нахожу в этом немалый смысл. Использую простейший датчик росы HDS10.

В процессе эксплуатации обнаружился только один важный нюанс - нормальный уровень влажности и, соответственно пороговый уровень включения/выключения вентиляции зависит от сезона. То есть летом в ванной (да и во всей квартире) влажность больше, зимой - меньше. Поэтому пороговый уровень включения/выключения вентиляции был сделан "плавающим" в течение длительного времени.

Ну а так фича весьма полезная. Кстати, на этом форуме есть несколько хороших тем, где автоматизация вытяжки по влажности подробно описана, найдите-почитайте, сомнения в её целесообразности отпадут.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Andrey-S пишет:

 Тему полностью не перечитывал, но решил спросить тут про такой момент, тем более в тему он залазит: вытяжной вентилятор по датчику влажности, делал кто-нибудь? Есть ли вообще в этом смысл или же лучше просто на выключатель посадить? 

Можете здесь посмотреть на Ардуино и на ESP8266

Работает по изменению влажности, поэтому не привязан к абсолютной влажности в квартире

Andrey-S
Offline
Зарегистрирован: 02.01.2015

 

Благодарю за ответы! Уже прочитал парочку тем... Буду думать, как сооружать.

DenVik
Offline
Зарегистрирован: 03.03.2016

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

ipua
Offline
Зарегистрирован: 20.02.2016

sav13 пишет:

Можете здесь посмотреть на Ардуино и на ESP8266

Работает по изменению влажности, поэтому не привязан к абсолютной влажности в квартире

Строю себе систему на базе OpenHab. У Вас нет желания добавить передачу даных на сервер по протоколу MQTT?

Пригодилось бы многим...

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

ipua пишет:

sav13 пишет:

Можете здесь посмотреть на Ардуино и на ESP8266

Работает по изменению влажности, поэтому не привязан к абсолютной влажности в квартире

Строю себе систему на базе OpenHab. У Вас нет желания добавить передачу даных на сервер по протоколу MQTT?

Пригодилось бы многим...

В принципе можно. Библиотеки готовые для ESP усть. Только пока не вижу, чем протокол MQTT люмена с сервером лучше HTTP ? С клиентом понятно, там приложения можные для телефонов. Но в облакен не хочу жить, нужно свой сервер IoT разворачивать/

glass_001
Offline
Зарегистрирован: 12.12.2015

  У меня счётчик вошедших / вышедших основан на этом

http://ru.aliexpress.com/item/1-pair-Waterproof-Single-Infrared-Beam-sensor-30-Photoelectric-Infrared-Barrier-Detector/32329398358.html

glass_001
Offline
Зарегистрирован: 12.12.2015

   Когда приёмник не видит луч, на нём замыкается реле. Подсчёт ведётся относительно времени замыкания / размыкания

int d2, d3, ir1, ir2, wayIn, wayOut, counter;
unsigned long d2m, d3m, ir1TimeOn, ir1TimeOff, ir2TimeOn, ir2TimeOff;


/* ir1 и ir2 переменные датчиков (1 - сработал, 0 - в ожидании); ir1TimeOn, ir1TimeOff, ir2TimeOn, ir2TimeOff; это время срабатывания датчиков и, соответственно время перехода в режим
    ожидания; wayIn, wayOut это направление движения; counter это количество людей, которые находятся на данный момент в комнате;
*/

void setup()
// put your setup code here, to run once:
{
  Serial.begin(9600);

  
  pinMode(2, INPUT);
  digitalWrite(2, HIGH); // включаем подтяжку вверх
  d2 = digitalRead(2);

  pinMode(3, INPUT);
  digitalWrite(3, HIGH); // включаем подтяжку вверх
  d3 = digitalRead(3);

  ir1 = 0;
  ir2 = 0;
  counter = 0;
  wayIn = 0;
  wayOut = 0;
}

void loop()

{

 
      // put your main code here, to run repeatedly:




    }

  }
  int tmp;

  tmp = digitalRead(2);

  if (tmp != d2) {
    if (millis() - 300 > d2m) {
      d2 = tmp; d2m = millis();

      if (d2 == 0)  // реле 1 замкнулось
      {
        ir1 = 1;
        ir1TimeOn = millis();  // считываем время
      }

      if (d2 == 1)  // реле 1 разомкнулось
      {
        ir1 = 0;
        ir1TimeOff = millis();  // считываем время
      }
    }



  }



  tmp = digitalRead(3);

  if (tmp != d3) {
    if (millis() - 300 > d3m) {
      d3 = tmp; d3m = millis();

      if (d3 == 0)       // реле 2 замкнулось
      {
        ir2 = 1;
        ir2TimeOn = millis();    // считываем время
      }
      if (d3 == 1)       // реле 2 разомкнулось
      {
        ir2 = 0;
        ir2TimeOff = millis();    // считываем время
      }
    }


  }
  if ((ir2TimeOn != 0) && (ir1TimeOn != 0) && (ir2TimeOff != 0) && (ir1TimeOff != 0))
  {
    if ((ir2TimeOn > ir1TimeOn) && (ir2TimeOff > ir1TimeOff))
    {
      wayOut = 1;
      counter -= 1;

      Serial.println(counter);
    }
    if ((ir1TimeOn > ir2TimeOn) && (ir1TimeOff > ir2TimeOff))
    {
      wayIn = 1;
      counter += 1;
      Serial.println(counter);
    }

    ir2TimeOn = 0;
    ir1TimeOn = 0;
    ir2TimeOff = 0;
    ir1TimeOff = 0;
    wayIn = 0;
    wayOut = 0;
    if (counter < 0)
    {
      counter = 0;
    }

  }




}

 

egg
Offline
Зарегистрирован: 07.04.2015

Подскажите как сделать проверку.

1 ультрасоник

сейчас сделанно так...

if (distance_sm>115&&distance_sm<125) //если растоянние от 115см. до 125см. то выключить
{
digitalWrite(rele1, 0);
} 
else
{
digitalWrite(rele1, 1);
delay(5000);
}

есть проблемма, иногда выпадает человек или приходят не верные расстояния. Отключается свет(моргает).

как сделать проверку? например если растояние равно if то проверить это еще 2-3 раза

 

P.S. если можно ваши примеры с ульрасоником в WC

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

byte counter = 0;     // счетчик измерений
byte maxCounter = 3;  // количество измерений
for (byte i = 0; i < maxCounter; i++)      // несколько раз измеряем расстояние
{
  if (0 == distance_sm) Serial.print("\tSONAR NOT DETECTED!");
  else Serial.print(dist);
  Serial.print(", ");
  if (distance_sm > 115 && distance_sm < 125) counter++;  // если расстояние от 115см. до 125см, то плюсуем счетчик
  delay(200);
}
Serial.println();
if (maxCounter == counter && distance_sm > 0) // если число срабатываний равно числу попыток, то выключить
{
  digitalWrite(rele1, LOW);
}
else
{
  digitalWrite(rele1, HIGH);
  delay(5000);
}

 

expo
Offline
Зарегистрирован: 13.04.2016

Прикрутил скетч от avton с некоторым количеством изменений к своему проходному коридору, соответственно количество датчиков увеличилось в два раза, и как следствие, имею периодические несрабатывания.

Чувствую, что нужно переделывать всё и пробовать прерывания, как советует Hamster, но как обойти ограничение в два пина для прерываний(у меня uno, а хочу все на nano пересадить)?

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

http://youtu.be/vJsYXyaeJpA

#define IR_SWITCH1_PIN 2   // pin connected to IR switch 1
#define IR_SWITCH2_PIN 3    // pin connected to IR switch 2
#define IR_SWITCH11_PIN 4   // pin connected to IR switch 1
#define IR_SWITCH22_PIN 5    // pin connected to IR switch 2

int ledPin = 12;
int photoPin = 0;

bool Dark=0;

bool IR1_state=0;
bool IR2_state=0;

bool IR11_state=0;
bool IR22_state=0;

bool IR1_already=0;
bool IR2_already=0;

bool IR11_already=0;
bool IR22_already=0;

bool IR1IR2_already=0;

bool IR11IR22_already=0;

int  IR1IR2_first=0;

int  IR11IR22_first=0;

int Human_Counter_New=0;

void setup()
{ 
  pinMode(IR_SWITCH1_PIN, INPUT);
  pinMode(IR_SWITCH2_PIN, INPUT);
  pinMode(IR_SWITCH11_PIN, INPUT);
  pinMode(IR_SWITCH22_PIN, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

  
void loop() 
{

// Serial.println(Dark);
// Serial.println(Human_Counter_New);

  IR1_state = digitalRead(IR_SWITCH1_PIN);
  IR2_state =  digitalRead(IR_SWITCH2_PIN);
  IR11_state = digitalRead(IR_SWITCH11_PIN);
  IR22_state =  digitalRead(IR_SWITCH22_PIN);

//===================Фотодиод=========================================
  if (analogRead(photoPin) < 380 ) //1-темно, 0-светло
  {
	  Dark=1;
  }
  else 
  {
	  Dark=0;
  }

//=============================ОБА ОТКРЫТЫ===Первая дверь=========================== 
 
     if (Dark && !IR1_state && !IR2_state && IR1IR2_already) //Если темно, датчики не перекрыты, сработывали оба датчика
    {
      if ( IR1IR2_first == 1) //Если был вход
      {
        Human_Counter_New++; 
      }
	  
      else { 
        Human_Counter_New--; 
           }
    IR1_already = 0;
    IR2_already = 0;
    IR1IR2_already = 0;
    IR1IR2_first = 0;
  }  

//=============================ОБА ОТКРЫТЫ===Вторая дверь=========================== 
 
     if (Dark && !IR11_state && !IR22_state && IR11IR22_already) 
									
    {
      if ( IR11IR22_first == 1)
      {
        Human_Counter_New++; 
      }
	  
      else { 
        Human_Counter_New--; 
           }
    IR11_already = 0;
    IR22_already = 0;
    IR11IR22_already = 0;
    IR11IR22_first = 0;
  } 

//=============================ОБА ОТКРЫТЫ=СВЕТЛО=ЕСТЬ ЛЮДИ===Первая дверь========================= 
 
     if (!Dark && Human_Counter_New >=1 && !IR1_state && !IR2_state && IR1IR2_already)
  {
       if ( IR1IR2_first == 1) 
      {
        Human_Counter_New++; 
      }
	  
      else { 
        Human_Counter_New--; 
           }
    IR1_already = 0;
    IR2_already = 0;
    IR1IR2_already = 0;
    IR1IR2_first = 0;
  }

//=============================ОБА ОТКРЫТЫ=СВЕТЛО=ЕСТЬ ЛЮДИ====Вторая дверь======================== 
 
     if (!Dark && Human_Counter_New >=1 && !IR11_state && !IR22_state && IR11IR22_already)
  {
       if ( IR11IR22_first == 1) 
      {
        Human_Counter_New++; 
      }
	  
      else { 
        Human_Counter_New--; 
           }
    IR11_already = 0;
    IR22_already = 0;
    IR11IR22_already = 0;
    IR11IR22_first = 0;
  }

  //=======вычитать всегда===Первая дверь==============
  
  if (!IR1_state && !IR2_state && IR1IR2_already)
  {
      if ( IR1IR2_first == 2) 
      {
         Human_Counter_New--; 
      }
    IR1_already = 0;
    IR2_already = 0;
    IR1IR2_already = 0;
    IR1IR2_first = 0;
  } 

  //=======вычитать всегда===Вторая дверь==============
  
  if (!IR11_state && !IR22_state && IR11IR22_already)
  {
      if ( IR11IR22_first == 2) 
      {
         Human_Counter_New--; 
      }
    IR11_already = 0;
    IR22_already = 0;
    IR11IR22_already = 0;
    IR11IR22_first = 0;
  }           


//=================================ВХОД====Первая дверь======================================
  
  if (IR1_state && !IR2_state) // IR1 on, IR2 off.
  {
    IR1_already = 1;      //значит сработал IR1 первым
    if ( !IR2_already ) { //Проверили IR2, что он не сработал
      IR1IR2_first = 1;   //1-значит вход, 2-выход 
    }
   }

//=================================ВХОД====Вторая дверь======================================
  
  if (IR11_state && !IR22_state) // IR11 on, IR22 off.
  {
    IR11_already = 1;
    if ( !IR22_already ) { 
      IR11IR22_first = 1; 
    }
   }

//=================================ВЫХОД====Первая дверь======================================
  
  if (!IR1_state && IR2_state)  // IR1 off, IR2 on.
  {
    IR2_already = 1;
    if ( !IR1_already ) { 
      IR1IR2_first = 2; 
   } 
  } 

//=================================ВЫХОД====Вторая дверь======================================
  
  if (!IR11_state && IR22_state)  // IR1 off, IR2 on.
  {
    IR22_already = 1;
    if ( !IR11_already ) { 
      IR11IR22_first = 2; 
   } 
  } 

 //=================================ОБА ПЕРЕКРЫТЫ===Первая дверь=======================================
  
 if (IR1_state && IR2_state) // IR1 on, IR2 on.
  {
    IR1IR2_already = 1; //1-Сработали оба датчика
  }
//=================================ОБА ПЕРЕКРЫТЫ====Вторая дверь======================================
  
 if (IR11_state && IR22_state) // IR1 on, IR2 on.
  {
    IR11IR22_already = 1;
  }
   //=================================ВКЛЮЧАТЕЛЬ==========================================
  
  if ( Human_Counter_New < 0 ) 
  { 
    Human_Counter_New = 0; 
  }
  
  if ( Human_Counter_New > 0)
  {
    digitalWrite(ledPin,HIGH);
  }
  else 
  {
    digitalWrite(ledPin,LOW);
  }
}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

expo пишет:
но как обойти ограничение в два пина для прерываний(у меня uno, а хочу все на nano пересадить)

а нет такого ограничения. Atmega328 имеет прерывания на каждом пине, просто пины 2 и 3 - особенные, их прерывания позволяют выводить даже из глубокого сна.

expo
Offline
Зарегистрирован: 13.04.2016

Hamster пишет:

Перейдите на работу с прерываниями - проблема исчезнет.

Использую такие же датчики как у Вас - расстояние между двумя приемниками за счет прерываний удалось у меньшить в разы. Сейчас у меня это расстояние порядка 20-25 мм, что вполне позволяет внедрить датчики в любую дверную коробку. Случаев несрабатывания не было замечено.

Не могли бы помочь с прерываниями?

Hamster
Offline
Зарегистрирован: 12.07.2015

const int IR_1_Pin = 3;  // external
const int IR_2_Pin = 2;  // internal
const int ledPin =  13; 

const byte toilet = 0;
const byte corridor = 1;


volatile int IR_1_State = LOW;
volatile int IR_2_State = LOW;
int state        = 0;

int people_count = 0;
int people_count_prev = 0;


void setup() {
  ...


  attachInterrupt(1, int_IR, CHANGE);  
  attachInterrupt(0, int_IR, CHANGE);
  pinMode(IR_1_Pin, INPUT);
  pinMode(IR_2_Pin, INPUT);
  ...


}


//////////////////////////////////////
void loop() {
//////////////////////////////////////


.....


  if (people_count_prev != people_count) {
    
    if ((people_count_prev == 0) && (people_count >= 1)) {
      // turn LED on:
      digitalWrite(ledPin, HIGH);
      ...
    }


    if ((people_count_prev >= 1) && (people_count == 0)) {
      // turn LED off:
      digitalWrite(ledPin, LOW);
      ...
    }
    
    people_count_prev = people_count;


  }


...


}


//////////////////////////////////////
void int_IR() {
//////////////////////////////////////
  int state_curr   = 0; 
  
  IR_1_State = ! (digitalRead(IR_1_Pin)); // ext
  IR_2_State = ! (digitalRead(IR_2_Pin)); // int


  state_curr = ((IR_1_State << 1) | IR_2_State); 

  switch (state) {
    case 0:   // ожидание 
              if (state_curr == B01) { state = 100; }
              if (state_curr == B10) { state = 200; }
              break;
    case 100: // выходит  
              if (state_curr == B11) { state = 300; }
              if (state_curr == B10) { state = 0; }
              if (state_curr == B00) { state = 0; }
              break;
    case 200: // входит
              if (state_curr == B11) { state = 400;
                                       if (people_count == 0) {cmd_fading[toilet] = cmd_fade_inc;} }
              if (state_curr == B01) { state = 0; }
              if (state_curr == B00) { state = 0; }
              break;
    case 300: // на пороге выходит
              if (state_curr == B10) { state = 500; }
              if (state_curr == B01) { state = 100; }
              if (state_curr == B00) { state = 0; }
              break;
    case 400: // на пороге входит
              if (state_curr == B01) { state = 600; }
              if (state_curr == B10) { state = 200; 
                                       if (people_count == 0) {cmd_fading[toilet] = cmd_fade_dec;}
              }
              if (state_curr == B00) { state = 0; }
              break;
    case 500: // вышел
              if (state_curr == B00) { 
                if (people_count > 0){
                                       if (people_count == 1){ cmd_fading[toilet] = cmd_fade_dec; }
                                       people_count = people_count - 1;}
                state = 0;
              }
              if (state_curr == B11) { state = 300; }
              if (state_curr == B01) { state = 0; }
              break;
    case 600: // вошел
              if (state_curr == B00) { state = 0;
                                       people_count = people_count + 1; }
              if (state_curr == B11) { state = 400; }
              if (state_curr == B10) { state = 0; }
              break;
    default:
              state = 0;  
  }


  event_msg = true; // лог


}

 

Hamster
Offline
Зарегистрирован: 12.07.2015

Привел только основные моменты программы.

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

Удачи!

expo
Offline
Зарегистрирован: 13.04.2016

Hamster пишет:

Привел только основные моменты программы.

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

Удачи!

 

Спасибо огромное, пытаюсь вникнуть и сразу вопрос возникает:

Перекрыли первый датчик, сработало прерывание, начал исполняться void int_IR, а дальше перекрывается второй датчик и, как я понимаю, должен вновь вызваться void int_IR с дефолтными значениями переменных. Как вы это победили я не могу понять.

egg
Offline
Зарегистрирован: 07.04.2015

Спасибо Tomasina !!! это было очень полезно, но почему то при выводе если первое значение скажем было 3см то и последующие 2 проверки выдаёт 3см даже если менять растояние до припятсвия постоянно.

Возможно ли: если число срабатываний равно числу попыток, проверить повтороно столько же раз и если равно, то выключить? Просто хотелось уменьшить задержку в 5 секунд. Неудобно при в ходе в WC

Спасибо!!!

Hamster
Offline
Зарегистрирован: 12.07.2015

Дефолтные значения глобальных переменных задаются при первом старте программы, далее их значение может быть любое.
В моем случае, состояние автомата хранится в глобальной переменной state. При каждом последующем прерывании изменяется его текущее состояние. При достижении автоматом нужного состояния взводится какой либо флаг, который обрабатывается в основном цикле программы. В данном случае это переменная people_count.

s0r0ka
Offline
Зарегистрирован: 05.04.2016

Уважаемый Araris, а на pir датчике hc-sr501 неудалось подсчитать зашли или ушли? я тут подцепил осцилограф к 12 ножке и чета ничего непойму на любое движение одинаковый сигнал на ножке. Проблема такаяже необходимо считать сколько народа в комнате и включать или выключать свет.

 

Araris
Offline
Зарегистрирован: 09.11.2012

Конечно же не удалось, HC-SR501 ведь ничего не сообщает о направлении движения (к сожалению (( ), он именно выдаёт "на любое движение одинаковый сигнал на ножке". Рабочие варианты, как считать народ в комнате, в этой теме уже описаны.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

s0r0ka пишет:
Проблема такаяже необходимо считать сколько народа в комнате и включать или выключать свет.

Типа четное число народу - включить, нечетное - выключить... смотри не перепутай! )

Почему не воспользоваться просто датчиком присутствия? ведь невозможно быть уверенным что посчитал всех, может трое зашли в обнимку - свет включили, а потом один вышел и что? ааа, ну правильно вышел третий лишний - выключаем...

Sherzod
Offline
Зарегистрирован: 17.04.2016

Araris, можете привести свой код подсчета количество вошедших и вышедших людей?

Araris
Offline
Зарегистрирован: 09.11.2012

У меня своего такого кода нет, поскольку я подсчётом входящих/выходящих людей не пользуюсь. Поищите в этой теме, либо посмотрите здесь - http://arduino.ru/forum/proekty/datchik-napravleniya-dvizheniya

lean_74
Offline
Зарегистрирован: 22.12.2015

Araris пишет:

Hamster пишет:

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

Да, приблизительно так. "Посвященные" настенным выключателем не воспользуются, а человеку, попавшему впервые, проще привычно щелкнуть выключателем.

можно включить так:

http://www.trudolyb.ru/obustrojstvo-i-remont/29-prohodnoy-vykluchatel

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

Hamster
Offline
Зарегистрирован: 12.07.2015

lean_74 пишет:

Araris пишет:

Hamster пишет:

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

Да, приблизительно так. "Посвященные" настенным выключателем не воспользуются, а человеку, попавшему впервые, проще привычно щелкнуть выключателем.

можно включить так:

http://www.trudolyb.ru/obustrojstvo-i-remont/29-prohodnoy-vykluchatel

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

В этом случае МК должен знать состояние настенного выключателя, либо контролировать фазу на нагрузке, т.к. в зависимости от положения выключателя логика работы реле будет меняться.

b0rman
Offline
Зарегистрирован: 26.05.2016

Добрый день! Делаю счетчик зашедших в помещение человек.

реализую всё с помощью инфракрасного светодиода и двух ик приемников http://amperka.ru/product/troyka-ir-receiver.

Столкнулся с проблемой:

Если ик светодиод горит постоянно, фотодиод ловит его только на очень близком расстоянии. Если использовать быстрое мигание то всё работает на приличном расстоянии но появляются ложные срабатывания.

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

Sherzod
Offline
Зарегистрирован: 17.04.2016

Думаю реализовать подсчет кол-во вход/выход людей с помощью ИК. Какие надо использовать? И какая схема должна быть?

Sherzod
Offline
Зарегистрирован: 17.04.2016

avton пишет:

Всем здравствуйте

alexanderkraydu  попробывал с этими датчика http://www.ebay.com/itm/331094652223?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649  и этими лазерами http://www.ebay.com/itm/261455287631?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649  скетч уважаемого Araris ,работают прекрасно. Завтра будут натурные испытания на дверном проеме ванной :)

По первой ссылке товара уже нет. Можете написать другую ссылку или наименование датчика? Как я понял это был приемник лазера. Если так, то можно ли использовать обычный фоторезистор для этого?

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

http://ru.aliexpress.com/item/1pcs-IR-Infrared-Obstacle-Avoidance-Sensor...

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

Sherzod
Offline
Зарегистрирован: 17.04.2016

avton пишет:

http://ru.aliexpress.com/item/1pcs-IR-Infrared-Obstacle-Avoidance-Sensor...

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

Типа так? Излучающий светодиод темный который? Какая дальность передачи-приемки? Дверной проем где то 80 см