Еще один "умный" включатель. Вопрос по millis и вообще

SiMuS
Offline
Зарегистрирован: 31.10.2011

В качетсве баловства решил попробовать заставить включаться свет в коридоре с помощью ардуины

Использовал библиотеку timer

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

Логика работы такая:

Если слабая освещенность и сработал датчик движения - включаем свет на 15 секунд.

Если в это время сработал датчик движения (датчик освещенности игнорируем тк свет горит)

Если после выклчения света датчики срабатывают менее чем через 3 минуты с последнего раза - делем вывод что кто-то тут бегает туда-сюда и увеличиваем интервал с 15 секунд до 30.

 

#include "Timer.h"


int led = 13; //светодиод
int lightpin = A2; //фоторезистор
int relaypin = 5; //реле
int motionpin = 6; //датчик движения
byte light = 0; //логическая переменная условий по свету
byte motion = 0; //логическая переменная срабатывания датчика движения
int counter = 29; //значение счетчика по умолчанию
int count1 = 59; //значение счетчика по умолчанию
int count2 = 119; //счетчик для повторного включения
byte relay = 0; //логическая переменная срабатывания реле
long laststate=0; //переменная для хранения времени отключения реле
//создание таймера Т
Timer t;

void setup() {                

  pinMode(led, OUTPUT);     
  pinMode(relaypin, OUTPUT); 
  pinMode(motionpin, INPUT); 
  Serial.begin(115200);
  //вызов функции  timercycle раз в 250мс
  int tickEvent = t.every(250, timercycle);

}



void timercycle()
{
//как только включилось реле запускаем обратный отсчет
    if (relay==1) {
    counter--;
    }

//если счетичк отсчитал до 0 и при этом реле включено, выелючаем реле
    if (counter == 0 && relay==1) {
      //выключение
    relay=0;
    //запоминаем время выключения
    laststate=millis();
    } 

}


void loop() {

//обновление функции таймера
 t.update();  




//проверка датчика освещенности. Если свет включен, показания сенсора игнорируются. 
if (analogRead(lightpin) < 350 || relay==1) {
 light = 1;
} else {
light =0;
}
//проверка датчика движения 
motion = digitalRead(motionpin);

//если сработал датчик движения и выполнены условия по освещенности, включаем реле и задаем отсчет до выключения.
//При повторном сробатывании отсчет начинается заново
if (motion && light)
{
relay = 1;

//если прошло меньше 3 минут с момента выклчения реле то время работы реле увеличивается
if (millis()-laststate<180000 && millis()>180000) {
counter = count2;
} else //если больше 3 минут с момента выклчения реле то время уменьшается
{
counter = count1;
}
}


  

Serial.print("Lignt");Serial.print(light); //условия по освещенности выполнены
Serial.print("  Ligntval ");Serial.print(analogRead(lightpin)); //значения сеносра освещенности
Serial.print("  Motion ");Serial.print(motion); //состояние датчика движения
Serial.print("  Relay ");Serial.print(relay); //состояние реле
Serial.print("  Counter ");Serial.print(counter); //отсчет до выклчения

//включение реле
if (relay == 1) {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  digitalWrite (relaypin, LOW);


}  else //выключение реле
 {
  digitalWrite(led, LOW);   // turn the LED on (HIGH is the voltage level)
  digitalWrite (relaypin, HIGH);

} 
}

 

Piskunov
Offline
Зарегистрирован: 13.02.2014

Честно говоря, совершенно не понятна строка 073. Что-то в ней не так.

Сможете пояснить её работу?

SiMuS
Offline
Зарегистрирован: 31.10.2011

Если текущее время - время последнего выключения < 3 минут, и при этом прошло больше 3 минут с момента запуска ардуино (иначе первое условие будет выполнено сразу при включении ардуино) то увеличиваем счетчик.

SiMuS
Offline
Зарегистрирован: 31.10.2011

Во втором условии  правильнее было бы написать в 2 раза больше - 6 минут. 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

SiMuS пишет:

Если текущее время - время последнего выключения < 3 минут, и при этом прошло больше 3 минут с момента запуска ардуино (иначе первое условие будет выполнено сразу при включении ардуино) то увеличиваем счетчик.

посмотрите как долго живет миллис и что оно делает после того как умирает :)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

JollyBiber пишет:

посмотрите как долго живет миллис и что оно делает после того как умирает :)

о великий лечитель душ... раскажи нам о реинкарнации миллис... можем ли мы организовать церковь Миллис... будем торговать там знаками МИЛЛИС

Radjah
Offline
Зарегистрирован: 06.08.2014

И сбор средств на дополнительные биты для увеличения жизни. :)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

SiMuS
Offline
Зарегистрирован: 31.10.2011

JollyBiber пишет:

посмотрите как долго живет миллис и что оно делает после того как умирает :)

 

Ну оживает снова потом. ничего страшного.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

SiMuS пишет:

Ну оживает снова потом. ничего страшного.

фууууу, что за мовитон.. не оживает.. а реинкарнирует..