имеется конечно,он кстати тоже дальностью не блещет. Антенны пробывал разные и четверть волновые и даже такие https://yadi.sk/d/FD4q15qxTqpbV . Будем разбираться ,очень похоже на то ,что рядом что то сильно фонит во всем дипазоне... Рядом дом ,в котором находиться ЖЭК и на крыше антенна диспетчерской:)
На счет Wi-Fi, для Андроида есть неплохая прога Wifi Analyzer, позволяет посмотреть занятые каналы. Во всяком случае мне дома помогло разнести 5ГГц на разные каналы, чтобы с соседом не пересекаться. Смотрит 5 и 2,4ГГц диапазоны, удобно.
На счет Wi-Fi, для Андроида есть неплохая прога Wifi Analyzer, позволяет посмотреть занятые каналы. Во всяком случае мне дома помогло разнести 5ГГц на разные каналы, чтобы с соседом не пересекаться. Смотрит 5 и 2,4ГГц диапазоны, удобно.
да знаю,спасибо.Свою точку доступа уже давно перестроил на более свободный канал....
Пытаюсь разобраться с прерываниями в скетче,пока не очень получается :)
Всем здравствуйте! Помогите разобраться с кодом,напрвтев нужное русло . Устройство- защита от протечки воды. Все в принципе работает как хотелось,за исключение одной детали. Не могу заставить срабатывать реле только на 4 секунды.
При нажатие кнопки "закрыть" загорается светодиод "closeLed" и срабатывает реле "closeRele" .На текущий момент рле работает синхронно вместе со светодиодом,а хотелось бы чтобы оно срабатывало только на 4 секунды..
Но в таком варианте выключается через 4 секунды после отпускания кнопки,а надо чтобы отключалось через 4 секунды при нажатой кнопке,то есть нажали -включилось и через 4 секунды выключилось,даже если продолжаем удерживать кнопку...
надо чтобы отключалось через 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, чего мы и желали.
Ммм... В голове прокручиваю - ошибки не вижу, а проверить - нечем. Выводите в монитор порта значения переменных, смотрите, как они изменяются (скорее, не изменяются) при дальнейших нажатиях кнопки.
ультрасоник над дверю в ванной висит? собрал на макетке ,залил Ваш скетч,включает и по ИК датчику и по сонику,не могу понять при каком условии выключается.
ультрасоник над дверю в ванной висит? собрал на макетке ,залил Ваш скетч,включает и по ИК датчику и по сонику,не могу понять при каком условии выключается.
Сорри если достал своими вопросами
Да без проблем. Итак, речь идет о туалете, вот фото, как все выглядит
сверху УЗ, под ним ИК. Они работают параллельно, то есть дублируя друг друга, ну, так исторически сложилось. Если бы я делал все сызнова, был бы только ИК.
При каком условии выключается, нууу, там логика достаточно хитроделанная, думаю, Вам проще было бы по-своему расписать, сначала по-простому, а затем усложняя по потребности.
Есть аналогичные блоки питания и даже вроде дешевле,парочка таких работает и претензий вроде нет
http://www.ebay.com/itm/261347213330?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649 . Но этот блок несет на себе ещё функцию контроллера защиты от протечки воды и имеется ИБП на 12 вольт,поэтому питание внешнее. Думал я о голых чипах. Удобно когда надо уменьшить размеры,но у меня всё в процессе настройки :)) . Да и в наличии у меня их нет сейчас,причем цена такая же почти как про мини,поэтому пока не вижу смысла. Плата пока не окончательный вариант,не учел того момента что симисторный ключь не хочет управлять очень маломощной нагрузкой ( вентилятор вытяжки ) придется один канал переделывать на обычное реле. Да и с интефейсом телеметрии пока не решил )))
КО подсказывает, что ему не нравится отсутствие библиотеки SimpleTimer. Гугл подсказывает, что ее можно взять, например, здесь : http://playground.arduino.cc/Code/SimpleTimer
спасибо,все получилось. Жаль с радиосвязью у меня в квартире проблема,бермудский треугольник :)) . И на 433 и на 2.4 Ггц дальность метра 3 )
О_о. Wi-Fi в квартире имеется ? Работает ?
На 433 МГц-модули антенны хорошие паяли ?
О_о. Wi-Fi в квартире имеется ? Работает ?
На 433 МГц-модули антенны хорошие паяли ?
имеется конечно,он кстати тоже дальностью не блещет. Антенны пробывал разные и четверть волновые и даже такие https://yadi.sk/d/FD4q15qxTqpbV . Будем разбираться ,очень похоже на то ,что рядом что то сильно фонит во всем дипазоне... Рядом дом ,в котором находиться ЖЭК и на крыше антенна диспетчерской:)
https://www.dropbox.com/s/ndry352qjuqeq2u/2014-06-18%2010.06.37.jpg
На счет Wi-Fi, для Андроида есть неплохая прога Wifi Analyzer, позволяет посмотреть занятые каналы. Во всяком случае мне дома помогло разнести 5ГГц на разные каналы, чтобы с соседом не пересекаться. Смотрит 5 и 2,4ГГц диапазоны, удобно.
На счет Wi-Fi, для Андроида есть неплохая прога Wifi Analyzer, позволяет посмотреть занятые каналы. Во всяком случае мне дома помогло разнести 5ГГц на разные каналы, чтобы с соседом не пересекаться. Смотрит 5 и 2,4ГГц диапазоны, удобно.
да знаю,спасибо.Свою точку доступа уже давно перестроил на более свободный канал....
Пытаюсь разобраться с прерываниями в скетче,пока не очень получается :)
Всем здравствуйте! Помогите разобраться с кодом,напрвтев нужное русло . Устройство- защита от протечки воды. Все в принципе работает как хотелось,за исключение одной детали. Не могу заставить срабатывать реле только на 4 секунды.
При нажатие кнопки "закрыть" загорается светодиод "closeLed" и срабатывает реле "closeRele" .На текущий момент рле работает синхронно вместе со светодиодом,а хотелось бы чтобы оно срабатывало только на 4 секунды..
Не судиде строго - первый скетчь :)
001
/* При срабатывание датчика протечки закрывается кран,начинает моргать светодиод "протечка",пищит бузер и блокируется кнопка открытия крана.
002
При нажатие кнопки "сброс" выключается бузер,гаснет светодиод "протечка" и разблокируется кнопка "открыть".
003
*/
004
005
const
int
alarmLed =6;
// индикатор "протечка"
006
const
int
openLed =4;
// индикатор состояния "открыто"
007
const
int
closeLed=5;
// индикатор состояния "закрыто"
008
const
int
openRele=3;
// реле закрытия крана
009
const
int
closeRele=12;
// реле открытия крана
010
const
int
openButton=10;
// кнопка "Открыть" кран
011
const
int
closeButton=11;
// кнопка "Закрыть" кран
012
const
int
resetButton=2;
// кнопка "Сброс" протечки
013
const
int
leaksensor=8;
// датчик протечки,при срабатывание на входе LOW
014
bool
openState=0;
015
bool
opS=0;
016
bool
lastopenState=0;
017
bool
closeState=0;
018
bool
lastcloseState=0;
019
bool
clS=0;
020
bool
leakState = 0;
021
bool
lastleakState = 0;
022
bool
resetState=0;
023
bool
lastresetState=0;
024
025
int
buttonPushCounter = 0;
026
int
leakCounter=0;
027
int
ledState = LOW;
028
long
previousMillis = 0;
029
long
interval = 500;
030
031
void
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
}
043
void
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
}
Не судиде строго
Узбагойзя )))
Я пытался понять Ваш код, но ниасилил, простите. Как-то все излишне сложно и запутанно мне показалось.
Давайте лучше я "на пальцах" идею расскажу.
1. Заводим переменную unsigned long RelayState = 0;
2. Если нужно включить реле, присваиваем RelayState = millis();
3. Если не нужно включить реле, присваиваем RelayState = 0;
4. Чтобы реле срабатывало только на interval миллисекунд, делаем проверку
if ( (RelayState > 0) && (millis() - RelayState <= interval) ) { держим включенным }
else { держим выключенным }
Попробуйте сами, если что обращайтесь.
Знаю что запутанно,но пока хоть так :)
Спасибо,попробую,отпишусь потом.
Как все получится,будем урезать лишнее.
P.S. По поводу света в ванной: данный вариант датчиков работает отлично,но иногда хромает обработка :)
3. Если не нужно включить реле, присваиваем RelayState = 0;
Тут правильнее
3. Если нужно выключить реле, не дожидаясь истечения интервала, присваиваем RelayState = 0;
А если никаких действий с реле не нужно, то RelayState не трогаем совсем.
Araris я правильно понял понял что Вы имели в виду это
01
#define ledPin 3
02
#define buttonPin 10
03
unsigned
long
previousMillis = 0;
04
unsigned
long
interval = 4000;
05
06
void
setup
()
07
{
08
pinMode(ledPin, OUTPUT);
09
pinMode( buttonPin, INPUT);
10
}
11
12
void
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 секунды выключилось,даже если продолжаем удерживать кнопку...
Видимо я всё таки не понимаю ещё до конца..
надо чтобы отключалось через 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, чего мы и желали.
я думал об этом ,но не попробывал... Спасибо!
01
#define ledPin 3
02
#define buttonPin 10
03
boolean new_button_state =
false
;
04
boolean old_button_state =
false
;
05
unsigned
long
previousMillis = 0;
06
unsigned
long
interval = 4000;
07
08
void
setup
()
09
{
10
pinMode(ledPin, OUTPUT);
11
pinMode( buttonPin, INPUT);
12
}
13
14
void
loop
()
15
{
16
delay(10);
17
new_button_state = digitalRead(buttonPin);
18
19
if
( (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
}
Срабатывает,но только один раз,на дальнейшие нажатия кнопки не реагирует до перезапуска :(
Ммм... В голове прокручиваю - ошибки не вижу, а проверить - нечем. Выводите в монитор порта значения переменных, смотрите, как они изменяются (скорее, не изменяются) при дальнейших нажатиях кнопки.
Вот так заработало
01
#define ledPin 3
02
#define buttonPin 10
03
boolean new_button_state =
false
;
04
boolean old_button_state =
false
;
05
unsigned
long
previousMillis = 0;
06
unsigned
long
interval = 4000;
07
08
void
setup
()
09
{
10
pinMode(ledPin, OUTPUT);
11
pinMode( buttonPin, INPUT);
12
}
13
14
void
loop
()
15
{
16
delay(10);
17
new_button_state = digitalRead(buttonPin);
18
if
( (new_button_state != old_button_state) && new_button_state )
// состояние кнопки изменилось и оно стало HIGH
19
{
20
digitalWrite(ledPin, HIGH);
21
previousMillis = millis();
22
}
23
old_button_state = new_button_state;
// сохраняем изменения
24
if
((previousMillis>0) && (millis()-previousMillis >= interval))
25
{
26
digitalWrite(ledPin, LOW);
27
previousMillis = 0;
28
29
30
31
}
32
}
Araris спасибо за помощь и за Ваше терпение! Затра попробую вживить в свой код :)
Блин, точно, второе условие && new_button_state не давало сохранять изменения.
Ну да ладно. Успехов Вам.
Всё получилось как хотел!!! Огромное спасибо!
В итоге получилось так,насколько мог прокоментировал код . Нужно сюда включать сторожевой таймер и как правильно это сделать ?
001
#define alarmLed 6 // индикатор "протечка/уборка"
002
#define openLed 4 // индикатор состояния "открыто"
003
#define closeLed 5 // индикатор состояния "закрыто"
004
#define openRele 3 // реле закрытия крана
005
#define closeRele 12 // реле открытия крана
006
#define openButton 10 // кнопка "Открыть" кран
007
#define closeButton 11 // кнопка "Закрыть" кран
008
#define resetButton 2 // кнопка "Сброс/Уборка"
009
#define leaksensor 8 // датчик протечки,при срабатывание на входе LOW
010
011
bool
leakState = 0;
012
bool
lastleakState = 0;
013
bool
openState=0;
014
bool
lastopenState=0;
015
bool
closeState=0;
016
bool
lastcloseState=0;
017
bool
resetState=0;
018
bool
lastresetState=0;
019
020
boolean opS = 0;
021
boolean clS =0;
022
boolean leak=0;
023
boolean wait=0;
024
025
int
ledStateLeak = LOW;
026
int
ledStateWait = LOW;
027
028
boolean new_button_state1 =
false
;
029
boolean new_button_state2 =
false
;
030
boolean new_button_state3 =
false
;
031
boolean old_button_state1 =
false
;
032
boolean old_button_state2 =
false
;
033
boolean old_button_state3 =
false
;
034
035
unsigned
long
previousMillis = 0;
036
unsigned
long
previousMillisOpen = 0;
037
unsigned
long
previousMillisClose = 0;
038
unsigned
long
previousMillisWait = 0;
039
unsigned
long
previousMillisWaitLed = 0;
040
unsigned
long
intervalLeak =500;
041
unsigned
long
intervalWaitLed =3000;
042
unsigned
long
intervalRele =4000;
043
unsigned
long
intervalWait=3600000;
044
045
void
setup
() {
046
pinMode(alarmLed,OUTPUT);
047
pinMode(openLed,OUTPUT);
048
pinMode(closeLed,OUTPUT);
049
pinMode(openRele,OUTPUT);
050
pinMode(closeRele,OUTPUT);
051
pinMode(openButton, INPUT);
052
pinMode(closeButton, INPUT);
053
pinMode(resetButton, INPUT);
054
pinMode(leaksensor, INPUT);
055
Serial
.begin(9600);
056
}
057
058
void
loop
(){
059
//**************Анализ состояния входов ***************************
060
leakState=digitalRead(leaksensor);
061
leakState=!leakState;
062
if
(leakState != lastleakState) {
063
if
((leakState == HIGH)&&(wait==0)) {
064
leak=1;
// если сработал датчик протечки устанавливаем статус "протечка"
065
Serial
.println(
"LEAK"
);
066
}
067
lastleakState = leakState;
068
}
069
if
(leak==1){
070
clS=1;
071
opS=0;
072
}
073
openState = digitalRead(openButton);
074
if
(openState != lastopenState) {
075
if
((openState == HIGH)&&(leak==0)) {
076
opS=1;
// если нажата кнопка "открыть" устанавливаем статус "открыто"
077
clS=0;
078
Serial
.println(
"OPEN"
);
079
}
080
lastopenState = openState;
081
}
082
closeState = digitalRead(closeButton);
083
if
(closeState != lastcloseState) {
084
if
((closeState == HIGH) ||(leak==1)) {
085
opS=0;
086
clS=1;
// если нажата кнопка "закрыть" или статус "протечка" устанавливаем статус "закрыть"
087
Serial
.println(
"CLOSE"
);
088
}
089
lastcloseState = closeState;
090
}
091
resetState = digitalRead(resetButton);
092
if
(resetState != lastresetState) {
093
if
(resetState == HIGH) {
094
leak=0;
// если нажата кнопка "сброс/уборка" сбрасываем статус "протечка" и устанавливаем статус "уборка" и блокируем датчик протечки
095
wait=1;
096
previousMillisWait = millis();
097
Serial
.println(
"RESET"
);
098
Serial
.println(
"WAIT"
);
099
}
100
lastresetState = resetState;
101
}
102
if
((previousMillisWait>0) && (millis()-previousMillisWait >= intervalWait))
103
{
104
105
wait=0;
// если прошло 60 минут убираем статус "уборка" и разблокируем датчик протечки
106
previousMillisWait = 0;
107
Serial
.println(
"END WAIT"
);
108
109
}
110
//*************** Управление реле закрытия кранов**************************
111
112
new_button_state1 = opS;
113
if
( (new_button_state1 != old_button_state1) && new_button_state1 )
114
{
115
digitalWrite(openRele, HIGH);
// если установлен статус "открыто" включаем реле открытия кранов на 4 секунды
116
previousMillisOpen = millis();
117
}
118
old_button_state1 = new_button_state1;
// сохраняем изменения
119
if
((previousMillisOpen>0) && (millis()-previousMillisOpen >= intervalRele))
120
{
121
digitalWrite(openRele, LOW);
122
previousMillisOpen = 0;
123
}
124
new_button_state2 = clS;
125
if
( (new_button_state2 != old_button_state2) && new_button_state2 )
126
{
127
digitalWrite(closeRele, HIGH);
// если установлен статус "закрыто" включаем реле закрытия кранов на 4 секунды
128
previousMillisClose = millis();
129
}
130
old_button_state2 = new_button_state2;
// сохраняем изменения
131
if
((previousMillisClose>0) && (millis()-previousMillisClose >= intervalRele))
132
{
133
digitalWrite(closeRele, LOW);
134
previousMillisClose = 0;
135
}
136
//*************** управление светодиодами индикации состояния *****************
137
if
(opS==1){
138
digitalWrite(openLed, HIGH);
// если установлен статус "открыто" включаем индикатор состояния "открыто"
139
}
140
else
{
141
digitalWrite(openLed, LOW);
//иначе выключаем
142
}
143
if
(clS==1){
144
digitalWrite(closeLed, HIGH);
// если установлен статус "закрыто" включаем индикатор состояния "закрыто"
145
}
146
else
{
147
digitalWrite(closeLed, LOW);
//иначе выключаем
148
}
149
150
if
((leak==1)&&(wait==0)){
151
digitalWrite(alarmLed, ledStateLeak);
// если "протечка" ,то моргаем индикатор "протечка/уборка" с интервалом равным intervalLeak
152
}
153
if
((leak==0)&&(wait==1)){
154
digitalWrite(alarmLed, ledStateWait);
// если "уборка" ,то моргаем индикатор "протечка/уборка" с интервалом равным intervalWaitLed
155
}
156
if
((leak==0)&&(wait==0)){
157
digitalWrite(alarmLed, LOW);
// иначе выключаем
158
}
159
//********** управление бузером ********
160
if
( leak==1)
// если "протечка" включаем бузер
161
{
162
tone(9, 600, 150);
163
delay(300);
164
}
165
//********* задание частоты мигания светодиода *******
166
unsigned
long
currentMillis = millis();
// частота моргания для режима "протечка"
167
if
(currentMillis - previousMillis > intervalLeak) {
168
previousMillis = currentMillis;
169
if
(ledStateLeak == LOW)
170
ledStateLeak = HIGH;
171
else
172
ledStateLeak = LOW;
173
}
174
unsigned
long
currentMillisWaitLed = millis();
// частота моргания для режима "уборка"
175
if
(currentMillisWaitLed - previousMillisWaitLed> intervalWaitLed) {
176
previousMillisWaitLed = currentMillisWaitLed;
177
if
(ledStateWait == LOW)
178
ledStateWait = HIGH;
179
else
180
ledStateWait = LOW;
181
}
182
}
Если есть косяки,то прошу указать на них :) . данный вариант проверен на прототипе.
Araris ещё раз спасибо за помощ.
Три вопроса :
Чем краны поворачиваете, модель, цена, фото ? Подозреваю, что мотор-редуктором.
Почему intervalRele именно четыре секунды, обратной связи с краном нет и Вы полагаетесь только на время ?
Что такое "сторожевой таймер", имеется в виду Watchdog против зависаний Ардуино ?
Чем краны поворачиваете, модель, цена, фото ? Подозреваю, что мотор-редуктором.
Почему intervalRele именно четыре секунды, обратной связи с краном нет и Вы полагаетесь только на время ?
Что такое "сторожевой таймер", имеется в виду Watchdog против зависаний Ардуино ?
1 ) Пока ничем,их ещё нет ( китайкие боюсь заказывать,не уверен в качестве и долговечности,хоть и дешево)
2) Будет корректироваться после появления кранов,возно что измениться в коде
3 ) именно Watchdog против зависаний Ардуино я и имел ввиду,спасибо за поправку.
По сути это проба сил,в планах обкатать пока без кранов. Опробывать различные варианты датчиков например и всего остального...
Сторожевой таймер я делал по рецепту отсюда http://arduino.ru/forum/programmirovanie/programmnyi-reset#comment-9130 , в этой теме вообще есть немало интересного. Работает на Nano и на Uno достаточно долго уже.
Сторожевой таймер я делал по рецепту отсюда http://arduino.ru/forum/programmirovanie/programmnyi-reset#comment-9130 , в этой теме вообще есть немало интересного. Работает на Nano и на Uno достаточно долго уже.
А в Nano тоже optiboot? Я так понял, что, по умолчанию таймер только с ним нормально работает.
Все свои Pro Micro перешил с optiboot - теперь таймер работает как часы.
Так как блок кнопок и индикации планирую выносной , переделел схему и скетч. Если кому будет интересно-выложу
Думаю, это будет интересно. Только было бы удобнее создать под Ваш проект новую тему, он ведь уже дорос до этого ?
Но это же часть умной ванны,хорошо ,больше флудить не буду)
Но это же часть умной ванны,хорошо ,больше флудить не буду)
Я не считаю себя начальником данной темы, просто так было бы легче найти и получить нужную информацию.
Araris ,у Вас хорошо срабатывает включение света в ванной?
С аквасторожем переехал сюда http://arduino.ru/forum/proekty/sistema-zashchity-ot-protechki-vody
Araris ,у Вас хорошо срабатывает включение света в ванной?
Даже идеально срабатывает. Там два датчика дублируют друг друга - УЗ-датчик HC-SR04 и ИК-свитч, один из тех, что на картинке тут http://arduino.ru/forum/proekty/umnye-tualet-i-vannaya?page=5#comment-33494. В паре они определяют и "держат" посетителя безошибочно. Когда был один УЗ - бывали проблемы.
пытаюсь повесит датчики на прерывания ,но знаний катастрафически не хватает:
001
int
IR_SWITCH1_PIN=2;
// pin connected to IR switch 1
002
int
IR_SWITCH2_PIN=3 ;
// pin connected to IR switch 2
003
004
int
ledPin = 13;
005
006
int
IR1_state=0;
007
bool
IR2_state=0;
008
bool
IR1_already=0;
009
bool
IR2_already=0;
010
bool
IR1IR2_already=0;
011
int
IR1IR2_first=0;
012
int
Human_Counter_New=0;
013
int
Human_Counter_Old=0;
014
015
void
setup
()
016
{
017
Serial
.begin(9600);
018
pinMode(IR_SWITCH1_PIN, INPUT);
019
pinMode(IR_SWITCH2_PIN, INPUT);
020
pinMode(ledPin, OUTPUT);
021
attachInterrupt(0, IR1,CHANGE);
022
attachInterrupt(1, IR2,CHANGE);
023
024
}
025
void
loop
()
026
{
027
IR1_state = digitalRead(IR_SWITCH1_PIN);
// inverse
028
IR2_state = digitalRead(IR_SWITCH2_PIN);
// inverse
029
////////// Analyze Human_Counter_New
030
if
( Human_Counter_New != Human_Counter_Old )
031
{
032
Human_Counter_Old = Human_Counter_New;
033
Serial
.print(
"Human_Counter = "
);
034
Serial
.println(Human_Counter_New);
035
}
036
if
( Human_Counter_New > 0)
037
{
038
digitalWrite(ledPin,HIGH);
039
}
040
else
{
041
digitalWrite(ledPin,LOW);
042
043
}
044
}
045
046
void
IR1()
047
{
048
049
if
( !IR1_state && !IR2_state)
// IR1 off, IR2 off.
050
{
051
////////// Analyze
052
if
( IR1IR2_first > 0 && IR1IR2_already && IR1_already && IR2_already)
053
{
054
if
( IR1IR2_first == 1) {
055
Human_Counter_New++;
056
Serial
.println(Human_Counter_New);
057
}
058
else
{
059
Human_Counter_New--;
060
}
061
Serial
.println(
"IR1 off, IR2 off."
);
062
}
063
IR1_already = 0;
064
IR2_already = 0;
065
IR1IR2_already = 0;
066
IR1IR2_first = 0;
067
}
068
}
069
void
IR2(){
070
071
if
( IR1_state && !IR2_state)
// IR1 on, IR2 off.
072
{
073
IR1_already = 1;
074
if
( !IR2_already ) {
075
IR1IR2_first = 1;
076
}
077
Serial
.print(
"first = "
);
078
Serial
.print(IR1IR2_first);
079
Serial
.println(
" IR1 on, IR2 off."
);
080
}
081
if
( !IR1_state && IR2_state)
// IR1 off, IR2 on.
082
{
083
IR2_already = 1;
084
if
( !IR1_already ) {
085
IR1IR2_first = 2;
086
}
087
Serial
.print(
"first = "
);
088
Serial
.print(IR1IR2_first);
089
Serial
.println(
" IR1 off, IR2 on."
);
090
}
091
if
( IR1_state && IR2_state)
// IR1 on, IR2 on.
092
{
093
IR1IR2_already = 1;
094
Serial
.print(
"first = "
);
095
Serial
.print(IR1IR2_first);
096
Serial
.print(
" IR1IR2_already"
);
097
Serial
.println(
" IR1 on, IR2 on."
);
098
}
099
if
( Human_Counter_New < 0 ) {
100
Human_Counter_New = 0;
101
}
102
}
дальше first = 1 IR1 on, IR2 off. дело не идет.
Видел Ваш полный скетч для ванны ,но как отсечь все лишнее для меня пока не понял( оставить ИК и PIR датчики )
я правильно понимаю что скетч для ванной : AVSmartWC ?
С прерываниями людей считать будет посложнее в том смысле, что придется менять блок-схему(логику) скетча.
В скетче AVSmartWC на прерывании висит кнопка ручного включения, это совсем другая история.
Значит надо прикручивать PIR датчик,только пока не знаю как :) . Если я правильно понял у Вас в этом скетче утразвукой датчик , а ИК датчиков там нет.
Свободный датчик есть ....
Значит надо прикручивать PIR датчик,только пока не знаю как :) . Если я правильно понял у Вас в этом скетче утразвукой датчик , а ИК датчиков там нет.
Есть там оба датчика. ИК датчик в скетче представлен тремя строками :
#define IR_SWITCH_PIN 4 // pin connected to IR switch
...
pinMode(IR_SWITCH_PIN, INPUT);
...
if (!digitalRead(IR_SWITCH_PIN)) { CurDistance = 55; }
Совсем запутался :)
Araris простите за мой тупизм,я правильно понял используется :
Pir датчик одна штука, утрасоник одна штука, ИК датчик одна штука, то есть подсчет людей не используется?
Pir датчик одна штука, утрасоник одна штука, ИК датчик одна штука, то есть подсчет людей не используется?
Pir датчик - не используется.
Ультрасоник - одна штука
ИК датчик - одна штука.
Подсчет людей - не используется.
ультрасоник над дверю в ванной висит? собрал на макетке ,залил Ваш скетч,включает и по ИК датчику и по сонику,не могу понять при каком условии выключается.
Сорри если достал своими вопросами
ультрасоник над дверю в ванной висит? собрал на макетке ,залил Ваш скетч,включает и по ИК датчику и по сонику,не могу понять при каком условии выключается.
Сорри если достал своими вопросами
Да без проблем. Итак, речь идет о туалете, вот фото, как все выглядит
сверху УЗ, под ним ИК. Они работают параллельно, то есть дублируя друг друга, ну, так исторически сложилось. Если бы я делал все сызнова, был бы только ИК.
При каком условии выключается, нууу, там логика достаточно хитроделанная, думаю, Вам проще было бы по-своему расписать, сначала по-простому, а затем усложняя по потребности.
С туалетом все просто,а вот с ванной гораздо сложнее ,там ультрасоник не всегда тебя видит )
С туалетом все просто,а вот с ванной гораздо сложнее ,там ультрасоник не всегда тебя видит )
Согласен. Тема ванной у меня пока "не раскрыта". Там светом управляет PIR-датчик с таймером, вообще не связанный с Ардуиной.
у меня к сожалению туалет и ванна один обьект , свет зажигается в процентах 90. Стоит пройти несколько раз туда -сюда и начинает нормально работать...
Есть еще одна мысль для бОльшей площади помещения : комбинация датчика пересечения дверного проема (1) с датчиком движения (2).
Последовательность срабатывания (1) -> (2) - кто-то зашел и присутствует,
(2) -> (1) -> (2) - кто-то вышел, но кто-то еще присутствует,
(1) -> (2) -> (нет сработок) - кто-то вышел и никто не присутствует.
Я вчера об этом думал. Как раз это и искал в Вашем скетче ))))
Я вчера об этом думал. Как раз это и искал в Вашем скетче ))))
)))
Описанный алгоритм тоже не идеален, но это гораздо лучше, чем просто один датчик движения.
С одним датчиком движения вообще не вариант,пробывал )
забавно когда ты присел около ванны спиной к датчику и он выключается,хотя ты в это время помешиваешь раствор руками в ванночке )
Блок управления для ванной ( 3 в 1) готов )


нарядно!
Этп плата прекрасна!
На мой взгляд, Ардуинка там слегка лишняя. ATMEGA328P на панельки с одним кварцем гораздо лучше бы смотрелся.
Недавно открыл такие блоки питания - очень хороши для таких плат
Впечатляющая конструкция, завидую белой завистью, респект автору.
Этп плата прекрасна!
На мой взгляд, Ардуинка там слегка лишняя. ATMEGA328P на панельки с одним кварцем гораздо лучше бы смотрелся.
Недавно открыл такие блоки питания - очень хороши для таких плат
Есть аналогичные блоки питания и даже вроде дешевле,парочка таких работает и претензий вроде нет
http://www.ebay.com/itm/261347213330?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1439.l2649 . Но этот блок несет на себе ещё функцию контроллера защиты от протечки воды и имеется ИБП на 12 вольт,поэтому питание внешнее. Думал я о голых чипах. Удобно когда надо уменьшить размеры,но у меня всё в процессе настройки :)) . Да и в наличии у меня их нет сейчас,причем цена такая же почти как про мини,поэтому пока не вижу смысла. Плата пока не окончательный вариант,не учел того момента что симисторный ключь не хочет управлять очень маломощной нагрузкой ( вентилятор вытяжки ) придется один канал переделывать на обычное реле. Да и с интефейсом телеметрии пока не решил )))
Проблема с невключением вытяжки решилась малой кровью, переделку платы пока можно отложить :)
Вот и сам виновник,новый с упаковки,купленный на алиэкспрес
P.S. Датчики прохода стали отрабатывать более четко.
Путем эксперементов пришел к выводу что ИК датчики прохода работают если залить голый скетчь,даже без вывода в сериал....
01
#define IR_SWITCH1_PIN 2 // pin connected to IR switch 1
02
#define IR_SWITCH2_PIN 3 // pin connected to IR switch 2
03
int
ledPin = 17;
04
05
bool
IR1_state=0;
06
bool
IR2_state=0;
07
bool
IR1_already=0;
08
bool
IR2_already=0;
09
bool
IR1IR2_already=0;
10
int
IR1IR2_first=0;
11
int
Human_Counter_New=0;
12
int
Human_Counter_Old=0;
13
14
void
setup
()
15
{
16
pinMode(IR_SWITCH1_PIN, INPUT);
17
pinMode(IR_SWITCH2_PIN, INPUT);
18
pinMode(ledPin, OUTPUT);
19
}
20
21
void
loop
()
22
{
23
IR1_state = digitalRead(IR_SWITCH1_PIN);
// inverse
24
IR2_state = digitalRead(IR_SWITCH2_PIN);
// inverse
25
if
( !IR1_state && !IR2_state)
// IR1 off, IR2 off.
26
{
27
if
( IR1IR2_first > 0 && IR1IR2_already && IR1_already && IR2_already)
28
{
29
if
( IR1IR2_first == 1) {
30
Human_Counter_New++;
31
}
32
else
{
33
Human_Counter_New--;
34
}
35
}
36
IR1_already = 0;
37
IR2_already = 0;
38
IR1IR2_already = 0;
39
IR1IR2_first = 0;
40
}
41
if
( IR1_state && !IR2_state)
// IR1 on, IR2 off.
42
{
43
IR1_already = 1;
44
if
( !IR2_already ) {
45
IR1IR2_first = 1;
46
}
47
}
48
if
( !IR1_state && IR2_state)
// IR1 off, IR2 on.
49
{
50
IR2_already = 1;
51
if
( !IR1_already ) {
52
IR1IR2_first = 2;
53
}
54
}
55
if
( IR1_state && IR2_state)
// IR1 on, IR2 on.
56
{
57
IR1IR2_already = 1;
58
}
59
if
( Human_Counter_New < 0 ) {
60
Human_Counter_New = 0;
61
}
62
if
( Human_Counter_New != Human_Counter_Old )
63
{
64
Human_Counter_Old = Human_Counter_New;
65
}
66
if
( Human_Counter_New > 0)
67
{
68
digitalWrite(ledPin,HIGH);
69
}
70
else
{
71
digitalWrite(ledPin,LOW);
72
}
73
}
Подумавываю под это дело использовать отдельно atmega8 .... А ещё лучше aTtiny13,как раз есть в загашнике