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

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 секунды..  

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

001/* При срабатывание датчика протечки закрывается кран,начинает моргать светодиод "протечка",пищит бузер и блокируется кнопка открытия крана.
002 При нажатие кнопки "сброс" выключается бузер,гаснет светодиод "протечка" и разблокируется кнопка "открыть".
003 */
004 
005const int alarmLed =6; // индикатор "протечка"
006const int openLed =4; // индикатор состояния "открыто"
007const int closeLed=5; // индикатор состояния "закрыто"
008const int openRele=3; // реле закрытия крана
009const int closeRele=12; // реле открытия крана
010const int openButton=10; // кнопка "Открыть" кран
011const int closeButton=11; // кнопка "Закрыть" кран
012const int resetButton=2; //  кнопка "Сброс" протечки
013const int leaksensor=8; // датчик протечки,при срабатывание на входе LOW
014bool openState=0;
015bool opS=0;
016bool lastopenState=0;
017bool closeState=0;
018bool lastcloseState=0;
019bool clS=0;
020bool leakState = 0;
021bool lastleakState = 0;
022bool resetState=0;
023bool lastresetState=0;
024 
025int buttonPushCounter = 0;
026int leakCounter=0;
027int ledState = LOW;            
028long previousMillis = 0;       
029long interval = 500; 
030 
031void setup() {
032  pinMode(alarmLed,OUTPUT);
033  pinMode(openLed,OUTPUT);
034  pinMode(closeLed,OUTPUT);
035  pinMode(openRele,OUTPUT);
036  pinMode(closeRele,OUTPUT);
037  pinMode(openButton, INPUT);
038  pinMode(closeButton, INPUT);
039  pinMode(resetButton, INPUT);
040  pinMode(leaksensor, INPUT);
041  Serial.begin(9600);
042}
043void loop(){
044  leakState=digitalRead(leaksensor);
045  leakState=!leakState;
046  if (leakState != lastleakState) {
047    if (leakState == HIGH) {
048      leakCounter=1;
049      Serial.println("LEAK");
050    }
051    lastleakState = leakState;
052  }
053 
054  if  (leakCounter==1){
055    digitalWrite(alarmLed, ledState);
056    clS=1;
057    opS=0;
058 
059  }
060  else {
061    digitalWrite(alarmLed, LOW);
062 
063  }
064  openState = digitalRead(openButton);
065  if (openState != lastopenState) {
066 
067    if ((openState == HIGH)&&(leakCounter==0)) {
068      opS=1;
069      clS=0;
070      Serial.println("OPEN");
071 
072    }
073 
074    lastopenState = openState;
075  }
076 
077 
078  closeState = digitalRead(closeButton);
079  if (closeState != lastcloseState) {
080 
081    if (closeState == HIGH) {
082      opS=0;
083      clS=1;
084      Serial.println("CLOSE");
085    }
086 
087    lastcloseState = closeState;
088  }
089 
090  if (opS==1){
091    digitalWrite(openLed, HIGH);
092    digitalWrite(openRele, HIGH);
093 
094  }
095  else {
096    digitalWrite(openLed, LOW);
097    digitalWrite(openRele, LOW);
098  }
099 
100  if (clS==1){
101    digitalWrite(closeLed, HIGH);
102    digitalWrite(closeRele, HIGH);
103  }
104  else {
105    digitalWrite(closeLed, LOW);
106    digitalWrite(closeRele, LOW);
107  }
108 
109 
110  resetState = digitalRead(resetButton);
111  if (resetState != lastresetState) {
112 
113    if (resetState == HIGH) {
114      leakCounter=0;
115      Serial.println("RESET");
116    }
117    lastresetState = resetState;
118  }
119  if ( leakCounter==1)
120  {
121    tone(9, 600, 150);
122    delay(300);
123  }
124 
125  unsigned long currentMillis = millis();
126 
127  if(currentMillis - previousMillis > interval) {
128    previousMillis = currentMillis;  
129 
130    if (ledState == LOW)
131      ledState = HIGH;
132    else
133      ledState = LOW;
134  }
135}

 

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 я правильно понял понял что Вы имели в виду это 

01#define ledPin 3  
02#define buttonPin 10
03unsigned long previousMillis = 0;     
04unsigned long interval = 4000;        
05 
06void setup()
07{
08  pinMode(ledPin, OUTPUT);    
09  pinMode( buttonPin, INPUT);
10}
11 
12void loop()
13{
14  delay(10);
15  if (digitalRead(buttonPin) == HIGH)
16  {
17    digitalWrite(ledPin, HIGH);
18    previousMillis = millis();
19  }
20  if(previousMillis && (millis()-previousMillis >= interval))
21  {
22    digitalWrite(ledPin, LOW);
23    previousMillis = 0;
24  }
25}

Но в таком варианте выключается через 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

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

01#define ledPin 3  
02#define buttonPin 10
03boolean new_button_state = false;
04boolean old_button_state = false;
05unsigned long previousMillis = 0;     
06unsigned long interval = 4000;        
07 
08void setup()
09{
10  pinMode(ledPin, OUTPUT);    
11  pinMode( buttonPin, INPUT);
12}
13 
14void loop()
15{
16  delay(10);
17  new_button_state = digitalRead(buttonPin);
18 
19if ( (new_button_state != old_button_state) && new_button_state ) // состояние кнопки изменилось и оно стало HIGH
20 {
21 digitalWrite(ledPin, HIGH);
22 
23 previousMillis = millis();
24 old_button_state = new_button_state; // сохраняем изменения
25 
26 }
27   
28  if(previousMillis && (millis()-previousMillis >= interval))
29  {
30    digitalWrite(ledPin, LOW);
31    previousMillis = 0;
32  }
33}

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

дальше 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

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

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