Секундомер со светофором
- Войдите на сайт для отправки комментариев
Ср, 07/10/2015 - 05:09
Привет, собрал секундомер с двумя кнопками - Старт и стоп. Хочу добавить что-то типа светофора, нажали старт - красный светодиод мигнул три раза, загорелся зелёный, пошел отсчет. Нажали стоп - всё потухло, результат вывелся в терминал. Не могу разобраться как добавить мигание красным светодиодом. Подскажите в какую сторону копать?
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;
}
>Не могу разобраться как добавить мигание красным светодиодом.
посмотрите пример Blink, разберитесь с ним, задайте вопрсы по нему.
С примерами как мигать светодиодом с delay и c millis, я уже разобрался, они все основаны на цикличности функции loop(), я её не хочу захламлять.
Вопрос конкретно по миганию, можно ли мигание сделать отдельной функцией, в которой мигание повторяется несколько раз через временные интервалы, а не циклично? Можно ли будет потом вызвать эту функцию по внешнему прерыванию? Или вообще не лезть в прерывания, всё запихивать в loop()?
J0K3R_88, можно прицепить к таймеру.
Интересное решение, спасибо:)
Мне еще интересно, почему это просто отдельной функцией не реализуется, через оператор for например?:) И если можно, то как? У меня что-то никак не получается
J0K3R_88,
for от loop сильно отличаются?
loop захламлять не хотите, а for чем виноват?
поищите в гугле "100 способов мигать светодиодом".
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); }Теперь из любого места программы можно вызывать эту функцию и мигать:)