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

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

Araris пишет:

КО подсказывает, что ему не нравится отсутствие библиотеки SimpleTimer. Гугл подсказывает, что ее можно взять, например, здесь : http://playground.arduino.cc/Code/SimpleTimer

спасибо,все получилось. Жаль с радиосвязью у меня в квартире проблема,бермудский треугольник :)) . И на 433 и на 2.4 Ггц  дальность метра 3 )

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

О_о. Wi-Fi в квартире имеется ? Работает ?

На 433 МГц-модули антенны хорошие паяли ?

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

Araris пишет:

О_о. Wi-Fi в квартире имеется ? Работает ?

На 433 МГц-модули антенны хорошие паяли ?

имеется конечно,он кстати тоже дальностью не блещет. Антенны пробывал разные и четверть волновые и даже такие  https://yadi.sk/d/FD4q15qxTqpbV . Будем разбираться ,очень похоже на то ,что рядом что то сильно фонит во всем дипазоне...  Рядом дом ,в котором находиться ЖЭК и на крыше антенна диспетчерской:)

https://www.dropbox.com/s/ndry352qjuqeq2u/2014-06-18%2010.06.37.jpg

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

На счет Wi-Fi, для Андроида есть неплохая прога Wifi Analyzer, позволяет посмотреть занятые каналы. Во всяком случае мне дома помогло разнести 5ГГц на разные каналы, чтобы с соседом не пересекаться. Смотрит 5 и 2,4ГГц диапазоны, удобно.

 

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

kisoft пишет:

На счет Wi-Fi, для Андроида есть неплохая прога Wifi Analyzer, позволяет посмотреть занятые каналы. Во всяком случае мне дома помогло разнести 5ГГц на разные каналы, чтобы с соседом не пересекаться. Смотрит 5 и 2,4ГГц диапазоны, удобно.

 

да знаю,спасибо.Свою точку доступа уже давно перестроил на более свободный канал....

Пытаюсь разобраться с прерываниями в скетче,пока не очень получается :)

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

Всем здравствуйте! Помогите разобраться с кодом,напрвтев нужное русло . Устройство- защита от протечки воды. Все в принципе работает как хотелось,за исключение одной детали. Не могу заставить срабатывать реле только на 4 секунды.

При нажатие  кнопки "закрыть"  загорается светодиод "closeLed" и срабатывает реле "closeRele" .На текущий момент рле работает синхронно вместе со светодиодом,а хотелось бы чтобы оно срабатывало только на 4 секунды..  

Не судиде строго - первый скетчь :)

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

const int alarmLed =6; // индикатор "протечка"
const int openLed =4; // индикатор состояния "открыто"
const int closeLed=5; // индикатор состояния "закрыто"
const int openRele=3; // реле закрытия крана
const int closeRele=12; // реле открытия крана
const int openButton=10; // кнопка "Открыть" кран
const int closeButton=11; // кнопка "Закрыть" кран
const int resetButton=2; //  кнопка "Сброс" протечки
const int leaksensor=8; // датчик протечки,при срабатывание на входе LOW
bool openState=0;
bool opS=0;
bool lastopenState=0;
bool closeState=0;
bool lastcloseState=0;
bool clS=0;
bool leakState = 0;
bool lastleakState = 0;
bool resetState=0;
bool lastresetState=0;

int buttonPushCounter = 0; 
int leakCounter=0;
int ledState = LOW;             
long previousMillis = 0;        
long interval = 500;  

void setup() {
  pinMode(alarmLed,OUTPUT);
  pinMode(openLed,OUTPUT);
  pinMode(closeLed,OUTPUT);
  pinMode(openRele,OUTPUT);
  pinMode(closeRele,OUTPUT);
  pinMode(openButton, INPUT);
  pinMode(closeButton, INPUT);
  pinMode(resetButton, INPUT);
  pinMode(leaksensor, INPUT);
  Serial.begin(9600);
}
void loop(){
  leakState=digitalRead(leaksensor);
  leakState=!leakState;
  if (leakState != lastleakState) {
    if (leakState == HIGH) {
      leakCounter=1;
      Serial.println("LEAK");
    }
    lastleakState = leakState;
  }

  if  (leakCounter==1){
    digitalWrite(alarmLed, ledState);
    clS=1;
    opS=0;

  } 
  else {
    digitalWrite(alarmLed, LOW);

  }
  openState = digitalRead(openButton);
  if (openState != lastopenState) {

    if ((openState == HIGH)&&(leakCounter==0)) {
      opS=1;
      clS=0;
      Serial.println("OPEN");

    }

    lastopenState = openState; 
  }


  closeState = digitalRead(closeButton);
  if (closeState != lastcloseState) {

    if (closeState == HIGH) {
      opS=0;
      clS=1;
      Serial.println("CLOSE");
    }

    lastcloseState = closeState;
  }

  if (opS==1){
    digitalWrite(openLed, HIGH);
    digitalWrite(openRele, HIGH);

  }
  else {
    digitalWrite(openLed, LOW);
    digitalWrite(openRele, LOW);
  }

  if (clS==1){
    digitalWrite(closeLed, HIGH);
    digitalWrite(closeRele, HIGH);
  }
  else {
    digitalWrite(closeLed, LOW);
    digitalWrite(closeRele, LOW);
  }


  resetState = digitalRead(resetButton);
  if (resetState != lastresetState) {

    if (resetState == HIGH) {
      leakCounter=0;
      Serial.println("RESET");
    }
    lastresetState = resetState;
  }
  if ( leakCounter==1)
  { 
    tone(9, 600, 150);
    delay(300);
  }

  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;   

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
  }
}

 

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

avton пишет:

Не судиде строго

Узбагойзя ))) 

Я пытался понять Ваш код, но ниасилил, простите. Как-то все излишне сложно и запутанно мне показалось.

Давайте лучше я "на пальцах" идею расскажу.

1. Заводим переменную unsigned long RelayState = 0;

2. Если нужно включить реле, присваиваем RelayState = millis();

3. Если не нужно включить реле, присваиваем RelayState = 0;

4. Чтобы реле срабатывало только на interval миллисекунд, делаем проверку

if  ( (RelayState > 0)  &&  (millis() -  RelayState <= interval) ) { держим включенным }

else { держим выключенным }

Попробуйте сами, если что обращайтесь.

   

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

Знаю что запутанно,но пока хоть так :)

Спасибо,попробую,отпишусь потом.

Как все получится,будем урезать лишнее.

P.S. По поводу света в ванной: данный вариант датчиков работает отлично,но иногда хромает обработка :)

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

Araris пишет:

3. Если не нужно включить реле, присваиваем RelayState = 0;

Тут правильнее 

3. Если нужно выключить реле, не дожидаясь истечения интервала, присваиваем RelayState = 0;

А если никаких действий с реле не нужно, то RelayState не трогаем совсем.

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

Araris я правильно понял понял что Вы имели в виду это 

#define ledPin 3   
#define buttonPin 10 
unsigned long previousMillis = 0;      
unsigned long interval = 4000;         

void setup() 
{
  pinMode(ledPin, OUTPUT);     
  pinMode( buttonPin, INPUT);
}

void loop()
{
  delay(10);
  if (digitalRead(buttonPin) == HIGH)
  {
    digitalWrite(ledPin, HIGH);
    previousMillis = millis(); 
  }
  if(previousMillis && (millis()-previousMillis >= interval)) 
  {
    digitalWrite(ledPin, LOW);
    previousMillis = 0;
  }
}

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

Видимо я всё таки не понимаю ещё до конца..

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

avton пишет:

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

Да Вы затейник... В этом случае надо "ловить" не событие нажатия кнопки, а событие изменения ее состояния.

1. Заводим переменные для сохранения нового и предыдущего состояний кнопки.

boolean new_button_state = false;

boolean old_button_state = false;

2. Вместо строк 15-18 можно как-то так :

new_button_state = digitalRead(buttonPin);

if ( (new_button_state != old_button_state) && new_button_state ) // состояние кнопки изменилось и оно стало HIGH
 {
 digitalWrite(ledPin, HIGH);

 previousMillis = millis();
 old_button_state = new_button_state; // сохраняем изменения

 } 

3. В этом случае при удержании кнопки не будет постоянно обновляться previousMillis, чего мы и желали.

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

я думал об этом ,но не попробывал... Спасибо!

#define ledPin 3   
#define buttonPin 10 
boolean new_button_state = false;
boolean old_button_state = false;
unsigned long previousMillis = 0;      
unsigned long interval = 4000;         

void setup() 
{
  pinMode(ledPin, OUTPUT);     
  pinMode( buttonPin, INPUT);
}

void loop()
{
  delay(10);
  new_button_state = digitalRead(buttonPin);

if ( (new_button_state != old_button_state) && new_button_state ) // состояние кнопки изменилось и оно стало HIGH
 {
 digitalWrite(ledPin, HIGH);

 previousMillis = millis();
 old_button_state = new_button_state; // сохраняем изменения

 } 
  
  if(previousMillis && (millis()-previousMillis >= interval)) 
  {
    digitalWrite(ledPin, LOW);
    previousMillis = 0;
  }
}

Срабатывает,но только один раз,на дальнейшие нажатия кнопки не реагирует до перезапуска :(

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

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

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

Вот так заработало 


#define ledPin 3   
#define buttonPin 10 
boolean new_button_state = false;
boolean old_button_state = false;
unsigned long previousMillis = 0;      
unsigned long interval = 4000;         

void setup() 
{
  pinMode(ledPin, OUTPUT);     
  pinMode( buttonPin, INPUT);
}

void loop()
{
  delay(10);
  new_button_state = digitalRead(buttonPin);
  if ( (new_button_state != old_button_state) && new_button_state ) // состояние кнопки изменилось и оно стало HIGH
  {
    digitalWrite(ledPin, HIGH);
    previousMillis = millis();
  }
  old_button_state = new_button_state; // сохраняем изменения
  if((previousMillis>0) && (millis()-previousMillis >= interval)) 
  {
    digitalWrite(ledPin, LOW);
    previousMillis = 0;
   


  }
}

Araris спасибо за помощь и за Ваше терпение! Затра попробую вживить в свой код :)

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

Блин, точно, второе условие  && new_button_state не давало сохранять изменения.

Ну да ладно. Успехов Вам. 

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

Всё получилось как хотел!!! Огромное спасибо!

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

В итоге получилось так,насколько мог прокоментировал код . Нужно сюда включать сторожевой таймер и как правильно это сделать ?

#define alarmLed 6 // индикатор "протечка/уборка"
#define openLed 4 // индикатор состояния "открыто"
#define closeLed 5 // индикатор состояния "закрыто"
#define openRele 3 // реле закрытия крана
#define closeRele 12 // реле открытия крана
#define openButton 10 // кнопка "Открыть" кран
#define closeButton 11 // кнопка "Закрыть" кран
#define resetButton 2 //  кнопка "Сброс/Уборка" 
#define leaksensor 8  // датчик протечки,при срабатывание на входе LOW

bool leakState = 0;  
bool lastleakState = 0;
bool openState=0;
bool lastopenState=0;
bool closeState=0;
bool lastcloseState=0;
bool resetState=0;
bool lastresetState=0;

boolean opS = 0;
boolean clS =0;
boolean leak=0;
boolean wait=0;

int ledStateLeak = LOW;
int ledStateWait = LOW;

boolean new_button_state1 = false;
boolean new_button_state2 = false;
boolean new_button_state3 = false;
boolean old_button_state1 = false;
boolean old_button_state2 = false;
boolean old_button_state3 = false;

unsigned long previousMillis = 0;
unsigned long previousMillisOpen = 0; 
unsigned long previousMillisClose = 0; 
unsigned long previousMillisWait = 0;
unsigned long previousMillisWaitLed = 0;
unsigned long intervalLeak =500;
unsigned long intervalWaitLed =3000; 
unsigned long intervalRele =4000;
unsigned long intervalWait=3600000;

void setup() {
  pinMode(alarmLed,OUTPUT);
  pinMode(openLed,OUTPUT);
  pinMode(closeLed,OUTPUT);
  pinMode(openRele,OUTPUT);
  pinMode(closeRele,OUTPUT);
  pinMode(openButton, INPUT);
  pinMode(closeButton, INPUT);
  pinMode(resetButton, INPUT);
  pinMode(leaksensor, INPUT);
  Serial.begin(9600);
}

void loop(){
  //**************Анализ состояния входов ***************************
  leakState=digitalRead(leaksensor);
  leakState=!leakState;
  if (leakState != lastleakState) {
    if ((leakState == HIGH)&&(wait==0)) {
      leak=1;                              // если сработал датчик протечки устанавливаем статус "протечка"
      Serial.println("LEAK");
    }
    lastleakState = leakState;
  }
  if  (leak==1){
    clS=1;
    opS=0;
  } 
  openState = digitalRead(openButton);
  if (openState != lastopenState) {
    if ((openState == HIGH)&&(leak==0)) {
      opS=1;                              // если нажата кнопка "открыть" устанавливаем статус "открыто"
      clS=0;
      Serial.println("OPEN");
    }
    lastopenState = openState; 
  }
  closeState = digitalRead(closeButton);
  if (closeState != lastcloseState) {
    if ((closeState == HIGH) ||(leak==1)) {
      opS=0;
      clS=1;                              // если нажата кнопка "закрыть" или статус "протечка" устанавливаем статус "закрыть"
      Serial.println("CLOSE");
    }
    lastcloseState = closeState; 
  }
  resetState = digitalRead(resetButton);
  if (resetState != lastresetState) {
    if (resetState == HIGH) {
      leak=0;                              // если нажата кнопка "сброс/уборка" сбрасываем статус "протечка" и  устанавливаем статус "уборка" и блокируем датчик протечки 
      wait=1;
      previousMillisWait = millis();
      Serial.println("RESET");
      Serial.println("WAIT");
    }
    lastresetState = resetState;
  }
  if((previousMillisWait>0) && (millis()-previousMillisWait >= intervalWait)) 
  {

    wait=0;                                // если прошло 60 минут убираем статус "уборка" и разблокируем датчик протечки
    previousMillisWait = 0;
    Serial.println("END WAIT");

  }
  //*************** Управление реле закрытия кранов**************************

  new_button_state1 = opS;
  if ( (new_button_state1 != old_button_state1) && new_button_state1 ) 
  {
    digitalWrite(openRele, HIGH);           //  если установлен статус "открыто" включаем реле открытия кранов на 4 секунды
    previousMillisOpen = millis();
  }
  old_button_state1 = new_button_state1; // сохраняем изменения
  if((previousMillisOpen>0) && (millis()-previousMillisOpen >= intervalRele)) 
  {
    digitalWrite(openRele, LOW);
    previousMillisOpen = 0;
  }
  new_button_state2 = clS;
  if ( (new_button_state2 != old_button_state2) && new_button_state2 ) 
  {
    digitalWrite(closeRele, HIGH);           //  если установлен статус "закрыто" включаем реле закрытия кранов на 4 секунды
    previousMillisClose = millis();
  }
  old_button_state2 = new_button_state2; // сохраняем изменения
  if((previousMillisClose>0) && (millis()-previousMillisClose >= intervalRele)) 
  {
    digitalWrite(closeRele, LOW);
    previousMillisClose = 0;
  }
  //*************** управление светодиодами индикации состояния ***************** 
  if (opS==1){
    digitalWrite(openLed, HIGH);     // если установлен статус "открыто" включаем индикатор состояния "открыто" 
  }
  else {
    digitalWrite(openLed, LOW);     //иначе выключаем
  }
  if (clS==1){
    digitalWrite(closeLed, HIGH);     // если установлен статус "закрыто" включаем индикатор состояния "закрыто" 
  }
  else {
    digitalWrite(closeLed, LOW);     //иначе выключаем
  }

  if ((leak==1)&&(wait==0)){         
    digitalWrite(alarmLed, ledStateLeak); // если "протечка" ,то моргаем индикатор "протечка/уборка" с интервалом  равным  intervalLeak
  }
  if ((leak==0)&&(wait==1)){
    digitalWrite(alarmLed, ledStateWait); // если "уборка" ,то моргаем индикатор "протечка/уборка" с интервалом  равным  intervalWaitLed
  }
   if ((leak==0)&&(wait==0)){
    digitalWrite(alarmLed, LOW);   // иначе выключаем
  }  
  //********** управление бузером ********
  if ( leak==1)  // если "протечка" включаем бузер
  { 
    tone(9, 600, 150);
    delay(300);
  }  
  //********* задание частоты мигания светодиода *******
  unsigned long currentMillis = millis();              // частота моргания для режима "протечка"
  if(currentMillis - previousMillis > intervalLeak) {
    previousMillis = currentMillis;   
    if (ledStateLeak == LOW)
      ledStateLeak = HIGH;
    else
      ledStateLeak = LOW;
  }
  unsigned long  currentMillisWaitLed = millis();      // частота моргания для режима "уборка"
  if(currentMillisWaitLed - previousMillisWaitLed> intervalWaitLed) {
    previousMillisWaitLed = currentMillisWaitLed;   
    if (ledStateWait == LOW)
      ledStateWait = HIGH;
    else
      ledStateWait = LOW;
  }
}

 

Если есть косяки,то прошу указать на них :) . данный вариант проверен на прототипе.

Araris ещё раз спасибо за помощ.

 

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

Три вопроса :

Чем краны поворачиваете, модель, цена, фото ? Подозреваю, что мотор-редуктором.

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

Что такое "сторожевой таймер", имеется в виду Watchdog против зависаний Ардуино ?

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

Araris пишет:

Чем краны поворачиваете, модель, цена, фото ? Подозреваю, что мотор-редуктором.

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

Что такое "сторожевой таймер", имеется в виду Watchdog против зависаний Ардуино ?

1 ) Пока ничем,их ещё нет ( китайкие боюсь заказывать,не уверен в качестве и долговечности,хоть и дешево)

2) Будет корректироваться после появления кранов,возно что измениться в коде 

3 ) именно Watchdog против зависаний Ардуино я и имел ввиду,спасибо за поправку.

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

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

Сторожевой таймер я делал по рецепту отсюда http://arduino.ru/forum/programmirovanie/programmnyi-reset#comment-9130 , в этой теме вообще есть немало интересного. Работает на Nano и на Uno достаточно долго уже.

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

Araris пишет:

Сторожевой таймер я делал по рецепту отсюда http://arduino.ru/forum/programmirovanie/programmnyi-reset#comment-9130 , в этой теме вообще есть немало интересного. Работает на Nano и на Uno достаточно долго уже.

А в Nano тоже optiboot? Я так понял, что, по умолчанию таймер только с ним нормально работает.

Все свои Pro Micro перешил с optiboot - теперь таймер работает как часы.

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

Так как блок кнопок и индикации планирую выносной , переделел схему и скетч. Если кому будет интересно-выложу

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

Думаю, это будет интересно. Только было бы удобнее создать под Ваш проект новую тему, он ведь уже дорос до этого ?

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

Но это же часть умной ванны,хорошо ,больше флудить не буду)

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

avton пишет:

Но это же часть умной ванны,хорошо ,больше флудить не буду)

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

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

Araris ,у Вас хорошо срабатывает включение света в ванной? 

 

С аквасторожем переехал сюда  http://arduino.ru/forum/proekty/sistema-zashchity-ot-protechki-vody

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

avton пишет:

Araris ,у Вас хорошо срабатывает включение света в ванной? 

Даже идеально срабатывает. Там два датчика дублируют друг друга - УЗ-датчик HC-SR04 и ИК-свитч, один из тех, что на картинке тут http://arduino.ru/forum/proekty/umnye-tualet-i-vannaya?page=5#comment-33494. В паре они определяют и "держат" посетителя безошибочно. Когда был один УЗ - бывали проблемы.

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

пытаюсь повесит датчики на прерывания ,но знаний катастрафически не хватает:


int IR_SWITCH1_PIN=2;   // pin connected to IR switch 1
int IR_SWITCH2_PIN=3 ;  // pin connected to IR switch 2

int ledPin = 13;

int IR1_state=0;
bool IR2_state=0;
bool IR1_already=0;
bool IR2_already=0;
bool IR1IR2_already=0;
int  IR1IR2_first=0;
int Human_Counter_New=0;
int Human_Counter_Old=0;

void setup()
{ 
  Serial.begin(9600);
  pinMode(IR_SWITCH1_PIN, INPUT);
  pinMode(IR_SWITCH2_PIN, INPUT);
  pinMode(ledPin, OUTPUT); 
  attachInterrupt(0, IR1,CHANGE);
  attachInterrupt(1, IR2,CHANGE);
  
}
void loop()
{
  IR1_state = digitalRead(IR_SWITCH1_PIN); // inverse
  IR2_state =  digitalRead(IR_SWITCH2_PIN); // inverse
  ////////// Analyze Human_Counter_New
  if ( Human_Counter_New != Human_Counter_Old )
  {
    Human_Counter_Old = Human_Counter_New;
    Serial.print("Human_Counter = ");
    Serial.println(Human_Counter_New);
  }
  if ( Human_Counter_New > 0)
  {
    digitalWrite(ledPin,HIGH);
  }
  else {
    digitalWrite(ledPin,LOW);

  }
}

void IR1() 
{

  if ( !IR1_state && !IR2_state) // IR1 off, IR2 off.
  {
    ////////// Analyze 
    if ( IR1IR2_first > 0 && IR1IR2_already && IR1_already && IR2_already)
    {
      if ( IR1IR2_first == 1) { 
        Human_Counter_New++; 
        Serial.println(Human_Counter_New);
      }
      else { 
        Human_Counter_New--; 
      }
      Serial.println("IR1 off, IR2 off.");
    }
    IR1_already = 0;
    IR2_already = 0;
    IR1IR2_already = 0;
    IR1IR2_first = 0;
  } 
} 
void IR2(){
 
  if ( IR1_state && !IR2_state) // IR1 on, IR2 off.
  {
    IR1_already = 1;
    if ( !IR2_already ) { 
      IR1IR2_first = 1; 
    }
    Serial.print("first = ");
    Serial.print(IR1IR2_first);
    Serial.println(" IR1 on, IR2 off.");
  }  
  if ( !IR1_state && IR2_state) // IR1 off, IR2 on.
  {
    IR2_already = 1;
    if ( !IR1_already ) { 
      IR1IR2_first = 2; 
    }
    Serial.print("first = ");
    Serial.print(IR1IR2_first);
    Serial.println(" IR1 off, IR2 on.");
  }  
  if ( IR1_state && IR2_state) // IR1 on, IR2 on.
  {
    IR1IR2_already = 1;
    Serial.print("first = ");
    Serial.print(IR1IR2_first);
    Serial.print(" IR1IR2_already");
    Serial.println(" IR1 on, IR2 on.");
  }  
  if ( Human_Counter_New < 0 ) { 
    Human_Counter_New = 0; 
  }
}

дальше first = 1 IR1 on, IR2 off.  дело не идет.

Видел Ваш полный скетч для ванны ,но как отсечь все лишнее для меня пока не понял( оставить ИК и PIR датчики )

я правильно понимаю что скетч для ванной : AVSmartWC ?

Пока срабатывает не всегда,такое впечатление что датчики срабатывают в подходящий момент времени
P.S. потолок пока в полуразобранном виде,для быстрого доступа к ардуине )
Araris
Offline
Зарегистрирован: 09.11.2012

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

В скетче AVSmartWC на прерывании висит кнопка ручного включения, это совсем другая история.

 

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

Значит надо прикручивать PIR датчик,только пока не знаю как  :) .  Если я правильно понял у Вас в этом скетче утразвукой датчик , а ИК датчиков там нет.

Свободный датчик есть ....

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

avton пишет:

Значит надо прикручивать PIR датчик,только пока не знаю как  :) .  Если я правильно понял у Вас в этом скетче утразвукой датчик , а ИК датчиков там нет.

Есть там оба датчика. ИК датчик в скетче представлен тремя строками :

#define IR_SWITCH_PIN 4 // pin connected to IR switch

...

pinMode(IR_SWITCH_PIN, INPUT);

...

 if (!digitalRead(IR_SWITCH_PIN)) { CurDistance = 55; }

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

Совсем запутался :)

Araris  простите за мой тупизм,я правильно понял используется :

Pir датчик одна штука, утрасоник одна штука, ИК датчик одна штука, то есть подсчет людей не используется?

 

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

avton пишет:

Pir датчик одна штука, утрасоник одна штука, ИК датчик одна штука, то есть подсчет людей не используется?

Pir датчик - не используется.

Ультрасоник - одна штука

ИК датчик - одна штука.

Подсчет людей - не используется.

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

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

Сорри если достал своими вопросами

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

avton пишет:

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

Сорри если достал своими вопросами

Да без проблем. Итак, речь идет о туалете, вот фото, как все выглядит

сверху УЗ, под ним ИК. Они работают параллельно, то есть дублируя друг друга, ну, так исторически сложилось. Если бы я делал все сызнова, был бы только ИК.

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

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

С туалетом все просто,а вот с ванной гораздо сложнее ,там ультрасоник не всегда тебя видит )

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

avton пишет:

С туалетом все просто,а вот с ванной гораздо сложнее ,там ультрасоник не всегда тебя видит )

Согласен. Тема ванной у меня пока "не раскрыта". Там светом управляет PIR-датчик с таймером, вообще не связанный с Ардуиной.

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

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

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

Есть еще одна мысль для бОльшей площади помещения : комбинация датчика пересечения дверного проема (1) с датчиком движения (2).

Последовательность срабатывания (1) -> (2) - кто-то зашел и присутствует,

(2) -> (1) -> (2) - кто-то вышел, но кто-то еще присутствует,

(1) -> (2)  -> (нет сработок) - кто-то вышел и никто не присутствует.

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

Я вчера об этом думал. Как раз это и искал в Вашем скетче ))))

 

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

avton пишет:

Я вчера об этом думал. Как раз это и искал в Вашем скетче ))))

)))

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

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

С одним датчиком движения вообще не вариант,пробывал )

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

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

Блок управления для ванной ( 3 в 1) готов )

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

alexey_and
Offline
Зарегистрирован: 03.03.2013

нарядно! 

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

Этп плата прекрасна!

На мой взгляд, Ардуинка там слегка лишняя. ATMEGA328P на панельки с одним кварцем гораздо лучше бы смотрелся.

Недавно открыл такие блоки питания - очень хороши для таких плат

 

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

Впечатляющая конструкция, завидую белой завистью, респект автору.

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

sav13 пишет:

Этп плата прекрасна!

На мой взгляд, Ардуинка там слегка лишняя. ATMEGA328P на панельки с одним кварцем гораздо лучше бы смотрелся.

Недавно открыл такие блоки питания - очень хороши для таких плат

 

Есть аналогичные блоки питания и даже вроде дешевле,парочка таких работает и претензий вроде нет 

http://www.ebay.com/itm/261347213330?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649 . Но этот блок несет на себе ещё функцию контроллера защиты от протечки воды и имеется ИБП на 12 вольт,поэтому питание внешнее. Думал я о голых чипах. Удобно когда надо уменьшить размеры,но у меня всё в процессе настройки :)) . Да и в наличии у меня их нет сейчас,причем цена такая же почти как про мини,поэтому пока не вижу смысла. Плата пока не окончательный вариант,не учел того момента  что симисторный ключь не хочет управлять очень маломощной нагрузкой ( вентилятор вытяжки ) придется один канал переделывать на обычное реле. Да и с интефейсом телеметрии пока не решил )))

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

Проблема с невключением вытяжки решилась малой кровью, переделку платы пока можно отложить :) 

Вот и сам виновник,новый с упаковки,купленный на алиэкспрес

P.S. Датчики прохода стали отрабатывать более четко.

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

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


#define IR_SWITCH1_PIN 2   // pin connected to IR switch 1
#define IR_SWITCH2_PIN 3    // pin connected to IR switch 2
int ledPin = 17;

bool IR1_state=0;
bool IR2_state=0;
bool IR1_already=0;
bool IR2_already=0;
bool IR1IR2_already=0;
int  IR1IR2_first=0;
int Human_Counter_New=0;
int Human_Counter_Old=0;

void setup()
{ 
   pinMode(IR_SWITCH1_PIN, INPUT);
  pinMode(IR_SWITCH2_PIN, INPUT);
    pinMode(ledPin, OUTPUT); 
}

void loop() 
{
   IR1_state = digitalRead(IR_SWITCH1_PIN); // inverse
  IR2_state =  digitalRead(IR_SWITCH2_PIN); // inverse
    if ( !IR1_state && !IR2_state) // IR1 off, IR2 off.
  {
      if ( IR1IR2_first > 0 && IR1IR2_already && IR1_already && IR2_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 ( IR1_state && !IR2_state) // IR1 on, IR2 off.
  {
    IR1_already = 1;
    if ( !IR2_already ) { 
      IR1IR2_first = 1; 
    }
   }  
  if ( !IR1_state && IR2_state) // IR1 off, IR2 on.
  {
    IR2_already = 1;
    if ( !IR1_already ) { 
      IR1IR2_first = 2; 
   } 
  } 
  if ( IR1_state && IR2_state) // IR1 on, IR2 on.
  {
    IR1IR2_already = 1;
    }  
  if ( Human_Counter_New < 0 ) { 
    Human_Counter_New = 0; 
  }
    if ( Human_Counter_New != Human_Counter_Old )
  {
    Human_Counter_Old = Human_Counter_New;
  }
  if ( Human_Counter_New > 0)
  {
    digitalWrite(ledPin,HIGH);
       }
  else {
    digitalWrite(ledPin,LOW);
     }
}

Подумавываю под это дело  использовать отдельно atmega8 .... А ещё лучше aTtiny13,как раз есть в загашнике