Автоматическое включение света и вентилятора

mrbin
Offline
Зарегистрирован: 01.02.2015

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

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

Смотри тута

mrbin
Offline
Зарегистрирован: 01.02.2015

Cпасибо! но ни чего полезного для себя не нашел

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015
01unsigned long previousMillis = 0;
02long interval = 600000; //интервал в миллисекундах (10 минут)
03 
04unsigned long currentMillis = millis();
05if(currentMillis - previousMillis > interval)
06{
07  previousMillis = currentMillis;
08  //тут делаем что надо через заданное время
09  //включаем выключаем и прочее
10}

 

mrbin
Offline
Зарегистрирован: 01.02.2015

Большое спасибо! буду разбиратся

 

mrbin
Offline
Зарегистрирован: 01.02.2015

Здравствуйте! Penni,подскажите пожалуйста как прописать что бы мигала два светодиода с разным промежутком времени

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Можно использовать вот это http://alxarduino.blogspot.ru/2013/09/ComfortablyBlinkWithoutDelay.html тогда код будет красивый и легкочитаемый.

Практически тоже самое кодом

01#define BLINK_INTERVAL1 1000
02#define BLINK_INTERVAL2 2000
03 
04unsigned long prevBlinkTime1 = 0;
05unsigned long prevBlinkTime2 = 0;
06 
07unsigned long currentMillis = millis();
08if(currentMillis - previousMillis > BLINK_INTERVAL1)
09{
10  prevBlinkTime1 = currentMillis;
11  //тут мигаем одним светодиодом
12}
13 
14currentMillis = millis();
15if(currentMillis - previousMillis > BLINK_INTERVAL2)
16{
17  prevBlinkTime2 = currentMillis;
18  //тут мигаем другим светодиодом
19}

 

mrbin
Offline
Зарегистрирован: 01.02.2015

Ну спасибо вам большое!

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Извеняюсь, у меня там ошибка, в 8 и 15 строках соответственно вместо previousMillis надо писать prevBlinkTime1 и prevBlinkTime2

mrbin
Offline
Зарегистрирован: 01.02.2015

Bсе получилось благодарю за подсказку

mrbin
Offline
Зарегистрирован: 01.02.2015

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

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

А при отпускании или повторном нажатии ничего не должно происходить? Просто нажали и начало мигать с определенным интервалом? Если так то можно считывать кнопку и как тоьлко её нажали взвести флаг и этот флаг проверять перед тем как мигать, как то так

1boolean ButtonPress = false;
2 
3pinMode("pin name", INPUT);
4 
5if ((digitalRead("pin name")==HIGH)&&(!ButtonPress))
6  ButtonPress=true;

Первая строка флаг для отслеживания кнопки, вторая это в сетап настройка пина для кнопки, условие вставляете в loop вначале.

В 11 или 18 строке 6ого поста не просто мигаем светодиодом, а сначало через if проверяем надо ли моргать или нет.

1if(ButtonPress)
2{
3  // мигаем
4}

Тогда через заданный интервал сначало будет проверяться флаг ButtonPress и если он true то мигаем, если false то не мигаем.

Ну это если я правильно понял

mrbin
Offline
Зарегистрирован: 01.02.2015

Нет ни чего ,отпустил потух,благодарю за помощь

mrbin
Offline
Зарегистрирован: 01.02.2015

Не понял ,какого поста?

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

6 (шесть) пост в этой теме

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Но если надо чтобы при отпускании переставал моргать, то надо немного по другому.

1if (digitalRead("pin name")==HIGH)
2  ButtonPress=true;
3else
4  ButtonPress=false;

Тогда пока держим кнопку светодиод моргает с заданным интервалом, когда отпустили он перестал моргать.

mrbin
Offline
Зарегистрирован: 01.02.2015

Почему то он без нажатия кнопки начинает мигать

mrbin
Offline
Зарегистрирован: 01.02.2015

Разобрался))) еще вопрос можно,связанный со временем?

 

mrbin
Offline
Зарегистрирован: 01.02.2015

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

 

mrbin
Offline
Зарегистрирован: 01.02.2015

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

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

По коду так и есть. Можно сделать чтобы сразу погас. Можно вот это кусок

1if (digitalRead("pin name")==HIGH)
2  ButtonPress=true;
3else
4  ButtonPress=false;

заменить на такой

1if (digitalRead("pin name")==HIGH)
2  ButtonPress=true;
3else
4{
5  ButtonPress=false;
6  digitalWrite("led pin name", LOW);
7}

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

mrbin
Offline
Зарегистрирован: 01.02.2015

Вы настоящий друг,Спасибо!

mrbin
Offline
Зарегистрирован: 01.02.2015
01#define BLINK_INTERVAL1 5000
02#define BLINK_INTERVAL2 3000
03#define BLINK_INTERVAL3 10000
04#define LED1  13
05#define LED2  12
06unsigned long prevBlinkTime1 = 0;// здесь храниться время последнего изменения состояния светодиода
07unsigned long prevBlinkTime2 = 0;// здесь храниться время последнего изменения состояния светодиода
08unsigned long prevBlinkTime3 = 0;// здесь будет храниться время последнего изменения состояния светодиода
09boolean DAT1Press = false;
10 
11int DAT1= A1;
12 
13void setup()
14{
15  pinMode(DAT1, INPUT);
16  // задаем режим выхода для порта, подключенного к светодиоду
17  pinMode(LED1, OUTPUT);  // устанавливаем порт, как выход   
18  pinMode(LED2, OUTPUT);  // устанавливаем порт, как выход
19}
20 
21void 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 секунд и гаснуть,оно так делает,только причина в том если на кнопку не нажимать он все равно загорается и гаснет бесконечно,какое условие нужно поставить?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Что-то у Вас каша какая то получилась из кода. Всё что с 29 строчки и ниже будет выполняться на каждом цикле и без разницы нажата или отпущена кнопка. DAT1Press у Вас вообще не используется, один раз ей присваивается значение и все. Что значит длительное нажатие? Как Вы его отслеживать собрались, по времени? Длинное это 1 секунда или сколько? Сегодня уже спать пора, завтра поглядим.

mrbin
Offline
Зарегистрирован: 01.02.2015

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

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Вот теперь понятно, обед будет гляну

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

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

 

mrbin
Offline
Зарегистрирован: 01.02.2015

Спасибо! терпеливый вы человек,другой бы давно послал,буду изучать,еще раз спасибо за помощь.

mrbin
Offline
Зарегистрирован: 01.02.2015

Penni здравствуйте! опять я с вопросом,подскажите как сгенерировать  36кгц на ардуино?

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Честно никогда не занимался подобным, но думаю вот тут найдете все что надо http://cxem.net/arduino/arduino62.php

Demos
Offline
Зарегистрирован: 21.02.2015

Penni, Здравствуйте! У меня в чем то похожая проблемма. Нужно включить двухканальное реле. Сначала 1 канал на 5 секунд потом оба канала на 5 секунд одновременно, потом опять только первый канал и опять оба. Включать нужно через определенный период который выбирается кнопками в меню, период устанавливается, в этом проблемм нет, проблемка в том что не могу включать второй раз одновременно - идет разброс время включения + время ожидания.

Хотел привязать скетч, найденым на этом форуме http://arduino.ru/forum/programmirovanie/kak-vklyuchit-na-nekotoroe-vremya  но как я сказал выше идет разброс, через несколько включений совпадает что включаются одновременно, а потом опять не вместе. Помогите пожалуйста или подскажите как сделать что б время ожидания совпадало.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Т.е. включается первый канал на 5ть секунд, выключается. Ждём заданный промежуток времени и включаем оба канала на 5ть секунд и так по кругу?

Demos
Offline
Зарегистрирован: 21.02.2015

Да, именно так

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Можно вот так сделать. Там уже код вставите как надо, у меня просто в лупе крутится, поэтому когда весь цикл проходит и оба канала отключаются, тут же включается первый и пошло всё снова.

01#define channel1pin 12
02#define channel2pin 13
03#define work_interval 5000 // время работы канала
04#define idle_interval 10000 // время между включениями каналов
05 
06unsigned long prevMillis = 0;
07byte state = 0;
08 
09void setup()
10{
11  pinMode(channel1pin, OUTPUT);
12  pinMode(channel2pin, OUTPUT);
13}
14 
15void 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}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Если надо чтобы после отключения двух каналов опять выдерживалась пауза заданная то можно ввести state = 3 в 37 строке добавить || state==3 в условии сделать switch(state) по case 1 выполнять те строки что есть (с 39 по 42) а по case 3 делать просто state=0;

Demos
Offline
Зарегистрирован: 21.02.2015

С первым примером включается 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 
06unsigned long prevMillis = 0;
07byte state = 0;
08 
09void setup()
10{
11  pinMode(channel1pin, OUTPUT);
12  pinMode(channel2pin, OUTPUT);
13   
14}
15 
16void 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 секунд выключены оба и заново.

Может я не так что то исправил?

Demos
Offline
Зарегистрирован: 21.02.2015

что-то вообще не то пока.

Вот написал с использованием delay - работает как надо, но смысла нет потому что там еще куча всего должно работать) может поможет

01#define channel1pin 15
02#define channel2pin 16
03#define work_interval 1000 // время работы канала
04#define idle_interval 5000 // время между включениями каналов
05 
06unsigned long prevMillis = 0;
07byte state = 0;
08 
09void setup()
10{
11  pinMode(channel1pin, OUTPUT);
12  pinMode(channel2pin, OUTPUT);
13  digitalWrite(channel1pin, HIGH);
14  digitalWrite(channel2pin, HIGH); 
15}
16 
17void 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}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

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

UPD залил еще раз проверил всё работает как описано, могу видео заснять :)

Demos
Offline
Зарегистрирован: 21.02.2015

Странно, а я уже седеть начинаю)

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

у меня про мини если это имеет какое то значение

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Ну даже не знаю... у меня нет про мини чтобы попробовать не думаю что есть какая-то разница. Ну что там может быть millis чтоли по другому работает... Всё как обычно просто, надо только догадаться :)

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Единственное у вас реле включаются когда LOW а выключаются когда HIGH у меня со светодиодами соответственно наоборот. Т.е. в том коде что я давал надо HIGH на LOW поменять и LOW на HIGH, ну я думаю поменяли же. В общем надо как обычно отвлечься от проблемы и она сама решиться в голове :)

Demos
Offline
Зарегистрирован: 21.02.2015

/

mrbin
Offline
Зарегистрирован: 01.02.2015

Penni привет! у меня опять вопрос ,нет ли у вас примера бегущий строки на олед дисплеи?

 

mrbin
Offline
Зарегистрирован: 01.02.2015
01void 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}

вот такой пример есть но не так работает как хотелось

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Не, у меня нет, никогда с олед дело не имел, но думаю кто-то обязательно покажет. А как не так работает может этот пример можно поправить?

mrbin
Offline
Зарегистрирован: 01.02.2015

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

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

А Вам надо чтобы только в одной строке туда сюда двигалось? По диагонали это 17 и 19 строки делают, уберите их и слово будет только в одной строке двигаться.

mrbin
Offline
Зарегистрирован: 01.02.2015

чтобы  слово прошло с право влево и конец

 

 

mrbin
Offline
Зарегистрирован: 01.02.2015

для чего нужны вот эти значения  (0x00, 0x07);

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

У меня нет библиотеки этой, но на гидхабе в описании написано, что это стартовая и конечная позиция. А какое разрешение у экрана?

mrbin
Offline
Зарегистрирован: 01.02.2015

128x64