Еще один "умный" включатель. Вопрос по 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 минут с момента запуска ардуино (иначе первое условие будет выполнено сразу при включении ардуино) то увеличиваем счетчик.
посмотрите как долго живет миллис и что оно делает после того как умирает :)
посмотрите как долго живет миллис и что оно делает после того как умирает :)
о великий лечитель душ... раскажи нам о реинкарнации миллис... можем ли мы организовать церковь Миллис... будем торговать там знаками МИЛЛИС
И сбор средств на дополнительные биты для увеличения жизни. :)
посмотрите как долго живет миллис и что оно делает после того как умирает :)
Ну оживает снова потом. ничего страшного.
Ну оживает снова потом. ничего страшного.
фууууу, что за мовитон.. не оживает.. а реинкарнирует..