Еще один "умный" включатель. Вопрос по millis и вообще
- Войдите на сайт для отправки комментариев
Ср, 22/07/2015 - 17:46
В качетсве баловства решил попробовать заставить включаться свет в коридоре с помощью ардуины
Использовал библиотеку 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);
}
}
Честно говоря, совершенно не понятна строка 073. Что-то в ней не так.
Сможете пояснить её работу?
Если текущее время - время последнего выключения < 3 минут, и при этом прошло больше 3 минут с момента запуска ардуино (иначе первое условие будет выполнено сразу при включении ардуино) то увеличиваем счетчик.
Во втором условии правильнее было бы написать в 2 раза больше - 6 минут.
Если текущее время - время последнего выключения < 3 минут, и при этом прошло больше 3 минут с момента запуска ардуино (иначе первое условие будет выполнено сразу при включении ардуино) то увеличиваем счетчик.
посмотрите как долго живет миллис и что оно делает после того как умирает :)
посмотрите как долго живет миллис и что оно делает после того как умирает :)
о великий лечитель душ... раскажи нам о реинкарнации миллис... можем ли мы организовать церковь Миллис... будем торговать там знаками МИЛЛИС
И сбор средств на дополнительные биты для увеличения жизни. :)
посмотрите как долго живет миллис и что оно делает после того как умирает :)
Ну оживает снова потом. ничего страшного.
Ну оживает снова потом. ничего страшного.
фууууу, что за мовитон.. не оживает.. а реинкарнирует..