Автоматическое включение света и вентилятора
- Войдите на сайт для отправки комментариев
Вс, 01/02/2015 - 13:30
Ребята подскажите не опытному,хочу сделать в помещение автоматическое включение света и вентилятора на ардуино,тоесть зашел человек датчик его увидел,включил свет и если человек находится там более 2х минут,включилась вытяжка на 10минут ,и при выходе человека из помещения свет гаснул а вытяжка работала заданое время,подскажите в какую сторону копать,как обнаружить и включить я знаю,а как сделать промежуток не знаю.
Смотри тута
Cпасибо! но ни чего полезного для себя не нашел
01
unsigned
long
previousMillis = 0;
02
long
interval = 600000;
//интервал в миллисекундах (10 минут)
03
04
unsigned
long
currentMillis = millis();
05
if
(currentMillis - previousMillis > interval)
06
{
07
previousMillis = currentMillis;
08
//тут делаем что надо через заданное время
09
//включаем выключаем и прочее
10
}
Большое спасибо! буду разбиратся
Здравствуйте! Penni,подскажите пожалуйста как прописать что бы мигала два светодиода с разным промежутком времени
Можно использовать вот это http://alxarduino.blogspot.ru/2013/09/ComfortablyBlinkWithoutDelay.html тогда код будет красивый и легкочитаемый.
Практически тоже самое кодом
01
#define BLINK_INTERVAL1 1000
02
#define BLINK_INTERVAL2 2000
03
04
unsigned
long
prevBlinkTime1 = 0;
05
unsigned
long
prevBlinkTime2 = 0;
06
07
unsigned
long
currentMillis = millis();
08
if
(currentMillis - previousMillis > BLINK_INTERVAL1)
09
{
10
prevBlinkTime1 = currentMillis;
11
//тут мигаем одним светодиодом
12
}
13
14
currentMillis = millis();
15
if
(currentMillis - previousMillis > BLINK_INTERVAL2)
16
{
17
prevBlinkTime2 = currentMillis;
18
//тут мигаем другим светодиодом
19
}
Ну спасибо вам большое!
Извеняюсь, у меня там ошибка, в 8 и 15 строках соответственно вместо previousMillis надо писать prevBlinkTime1 и prevBlinkTime2
Bсе получилось благодарю за подсказку
Еще такой вопрос у меня к вам,не могу разобратся что бы при нажатии на кнопку начанал мигать,через if вылазиют ошибки,поскажите если не трудно
А при отпускании или повторном нажатии ничего не должно происходить? Просто нажали и начало мигать с определенным интервалом? Если так то можно считывать кнопку и как тоьлко её нажали взвести флаг и этот флаг проверять перед тем как мигать, как то так
1
boolean ButtonPress =
false
;
2
3
pinMode(
"pin name"
, INPUT);
4
5
if
((digitalRead(
"pin name"
)==HIGH)&&(!ButtonPress))
6
ButtonPress=
true
;
Первая строка флаг для отслеживания кнопки, вторая это в сетап настройка пина для кнопки, условие вставляете в loop вначале.
В 11 или 18 строке 6ого поста не просто мигаем светодиодом, а сначало через if проверяем надо ли моргать или нет.
1
if
(ButtonPress)
2
{
3
// мигаем
4
}
Тогда через заданный интервал сначало будет проверяться флаг ButtonPress и если он true то мигаем, если false то не мигаем.
Ну это если я правильно понял
Нет ни чего ,отпустил потух,благодарю за помощь
Не понял ,какого поста?
6 (шесть) пост в этой теме
Но если надо чтобы при отпускании переставал моргать, то надо немного по другому.
1
if
(digitalRead(
"pin name"
)==HIGH)
2
ButtonPress=
true
;
3
else
4
ButtonPress=
false
;
Тогда пока держим кнопку светодиод моргает с заданным интервалом, когда отпустили он перестал моргать.
Почему то он без нажатия кнопки начинает мигать
Разобрался))) еще вопрос можно,связанный со временем?
Подскажите пожалуйста еще один пример,кнопка включена,после включения кнопки диод загорается через 2секунды,после выключения кнопки диод гаснет не сразу а так же через две секунды
Подскажите пожалуйста еще один пример,кнопка включена,после включения кнопки диод загорается через 2секунды,после выключения кнопки диод гаснет не сразу а так же через две секунды
По коду так и есть. Можно сделать чтобы сразу погас. Можно вот это кусок
1
if
(digitalRead(
"pin name"
)==HIGH)
2
ButtonPress=
true
;
3
else
4
ButtonPress=
false
;
заменить на такой
1
if
(digitalRead(
"pin name"
)==HIGH)
2
ButtonPress=
true
;
3
else
4
{
5
ButtonPress=
false
;
6
digitalWrite(
"led pin name"
, LOW);
7
}
Тогда как только отпустите кнопку светодиод сразу погаснет, не дожидаясь выполнения условия по времени.
Вы настоящий друг,Спасибо!
01
#define BLINK_INTERVAL1 5000
02
#define BLINK_INTERVAL2 3000
03
#define BLINK_INTERVAL3 10000
04
#define LED1 13
05
#define LED2 12
06
unsigned
long
prevBlinkTime1 = 0;
// здесь храниться время последнего изменения состояния светодиода
07
unsigned
long
prevBlinkTime2 = 0;
// здесь храниться время последнего изменения состояния светодиода
08
unsigned
long
prevBlinkTime3 = 0;
// здесь будет храниться время последнего изменения состояния светодиода
09
boolean DAT1Press =
false
;
10
11
int
DAT1= A1;
12
13
void
setup
()
14
{
15
pinMode(DAT1, INPUT);
16
// задаем режим выхода для порта, подключенного к светодиоду
17
pinMode(LED1, OUTPUT);
// устанавливаем порт, как выход
18
pinMode(LED2, OUTPUT);
// устанавливаем порт, как выход
19
}
20
21
void
loop
()
22
{
23
24
if
(digitalRead(DAT1)==HIGH)
25
{
26
DAT1Press=
true
;
27
digitalWrite(LED2,HIGH );
28
}
29
unsigned
long
currentMillis = millis();
30
if
(currentMillis - prevBlinkTime1 > BLINK_INTERVAL1)
31
{
32
prevBlinkTime1 = currentMillis;
33
digitalWrite(LED2,LOW);
34
}
35
36
if
(currentMillis - prevBlinkTime2 > BLINK_INTERVAL2)
37
{
38
prevBlinkTime2 = currentMillis;
39
digitalWrite(LED1,HIGH);
40
}
41
if
(currentMillis - prevBlinkTime3 > BLINK_INTERVAL3)
42
{
43
prevBlinkTime3 = currentMillis;
44
digitalWrite(LED1,LOW);
45
}
46
}
47
48
49
Подскажите мне еще пожалуйста,вот код,то есть при нажатии на кнопку загорается первый светодиод на 12 порту ,при отпускании он через через 5 секунд гаснет,при длительном нажатии должен загорется 2й светодиод на 13 порту ,и при отпускании кнопки он должен светится 10 секунд и гаснуть,оно так делает,только причина в том если на кнопку не нажимать он все равно загорается и гаснет бесконечно,какое условие нужно поставить?
Что-то у Вас каша какая то получилась из кода. Всё что с 29 строчки и ниже будет выполняться на каждом цикле и без разницы нажата или отпущена кнопка. DAT1Press у Вас вообще не используется, один раз ей присваивается значение и все. Что значит длительное нажатие? Как Вы его отслеживать собрались, по времени? Длинное это 1 секунда или сколько? Сегодня уже спать пора, завтра поглядим.
Вообщем должно работать так,нажимаю и держу кнопку,загорелся первый светодиод,спустя пять секунд загорелся второй светодиод,отпускаю кнопку,первый гаснет спустя две секунды,второй спутя десять секунд
Вот теперь понятно, обед будет гляну
На обеде времени не появилось лишнего. Дома на макетке накидал кнопку и светодиоды и получился такой код. На оптимальность не претендую, но описанные действия выполняет.
01
#define ButtonPin 2 // пин куда подключаем кнопку
02
#define LED1Pin 12 // пин с первым светодиодом
03
#define LED2Pin 13 // пин со вторым светодиодом
04
05
#define LED1StopDelay 2000 // задержка выключения первого светодиода
06
07
#define LED2StartDelay 5000 // задержка включения второго светодиода
08
#define LED2StopDelay 10000 // задержка выключения второго светодиода
09
10
unsigned
long
ButtonPressTime = 0;
// время нажатия кнопки
11
unsigned
long
ButtonReleaseTime = 0;
// время отпускания кнопки
12
13
byte
ButtonFlag = 0;
//флаг для типа избавления от дребезка и выполнения кода один раз
14
15
void
setup
()
16
{
17
pinMode(ButtonPin, INPUT);
18
pinMode(LED1Pin, OUTPUT);
19
pinMode(LED2Pin, OUTPUT);
20
digitalWrite(LED1Pin, LOW);
21
digitalWrite(LED2Pin, LOW);
22
}
23
24
void
loop
()
25
{
26
// если нажали кнопку и до этого она была не нажата
27
if
(digitalRead(ButtonPin)==HIGH&&ButtonFlag==0)
28
{
29
ButtonFlag = 1;
30
ButtonReleaseTime = 0;
31
// запоминаем время начатия
32
ButtonPressTime = millis();
33
// включаем первый светодиод
34
digitalWrite(LED1Pin, HIGH);
35
}
36
// если кнопку отпустили
37
if
(digitalRead(ButtonPin)==LOW&&ButtonFlag==1)
38
{
39
ButtonFlag = 2;
40
ButtonPressTime = 0;
41
// запоминаем время отпускания
42
ButtonReleaseTime = millis();
43
}
44
// если кнопка нажата
45
if
(ButtonFlag==1)
46
{
47
// ждём заданное время и зажигаем второй светодиод
48
if
(millis() - ButtonPressTime > LED2StartDelay)
49
digitalWrite(LED2Pin, HIGH);
50
}
51
// если отпустили кнопку
52
if
(ButtonFlag==2)
53
{
54
// ждем заданное время и гасим первый светодиод
55
if
(millis() - ButtonReleaseTime > LED1StopDelay)
56
{
57
digitalWrite(LED1Pin, LOW);
58
// если второй светодиод еще не успел загореться то флаг в начальное значение сбрасываем
59
if
(digitalRead(LED2Pin)==LOW)
60
{
61
ButtonReleaseTime=0;
62
ButtonFlag=0;
63
}
64
}
65
// ждем заданное время и гасим второй светодиод и сбрасываем флаги
66
// типа начальное состояние готовы к новому циклы работы
67
if
(millis() - ButtonReleaseTime > LED2StopDelay)
68
{
69
digitalWrite(LED2Pin, LOW);
70
ButtonReleaseTime=0;
71
ButtonFlag=0;
72
}
73
}
74
}
Спасибо! терпеливый вы человек,другой бы давно послал,буду изучать,еще раз спасибо за помощь.
Penni здравствуйте! опять я с вопросом,подскажите как сгенерировать 36кгц на ардуино?
Честно никогда не занимался подобным, но думаю вот тут найдете все что надо http://cxem.net/arduino/arduino62.php
Penni, Здравствуйте! У меня в чем то похожая проблемма. Нужно включить двухканальное реле. Сначала 1 канал на 5 секунд потом оба канала на 5 секунд одновременно, потом опять только первый канал и опять оба. Включать нужно через определенный период который выбирается кнопками в меню, период устанавливается, в этом проблемм нет, проблемка в том что не могу включать второй раз одновременно - идет разброс время включения + время ожидания.
Хотел привязать скетч, найденым на этом форуме http://arduino.ru/forum/programmirovanie/kak-vklyuchit-na-nekotoroe-vremya но как я сказал выше идет разброс, через несколько включений совпадает что включаются одновременно, а потом опять не вместе. Помогите пожалуйста или подскажите как сделать что б время ожидания совпадало.
Т.е. включается первый канал на 5ть секунд, выключается. Ждём заданный промежуток времени и включаем оба канала на 5ть секунд и так по кругу?
Да, именно так
Можно вот так сделать. Там уже код вставите как надо, у меня просто в лупе крутится, поэтому когда весь цикл проходит и оба канала отключаются, тут же включается первый и пошло всё снова.
01
#define channel1pin 12
02
#define channel2pin 13
03
#define work_interval 5000 // время работы канала
04
#define idle_interval 10000 // время между включениями каналов
05
06
unsigned
long
prevMillis = 0;
07
byte
state = 0;
08
09
void
setup
()
10
{
11
pinMode(channel1pin, OUTPUT);
12
pinMode(channel2pin, OUTPUT);
13
}
14
15
void
loop
()
16
{
17
if
(!state)
18
digitalWrite(channel1pin, HIGH);
19
unsigned
long
currentMillis = millis();
20
if
((currentMillis - prevMillis > work_interval) && (state==0 || state==2))
21
{
22
prevMillis = currentMillis;
23
switch
(state)
24
{
25
case
0:
26
digitalWrite(channel1pin, LOW);
27
state = 1;
28
break
;
29
case
2:
30
digitalWrite(channel1pin, LOW);
31
digitalWrite(channel2pin, LOW);
32
state = 0;
33
break
;
34
}
35
}
36
currentMillis = millis();
37
if
(currentMillis - prevMillis > idle_interval && state==1)
38
{
39
prevMillis = currentMillis;
40
digitalWrite(channel1pin, HIGH);
41
digitalWrite(channel2pin, HIGH);
42
state = 2;
43
}
44
}
Если надо чтобы после отключения двух каналов опять выдерживалась пауза заданная то можно ввести state = 3 в 37 строке добавить || state==3 в условии сделать switch(state) по case 1 выполнять те строки что есть (с 39 по 42) а по case 3 делать просто state=0;
С первым примером включается 1 канал на 5 сек через 5 сек включается 2 канал и оба включены 10 сек, потом оба выключаются на 5 сек
после добавления корректировок получился такой код:
01
#define channel1pin 12
02
#define channel2pin 13
03
#define work_interval 5000 // время работы канала
04
#define idle_interval 10000 // время между включениями каналов
05
06
unsigned
long
prevMillis = 0;
07
byte
state = 0;
08
09
void
setup
()
10
{
11
pinMode(channel1pin, OUTPUT);
12
pinMode(channel2pin, OUTPUT);
13
14
}
15
16
void
loop
()
17
{
18
if
(!state)
19
digitalWrite(channel1pin, LOW);
20
unsigned
long
currentMillis = millis();
21
if
((currentMillis - prevMillis > work_interval) && (state==0 || state==2))
22
{
23
prevMillis = currentMillis;
24
switch
(state)
25
{
26
case
0:
27
digitalWrite(channel1pin, HIGH);
28
state = 1;
29
break
;
30
case
1:
31
prevMillis = currentMillis;
32
digitalWrite(channel1pin, LOW);
33
digitalWrite(channel2pin, LOW);
34
state = 2;
35
case
2:
36
digitalWrite(channel1pin, HIGH);
37
digitalWrite(channel2pin, HIGH);
38
state = 0;
39
break
;
40
case
3:
41
state = 0;
42
break
;
43
}
44
}
45
currentMillis = millis();
46
if
(currentMillis - prevMillis > idle_interval && state==1 || state==3)
47
{
48
prevMillis = currentMillis;
49
digitalWrite(channel1pin, LOW);
50
digitalWrite(channel2pin, LOW);
51
state = 2;
52
}
53
}
Включаются оба канала, через 5 сек второй выключается, через 5 сек выключается первый, потом 10 секунд выключены оба и заново.
Может я не так что то исправил?
что-то вообще не то пока.
Вот написал с использованием delay - работает как надо, но смысла нет потому что там еще куча всего должно работать) может поможет
01
#define channel1pin 15
02
#define channel2pin 16
03
#define work_interval 1000 // время работы канала
04
#define idle_interval 5000 // время между включениями каналов
05
06
unsigned
long
prevMillis = 0;
07
byte
state = 0;
08
09
void
setup
()
10
{
11
pinMode(channel1pin, OUTPUT);
12
pinMode(channel2pin, OUTPUT);
13
digitalWrite(channel1pin, HIGH);
14
digitalWrite(channel2pin, HIGH);
15
}
16
17
void
loop
()
18
{
19
digitalWrite(channel1pin, LOW);
20
delay(work_interval);
21
digitalWrite(channel1pin, HIGH);
22
digitalWrite(channel2pin, HIGH);
23
delay(idle_interval);
24
digitalWrite(channel1pin, LOW);
25
digitalWrite(channel2pin, LOW);
26
delay(work_interval);
27
digitalWrite(channel1pin, HIGH);
28
digitalWrite(channel2pin, HIGH);
29
delay(idle_interval);
30
}
Ну вот у меня лежит мега 2560 к ней светодиод вместо реле подключен и + встроенный светодиод, тот код что я кидал работает, загорается первый на 5ть секунд, гаснет на 10, загораются оба светодиода, горят пять секунд гаснут и так по кругу. Сечас еще раз скетч загружу гляну может вечером вчера мне казалось иначе..
UPD залил еще раз проверил всё работает как описано, могу видео заснять :)
Странно, а я уже седеть начинаю)
Вот не менял пины скопировал как есть - теперь зажигается 1 канал, выключается и сразу же включается встроенный диод, горит 5 сек и выключается, оба не горят потом опять по циклу
у меня про мини если это имеет какое то значение
Ну даже не знаю... у меня нет про мини чтобы попробовать не думаю что есть какая-то разница. Ну что там может быть millis чтоли по другому работает... Всё как обычно просто, надо только догадаться :)
Единственное у вас реле включаются когда LOW а выключаются когда HIGH у меня со светодиодами соответственно наоборот. Т.е. в том коде что я давал надо HIGH на LOW поменять и LOW на HIGH, ну я думаю поменяли же. В общем надо как обычно отвлечься от проблемы и она сама решиться в голове :)
/
Penni привет! у меня опять вопрос ,нет ли у вас примера бегущий строки на олед дисплеи?
01
void
testscrolltext(
void
) {
02
display.setTextSize(2);
03
display.setTextColor(WHITE);
04
display.setCursor(10,0);
05
display.clearDisplay();
06
display.println(
"scroll"
);
07
display.display();
08
09
display.startscrollright(0x00, 0x0F);
10
delay(2000);
11
display.stopscroll();
12
delay(1000);
13
display.startscrollleft(0x00, 0x0F);
14
delay(2000);
15
display.stopscroll();
16
delay(1000);
17
display.startscrolldiagright(0x00, 0x07);
18
delay(2000);
19
display.startscrolldiagleft(0x00, 0x07);
20
delay(2000);
21
display.stopscroll();
22
}
вот такой пример есть но не так работает как хотелось
Не, у меня нет, никогда с олед дело не имел, но думаю кто-то обязательно покажет. А как не так работает может этот пример можно поправить?
он работает так,при включении слово стоит вверху,потом начинает двигатся вправо ,влево,и после этого идет с низу вверх,также двигаясь в право и влево
А Вам надо чтобы только в одной строке туда сюда двигалось? По диагонали это 17 и 19 строки делают, уберите их и слово будет только в одной строке двигаться.
чтобы слово прошло с право влево и конец
для чего нужны вот эти значения (0x00, 0x07);
У меня нет библиотеки этой, но на гидхабе в описании написано, что это стартовая и конечная позиция. А какое разрешение у экрана?
128x64