ВКЛ/ВЫКЛ Реле по заданному времени
- Войдите на сайт для отправки комментариев
Пнд, 04/03/2019 - 07:36
Привет всем!
задача: пользователь задает период работы реле (например 30мин) это инфу хранит переменная 'time'
на lcd 2004 выводится обратный отчет? по окончании 30 мин реле отключается
Подскажите как это реализовать, нужны ли будут часы реального времени?
был тут но не понял((
Если точночть в районе 1% устраивает, то RTC не обязателен.
если разбег 1% то не страшно
как проще реализовать? с ним или без модуля р.в.
Включать реле умеете? А выключать? Про миллис, про то как вычитать и сравнивать - тоже?
Начните со словесного описания алгорима.
Вот что лично Вы делали бы, окажись на месте контроллера?
есть lcd, энкодер, движок и мр3 модуль.
пользователь задает время работы реле и двиготеля т.е
например задал 30мин.
вкл. двигатель и реле на 30 мин. потом выключатся и надо реализовать еще чтобы на 10той минуте отключался только движок на 5ть минут потом через 5 мин (в сумме 15мин) включался
я такое делал на нектионе там есть таймер а в ардуино не разобрался)
есть lcd, энкодер, движок и мр3 модуль.
пользователь задает время работы реле и двиготеля т.е
например задал 30мин.
вкл. двигатель и реле на 30 мин. потом выключатся и надо реализовать еще чтобы на 10той минуте отключался только движок на 5ть минут потом через 5 мин (в сумме 15мин) включался
я такое делал на нектионе там есть таймер а в ардуино не разобрался)
батенька, ну куда ж вы полезли? Вам бы для начала "мама" выговаривать научиться...
Начните с простого - опишите, как вас просили, алгоритм работы контроллера для одного реле с простой задержкой 30 минут
Присоединяюсь к вопросу. Так же и мне надо на один из портов установить "1" через 2 минуты, сделать замер и опять порт в "0" вернуть.
Должен же быть в ардуино таймер.
В моей програмке уже используется SimpleTimer
Т.е. Проверять датчики, включать релюшки через заданный интервал могу.
Можно на основе этого решить задачу nurgazin_d@ma, завести переменную t и в функции "sendSensor" простейший счётчик t++; Как натикало нужное время, так сделать действие.
Но вопрос остаётся. Может уже есть, что то готовое. А это решение комуто покажется костылями.
Должен же быть в ардуино таймер.
почитайте про функцию millis() - это все. что нужно для подобного типа задачек. Никакие "таймеры" для включения лампочки раз в 30 минут не требуются.
Прочитал про millis(), И также почитал про SimpleTimer он так же базируется на millis.
Правильно понимаю, что аппаратного таймера с прерываниями в ардуино нет? Т.е. CPU никогда не спит или это всё скрыто от юзера, и что на самом деле происходит, знают только единицы.
Аппаратных часов в ATMega328 нет. А таймеры - есть. Но вы под "таймером" подразумеваете аппаратные часы, видимо.
Правильно понимаю, что аппаратного таймера с прерываниями в ардуино нет?
есть и даже обычно не один. В Атмеге328 (той. что стоит в Уно и Нано) - три аппаратных таймера.
Только повторяю, для решения задачки зажечь лампочку на 30 минут - нет никакой надобности привлекать такие высокие материи, как "аппаратные ьаймеры с прерываниями" - все решается обычным миллис.
Хотя безусловно. "под капотом" у миллис аппаратный таймер
попытаюсь обьяснить на примере кода из некстион дисплея - где есть таймер
val=это типа captiоn из паскаля(я на паскале пишу в основном) label.captiоn:="1268654" типа такого
т.е va0.val=1 va0 будет 1
va0=переменная
n2=хранит секунды
n1=хранит минуты
va0.val=va0.val+1 //счетчик
т.е. реле работает сначала 10 мин. потом 5 мин. отдыхает затем после 15й минуты. вкл. еще на 5мин. после 5ти мин. отключается еще на 5ть минут (в сумме цикл работы занимает 25 минут)
надеюсь объяснил уф.
спасибо.
ребята помогите разобраться с этой проблемой, про millis смотрел тут https://www.youtube.com/watch?v=Ik7SwQ477mA но из-за больших пока пробелов знаний в программировании ардуино не понимаю о чем речь, ну т.е. японимаю millis это счетчик ардуино который начинат отчет времени с момента вкл. ардуино и переполняется через 50 дней но не могу понять как это применить к моей задаче покажите наглядно для чайника
я думал реализовать задачу используя часы реального времени
при включении цикла работы реле ардуино снимает показания с часов допусти сейчас там 12:50:20
и записывает значения переменную min
и условие
if min+10 то отключаю реле
if min+5 то вкл реле
if min+5 то выкл реле
if min+5 то вкл реле
вот опять из-за пробелов в знании работы с часами и вообще, я не понимаю как реализовать скетч
УМОЛЯЮ приведите пример где бы были переменные отвечающие за время цикла (мин) (секунды) они будут отправлятся на лсд дисплей
ПОМОГИТЕ СРОЧНО НАДО СПАСИБО СПАСИБО СПАСИБО СПАСИБО СПАСИБО СПАСИБО СПАСИБО СПАСИБО
Берите учебник по ардуине и срочно-срочно его читайте. Можете даже не спать, чтобы успеть заполнить все пробелы и понять, как реализовать скетч.
Или есть второй вариант: идете в "ищу исполнителя" и обмениваете свои деньги на чужое время.
Вам в #4 сказали, что нужно сделать. Вы походу не поняли, а уперлись в свои реле.
А фактически, надо было расписать, как вы, сами, отслеживаете время - посмотрели на часы, запомнили текущее время, занимаетесь своими делами и посматриваете на часы. Прошел требуемый интервал, совершили действие и так по кругу. Миллис - это ваши часы на стенке, ток считает не часы и минуты, а миллисекунды.
Здесь про миллис хорошо.
Берите учебник по ардуине и срочно-срочно его читайте. Можете даже не спать, чтобы успеть заполнить все пробелы и понять, как реализовать скетч.
Или есть второй вариант: идете в "ищу исполнителя" и обмениваете свои деньги на чужое время.
не будь я голодным студентом - а будь я толтосуммом вроде Вас, так бы и поступил, я думаю что такие площадки и создавались для общения и помощи начинающим а не язвительных коментариев проходимцев вроде вас.
я думаю что такие площадки и создавались для общения и помощи начинающим а не язвительных коментариев проходимцев вроде вас.
Почитайте начало песочницы и не хамите старожилам, которые еще и знают на три порядка больше вас.
Я всегда отношусь с уважением к старшим и опытным собеседникам, но зачем вы пишете такое о чем я и без вас знаю, ят пришел за помощью а не за демогогией.
ИЗВЕНИТЕ МЕНЯ ПОЖАЛУЙСТА, ЧТО НАХОМИЛ, просто зачем писать не о чем. еще раз извените!!!!!
не будь я голодным студентом - а будь я толтосуммом вроде Вас, так бы и поступил, я думаю что такие площадки и создавались для общения и помощи начинающим а не язвительных коментариев проходимцев вроде вас.
Голодного студента я могу накормить, а ленивого - нет. И, к слову, проходимцем всегда называли того, кто жил за чужой счёт, обманом получая то, чего сам делать не желал.
я думаю что такие площадки и создавались для общения и помощи начинающим а не язвительных коментариев проходимцев вроде вас.
Почитайте начало песочницы и не хамите старожилам, которые еще и знают на три порядка больше вас.
посоветуйте пожалуйста литературу, СПАСИБО
Я же в #14 дал ссылку на Лешака и расписал, что с этим делать.
не будь я голодным студентом - а будь я толтосуммом вроде Вас, так бы и поступил, я думаю что такие площадки и создавались для общения и помощи начинающим а не язвительных коментариев проходимцев вроде вас.
Голодного студента я могу накормить, а ленивого - нет. И, к слову, проходимцем всегда называли того, кто жил за чужой счёт, обманом получая то, чего сам делать не желал.
да понял я все ребята простите пожалуйста!
буду учить!
тему "ВКЛ/ВЫКЛ Реле по заданному времени" можно считать закрытой спасибо всем.
Вам в #4 сказали, что нужно сделать. Вы походу не поняли, а уперлись в свои реле.
А фактически, надо было расписать, как вы, сами, отслеживаете время - посмотрели на часы, запомнили текущее время, занимаетесь своими делами и посматриваете на часы. Прошел требуемый интервал, совершили действие и так по кругу. Миллис - это ваши часы на стенке, ток считает не часы и минуты, а миллисекунды.
Здесь про миллис хорошо.
да вы описали задачу мою так просто и доступно) я так не могу излогать свои мысли-это плохо(
https://arduinoplus.ru/5-knig-ob-arduino/#i
unsigned long Time; // время с начала включения
// On
#define T1 10 // время первое
// Off
#define T2 15
// On
#define T3 20
// Off
#define T4 25
Time = millis();
void loop{
if((millis()-Time)>=T4*60000)
{ReleOn;
Time = millis();
}
else if((millis()-Time)>=T3*60000)
ReleOff;
else if((millis()-Time)>=T2*60000)
ReleOn;
else if((millis()-Time)>=T1*60000)
ReleOff;
delay(1000); // поковырять в носу секунду
}
Как то так. Заменить ReleOff и On на команду включения.
Огромное вам спасибо очень помогли!
Но выше представленый метод, мне не очень нравится, это если помимо этого цикла ничего нет.
Я бы чуть усложнил.
Реле будет очень весело пощёлкивать, начиная с 16-й минуты, когда станет проходить условия "через 5 минут выключить" и "через 15 минут включить".
В первом примере в каждом отрезке времени программа будет отправлять значение в регистр порта
digitalWrite(PIN_HeatMQ4, LOW); // например
Это не значит что реле будет счёлкать. Так как направление порта pinMode(PIN_HeatMQ4, OUTPUT); и само значение "LOW" не меняется.
Должно рабоатать, можно ещё тупее написать используя delay().
А, там else расставлены. Тогда да, щёлкать не станет. Просто любой интервал больше 10 сек будет попадать во второе условие.
Сорри, был невнимателен днём - не заметил, что ещё и порядок обратный.
А все потому что народ не хочет учить !!! автоматы. Ничего пойдет в армию и будет учить афтамат Калашникова.
Сделал так unsigned long previousMillis = 0; int sec = 0; int Smin,Qmin=0; const int DV=3; //ШИМ ДВИЖКА (ПИН 3) #define DV_VKL 4 //ВКД/ВЫКЛ ДВИЖКА (ПИН 4) unsigned long currentMillis = millis ( ); if ( currentMillis - previousMillis >= 1000 ) { previousMillis = currentMillis; lcd.setCursor(0,0);lcd.print("====Seans_VREMYA===="); lcd.setCursor(9, 2);lcd.print(" "); lcd.setCursor(8, 2); lcd.print(Smin); lcd.setCursor(10, 2); lcd.print(":"); lcd.setCursor(12, 2);lcd.print(" "); lcd.setCursor(11, 2); lcd.print(sec++); if (sec==59){sec=0; Smin++;} } digitalWrite(DV_VKL, 1); analogWrite (DV, Silla); digitalWrite(RELAY8, 0); digitalWrite(RELAY9, 1); digitalWrite(RELAY10,1); if(encoderButton.flagClick == true) { encoderButton.flagClick = false; MENU = 0; pos = 1; lcd.clear();sec=0; } } if (Seans==25) { if (Smin==10){digitalWrite(DV_VKL, 0);} if (Smin==11){digitalWrite(DV_VKL, 0);} if (Smin==12){digitalWrite(DV_VKL, 0);} if (Smin==13){digitalWrite(DV_VKL, 0);} if (Smin==14){digitalWrite(DV_VKL, 0);} if (Smin==15){digitalWrite(DV_VKL, 1);} if (Smin==16){digitalWrite(DV_VKL, 1);} if (Smin==17){digitalWrite(DV_VKL, 1);} if (Smin==18){digitalWrite(DV_VKL, 1);} if (Smin==19){digitalWrite(DV_VKL, 1);} if (Smin==20){digitalWrite(DV_VKL, 0);} if (Smin==21){digitalWrite(DV_VKL, 0);} if (Smin==22){digitalWrite(DV_VKL, 0);} if (Smin==23){digitalWrite(DV_VKL, 0);} if (Smin==24){digitalWrite(DV_VKL, 0);} if (Smin==25){digitalWrite(DV_VKL, 0);} }
Ребята огромное вам спасибо за отзывчивость и помощь в проекте!!!!!!!
FREEKER тебе особенно
Ненадежно это: шаг (currentMilis - previousMillis) может быть больше 1000, а дальше сравнение происходит на равенство. Ошибка (превышение над 1000) будет накапливаться и периодически приводить к пропускам.
Гораздо лучше либо сравнивать sec на неравенство с prevSec, либо previoыMillis вычислять не как currentMillis, а как previousMillis + 1000.
Ненадежно это: шаг (currentMilis - previousMillis) может быть больше 1000, а дальше сравнение происходит на равенство. Ошибка (превышение над 1000) будет накапливаться и периодически приводить к пропускам.
Гораздо лучше либо сравнивать sec на неравенство с prevSec, либо previoыMillis вычислять не как currentMillis, а как previousMillis + 1000.
Спасибо за совет, таких циклов будет 5-8 раз потом будут отключать от сети - наверное погрешность не критична))
Сделал так if (Smin==10){digitalWrite(DV_VKL, 0);} if (Smin==11){digitalWrite(DV_VKL, 0);} if (Smin==12){digitalWrite(DV_VKL, 0);} if (Smin==13){digitalWrite(DV_VKL, 0);} if (Smin==14){digitalWrite(DV_VKL, 0);} if (Smin==15){digitalWrite(DV_VKL, 1);} if (Smin==16){digitalWrite(DV_VKL, 1);} if (Smin==17){digitalWrite(DV_VKL, 1);} if (Smin==18){digitalWrite(DV_VKL, 1);} if (Smin==19){digitalWrite(DV_VKL, 1);} if (Smin==20){digitalWrite(DV_VKL, 0);} if (Smin==21){digitalWrite(DV_VKL, 0);} if (Smin==22){digitalWrite(DV_VKL, 0);} if (Smin==23){digitalWrite(DV_VKL, 0);} if (Smin==24){digitalWrite(DV_VKL, 0);} if (Smin==25){digitalWrite(DV_VKL, 0);}
Зачем так сложно, дублировать каждую минуту?
Smin Ты ведь сам щёлкаешь, т.е. можешь использовать "==" и не бояться пропустить
Но Я не настаиваю, дело Ваше. Но глазам больно, даже по меркам ардуино. :)
Сделал так if (Smin==10){digitalWrite(DV_VKL, 0);} if (Smin==11){digitalWrite(DV_VKL, 0);} if (Smin==12){digitalWrite(DV_VKL, 0);} if (Smin==13){digitalWrite(DV_VKL, 0);} if (Smin==14){digitalWrite(DV_VKL, 0);} if (Smin==15){digitalWrite(DV_VKL, 1);} if (Smin==16){digitalWrite(DV_VKL, 1);} if (Smin==17){digitalWrite(DV_VKL, 1);} if (Smin==18){digitalWrite(DV_VKL, 1);} if (Smin==19){digitalWrite(DV_VKL, 1);} if (Smin==20){digitalWrite(DV_VKL, 0);} if (Smin==21){digitalWrite(DV_VKL, 0);} if (Smin==22){digitalWrite(DV_VKL, 0);} if (Smin==23){digitalWrite(DV_VKL, 0);} if (Smin==24){digitalWrite(DV_VKL, 0);} if (Smin==25){digitalWrite(DV_VKL, 0);}
Зачем так сложно, дублировать каждую минуту?
Smin Ты ведь сам щёлкаешь, т.е. можешь использовать "==" и не бояться пропустить
Но Я не настаиваю, дело Ваше. Но глазам больно, даже по меркам ардуино. :)
Сам не восторге))) пробывал так:
но работать начинает smin==10 как и положено не работает а потом на smin==11 начинает работать мистика
Сам не восторге))) пробывал так:
но работать начинает smin==10 как и положено не работает а потом на smin==11 начинает работать мистика
Пишите четко - что работает и что нет. И, желательно, со знаками препинания, а то ничего не понятно.
Код, плиз, выложите полный - а то выше какие-то обрывки. Совершенно непонятно - этот код расположен внутри loop(), setup() или сам по себе?
Привет всем!
задача: пользователь задает период работы реле (например 30мин) это инфу хранит переменная 'time'
на lcd 2004 выводится обратный отчет? по окончании 30 мин реле отключается
Подскажите как это реализовать, нужны ли будут часы реального времени?
был тут но не понял((
http://arduino.ru/forum/obshchii/vkl-i-vykl-rele-po-vremeni
Модератор: Дальнейшие попытки выкладывания кода в нечитаемом виде будут пресекаться путем удаления в спам. Почитайте тему - "Вставка кода в тему, комментарий"
Я для временнЫх событий пользую примерно такие конструкции:
В библиотечных таймерах никакого смысла не вижу.