помогите разобратся с таймером на millis

Hartakolo
Offline
Зарегистрирован: 07.01.2022

Всем привет. Мне не удобно спрашивать такие простые вопросы. И все таки. Я новичок и пробую методом тыка.  Вот такой вопрос. Нужно включить реле №1 через 1 секунду. Потом вылючить этот же реле  через 5 секунд. А через  10 секунд включить реле №2. Не получается. 

#define RELE 1_PIN 5  
#define RELE 2_PIN 6    

unsigned long tmr;

void setup() {
 pinMode(RELE 1_PIN, OUTPUT);
  pinMode(RELE 2_PIN, OUTPUT);


}

void loop() {
if(millis()-tmr>1000{
  digitalWrite(RELE 1, HIGH);
}

if(millis()-tmr>5000{
  digitalWrite(RELE 1, LOW);
}
if(millis()-tmr>10000{
  digitalWrite(RELE 2, HIGH);
}
}

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

А какой результат Вы получаете с этим кодом?

И что по Вашему происходит в строках 14, 18 и 21?

Hartakolo
Offline
Зарегистрирован: 07.01.2022

ну как я понимаю если "tmr" больше 1 секунды выполняют команду в фигурных скопках.

и если "tmr" больше 5 секунд то опять выполняют команду в фигурных скопках.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

А чему равно tmr и когда оно хотя бы "будет больше 1 секунды"? Т.е. где в коде tmr изменяет своё значение?

-NMi-
Offline
Зарегистрирован: 20.08.2018

Слова "скопки" , "вылючить этотже реле" допустимо писать только определённой группе лиц!!!

b707
Offline
Зарегистрирован: 26.05.2017

Hartakolo, обратите внимание , в строчках

#define RELE 1_PIN 5 

и вот тут

digitalWrite(RELE 1, LOW);

описаны совершенно разные переменные. Поэтому и не работает.

А когда разберетесь с пинами - тогда и о таймере поговорим

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

b707 пишет:

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

b707
Offline
Зарегистрирован: 26.05.2017

AndreyD пишет:

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

согласен

Hartakolo

зачем вы выложили фейковый код, который не совпадает с тем, что вы пробовали на ардуино?

Hartakolo
Offline
Зарегистрирован: 07.01.2022

Извиняюсь. На ардуино другой код. Там будет использоваться не две а несколько пинов. Поэтому этот и был для примера, чтоб понять как работать с таймером.  Поэтому было без компиляции. А с таймером кажется разобрался.  После 14,18 и 21 строки одновременно поставил tmr=millis(). а потом после каждой по очередно. на последней (21 строка) работает.

#define RELE1_PIN 5  
#define RELE2_PIN 6    

unsigned long tmr;

void setup() {
 pinMode(RELE1_PIN, OUTPUT);
  pinMode(RELE2_PIN, OUTPUT);


}

void loop() {
if(millis()-tmr>1000){
  digitalWrite(RELE1_PIN, HIGH);
}

if(millis()-tmr>5000){
  digitalWrite(RELE1_PIN, LOW);
}
if(millis()-tmr>10000){
  digitalWrite(RELE2_PIN, HIGH);
  tmr=millis();
}
}
 
b707
Offline
Зарегистрирован: 26.05.2017

и что,  этот код правильно работает? спорим, что нет

Возьмем момент, когда миллис равен 6000. Попробуйте вместо ардуины пройти по строчкам и выполнить код процедуры loop() - и напишите, что у вас получилось

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Работает не по условиям в первом посте.

Это ссылка на симулятор: https://wokwi.com/projects/332538016808567379

 

Hartakolo
Offline
Зарегистрирован: 07.01.2022

На светодиодах проверил .  Один раз после включения   работает.  в  loop() все же повторяется. А тут один раз после включения работает.  Хотя мне и нужно чтоб один раз работало.  У меня устройство будет работать после включения 50 минут, а потом выключатся.

b707
Offline
Зарегистрирован: 26.05.2017

Hartakolo пишет:

На светодиодах проверил .  Один раз после включения   работает

работает, но неверно.

Сделайте, как я сказал - возьмите значение миллис = 6000 и выполните вручную операторы loop() - что получится?

Давайте, не ленитесь. Вы должны найти ошибку сами. Или вы ждете. что вам все разжуют и в рот положат?

Вы же говорите, что "разобрались с таймером"? - а на самом деле вы ничего не поняли

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Hartakolo пишет:
Вот такой вопрос. Нужно включить реле №1 через 1 секунду. Потом вылючить этот же реле  через 5 секунд. А через  10 секунд включить реле №2. Не получается.
А вопрос-то где?

Hartakolo
Offline
Зарегистрирован: 07.01.2022

я вон по другому сделал и работает. 

#define RELE1_PIN 5  
#define RELE2_PIN 6    

unsigned long tmr;
int adu;
void setup() {
 pinMode(RELE1_PIN, OUTPUT);
  pinMode(RELE2_PIN, OUTPUT);


}

void loop() {
if(millis()-tmr>=1000){
  tmr=millis();
  adu++;
}
  
if(adu==1){digitalWrite(RELE1_PIN,HIGH);}
if(adu==5){digitalWrite(RELE1_PIN,LOW);}
if(adu==10){digitalWrite(RELE2_PIN,HIGH);}

}

 

милисс=6000 это значить что выполнены команды в строках 15 и 19  и идет дальше. мне проще понимать на примерах чем когда объясняют. да я хочу понять как заставить работать  код в 8 посте.  

b707
Offline
Зарегистрирован: 26.05.2017

Hartakolo пишет:

 мне проще понимать на примерах чем когда объясняют.

это правильно, только не ждите готовые примеры от доброго дяди на форуме, так вы ничему не научитесь. Пробуйте писать "примеры" сами. Написали пример  - не работает,  разберитесь почему.

продолжим.

Hartakolo пишет:

милисс=6000 это значить что выполнены команды в строках 15 и 19  и идет дальше 

про миллис=6000 вы верно подметили, что выполняются оба условия. То есть реле сначала включится в строке 15, а потом выключится в строке 19. Но ведь loop(0 это цикл. И он повторяется. При миллис =6001 реле опять включится и выключится... и при миллис=6002...

Так оно у вас будет щелкать, пока миллис не достигнет 10000.

Уверены, что это то, что вы хотели?

Hartakolo
Offline
Зарегистрирован: 07.01.2022
#define RELE1_PIN 13  
#define RELE2_PIN 6    

unsigned long tmr;

void setup() {
 pinMode(RELE1_PIN, OUTPUT);
  pinMode(RELE2_PIN, OUTPUT);


}

void loop() {
if(millis()-tmr>1000&&millis()-tmr<5000){
  digitalWrite(RELE1_PIN, HIGH);
}

if(millis()-tmr>5000){
  digitalWrite(RELE1_PIN, LOW);
  
}
if(millis()-tmr>10000){
  digitalWrite(RELE1_PIN, HIGH);
  tmr=millis();
}
}

добавил допольнительное условие в строку 14 и теперь работает для одного цикла. это то что пришло на ум

Hartakolo
Offline
Зарегистрирован: 07.01.2022

или так замена >= на==

 

#define RELE1_PIN 5  
#define RELE2_PIN 6    

unsigned long tmr;

void setup() {
 pinMode(RELE1_PIN, OUTPUT);
  pinMode(RELE2_PIN, OUTPUT);


}

void loop() {
if(millis()-tmr>1000){
  digitalWrite(RELE1_PIN, HIGH);
}

if(millis()-tmr>5000){
  digitalWrite(RELE1_PIN, LOW);
}
if(millis()-tmr>10000){
  digitalWrite(RELE2_PIN, HIGH);
  tmr=millis();
}
}

 

Iv_
Iv_ аватар
Offline
Зарегистрирован: 06.04.2022

В функции millis, сразу обнулять надо счётчик. А потом уже делать другие действия.