Секундомер со светофором

J0K3R_88
Offline
Зарегистрирован: 25.09.2015

Привет, собрал секундомер с двумя кнопками - Старт и стоп. Хочу добавить что-то типа светофора, нажали старт - красный светодиод мигнул три раза, загорелся зелёный, пошел отсчет. Нажали стоп - всё потухло, результат вывелся в терминал. Не могу разобраться как добавить мигание красным светодиодом. Подскажите в какую сторону копать?


int ms;
int time;
volatile unsigned long start = 0;
volatile unsigned long stop = 0;
volatile int once = 0; 

void setup() {
attachInterrupt(14, begin, FALLING);
attachInterrupt(12, end, FALLING);
Serial.begin(115200);
}

void loop() 
{

}

void begin() {
    if (once == 0) { //проверяем, нажималась ли уже кнопка старт
          start = millis(); //получаем текущее значение millis
        once = 1; //ставим метку "старт был нажат"
        Serial.println("Start");
      stop = 0; //обнуляем предыдущий замер, а можно и не обнулять :)
   }
}

void end() {
    if (once == 1) { //проверяем, нажималась ли кнопка старт
        stop = millis() - start; //вычисляем промежуток
        Serial.println("Finish");
        timer ();
        once = 0; //убираем метку
    }
}


int timer()
{
  time = stop/1000;
    ms = stop;
    if (time/60%60<10) { Serial.print ("0"); }
      Serial.print ((time/60)%60);
      Serial.print (":");
    if (time%60<10) { Serial.print ("0"); }
      Serial.print (time%60);
      Serial.print (":");
    if (ms%1000<10) { Serial.print ("00"); }
    else if (ms%1000>10 && ms%1000<100) {Serial.print ("0");}
      Serial.println (ms%1000)/100;
}
toc
Offline
Зарегистрирован: 09.02.2013

>Не могу разобраться как добавить мигание красным светодиодом.

посмотрите пример Blink, разберитесь с ним, задайте вопрсы по нему.

J0K3R_88
Offline
Зарегистрирован: 25.09.2015

С примерами как мигать светодиодом с delay и c millis, я уже разобрался, они все основаны на цикличности функции loop(), я её не хочу захламлять.

Вопрос конкретно по миганию, можно ли мигание сделать отдельной функцией, в которой мигание повторяется несколько раз через временные интервалы, а не циклично? Можно ли будет потом вызвать эту функцию по внешнему прерыванию? Или вообще не лезть в прерывания, всё запихивать в loop()?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013
J0K3R_88
Offline
Зарегистрирован: 25.09.2015

Интересное решение, спасибо:)

Мне еще интересно, почему это просто отдельной функцией не реализуется, через оператор for например?:) И если можно, то как? У меня что-то никак не получается

toc
Offline
Зарегистрирован: 09.02.2013

J0K3R_88,
for от loop сильно отличаются?
loop захламлять не хотите, а for чем виноват?

поищите в гугле "100 способов мигать светодиодом".

J0K3R_88
Offline
Зарегистрирован: 25.09.2015

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

Решилось кстати всё вот так:
 

void blink(){
  while (counter < 3)
    {
      if(millis() - previousMillis > interval)
      {
        previousMillis = millis();
        value = (value == LOW) ? HIGH : LOW;
        digitalWrite(ledPin, value);
        if(value == LOW)
          counter++;
      }
    }
 digitalWrite(ledPinG, HIGH);
  }

Теперь из любого места программы можно вызывать эту функцию и мигать:)