Остановка действия в void loop

Матроскин
Offline
Зарегистрирован: 15.06.2018

Приветствую всех.

if (millis() - last_time > x ) {

digitalWrite(red,1);

Необходимо продолжить этот фрагмент так, чтобы при включении светодиода проходило 5 секунд, после чего он выключался совсем, а вместо него включался другой пин

int blue = 12;
int green = 11;                // настройка портов
int red = 10;
int motor = 7;
int buzzer = 6;

const int start = 9;           // работа с кнопками
const int choice = 8;
int choice_status = 0;

unsigned long last_time;       // работа с таймером
int x = 5000;

void setup() {
pinMode(blue, OUTPUT);         // установка режима работы портов
pinMode(green, OUTPUT);
pinMode(red, OUTPUT);
pinMode(start, INPUT);
pinMode(choice, INPUT);
pinMode(motor, OUTPUT);
pinMode(buzzer, OUTPUT);

int x = 5000;                  // установка времени
}

void loop() {

choice_status = digitalRead(choice);
if (choice_status == HIGH) {
  digitalWrite(green, 0);
  digitalWrite(buzzer, 0);
   
}
else {
  digitalWrite(green,1);
  digitalWrite(buzzer, 1);
  x = 10000;
  }

if (millis() - last_time > x ) {
  digitalWrite(red,1);
    }  
delay(5000);
digitalWrite(red,0);
}

 

andryn
Offline
Зарегистрирован: 08.06.2018

Матроскин пишет:

чтобы при включении светодиода проходило 5 секунд, после чего он выключался совсем, а вместо него включался другой пин

По-простому так:

...
boolean canOnRed = true;       //Переменная, разрешающая включать red

...
void setup() {
...
}

void loop() {
...
   if ((millis() - last_time > x) && canOnRed) { //Если выполняется условие и можно включать red
     digitalWrite(red,1);
     canOnRed = false; //Больше включать red нельзя никогда
   }
   else if (!canOnRed) { //Если нельзя включать red
      digitalWrite(orherPin,1); //Включим другой пин
   }  
...
}

Однако, лучше еще избавиться бы от delay, а то loop каждый раз будет тормозиться на 5 секунд и кнопку на пине choice нужно будет держать 5 секунд, чтобы программа ее прочитала.

Матроскин
Offline
Зарегистрирован: 15.06.2018

Спасибо, попробую)

Матроскин
Offline
Зарегистрирован: 15.06.2018

Не сработало, оба светодиода горят сразу же после включения

andryn
Offline
Зарегистрирован: 08.06.2018

Матроскин пишет:

Не сработало, оба светодиода горят сразу же после включения

У вас сам код как-то не очень...

Например, last_time не меняется никогда.

Как должно все вместе работать? Я предложил только идею, а не готовое решение.

Матроскин
Offline
Зарегистрирован: 15.06.2018

Код не очень, т.к. это моя первая попытка что-то собрать на ардуино. Мне необходимо сделать так, чтобы после того, как пройдет 10 секунд загорался красный светодиод, после чего проходит 5 секунд, и он выключается насовсем. Вместо красного загорается зеленый и горит не выключаясь. И да, необходимо, чтобы все это выполнялось в void loop. Но у меня мало опыта, поэтому я не могу реализовать это сам

Матроскин
Offline
Зарегистрирован: 15.06.2018

Со светодиодами работаю для отладки, пока не добьюсь того, что задумано

bwn
Offline
Зарегистрирован: 25.08.2014

Запомнили время, отсчитали 10 секунд, включили красный, отсчитали пятнадцать секунд, выключили красный, зажгли зеленый.

P/S Типа так:

void setup() {
  // put your setup code here, to run once:
  time = millis();

}

void loop() {
  if (millis() - time > 10000 && millis() - time < 15000) {
    digitalWrite(red, HIGH);
  }
  if(millis() - time >=15000) {
    digitalWrite(red,LOW);
    digitalWrite(green,HIGH);
  }
}

 

Матроскин
Offline
Зарегистрирован: 15.06.2018

Уже делал, но все равно попробую, может я что-то делал не так

Матроскин
Offline
Зарегистрирован: 15.06.2018

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

bwn
Offline
Зарегистрирован: 25.08.2014

Матроскин пишет:
Если что, то можно пойти по-другому. Можно сбрасывать саму ардуино через определенное время, но необходимо сначала узнать как это делается

Один пин на сброс, в нужный момент дернуть. Называется красивым японским словом - харакири.))))

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

Матроскин пишет:
Если что, то можно пойти по-другому. Можно сбрасывать саму ардуино через определенное время

ЗАЧЕМ???

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

Не думаю, что вам надо именно это.

andryn
Offline
Зарегистрирован: 08.06.2018

Матроскин пишет:

Код не очень, т.к. это моя первая попытка что-то собрать на ардуино. Мне необходимо сделать так, чтобы после того, как пройдет 10 секунд загорался красный светодиод, после чего проходит 5 секунд, и он выключается насовсем. Вместо красного загорается зеленый и горит не выключаясь. И да, необходимо, чтобы все это выполнялось в void loop. Но у меня мало опыта, поэтому я не могу реализовать это сам

Через 10 секунд после нажатия кнопки загорается красный, через 5 секунд после этого гаснет красный и загорается зеленый? При нажатии кнопки все повторяется? Или кнопка тут не причем?

 

Матроскин
Offline
Зарегистрирован: 15.06.2018

Вот это именно то, что нужно. Спасибо!)

Матроскин
Offline
Зарегистрирован: 15.06.2018

bwn пишет:

Запомнили время, отсчитали 10 секунд, включили красный, отсчитали пятнадцать секунд, выключили красный, зажгли зеленый.

P/S Типа так:

void setup() {
  // put your setup code here, to run once:
  time = millis();

}

void loop() {
  if (millis() - time > 10000 && millis() - time < 15000) {
    digitalWrite(red, HIGH);
  }
  if(millis() - time >=15000) {
    digitalWrite(red,LOW);
    digitalWrite(green,HIGH);
  }
}

 

Спасибо)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Удачи