Я бы подошел к этой проблеме проще. Всегда старайтесь разделить проблему на более мелкие (не слишком много!). В этом случае нам нужно:
- Начать принимать время, когда изменяется состояние.
- Время занять.
- Прекратить брать время, когда мы получаем другой вход.
Давайте начнем:
Начните с момента, когда состояние изменится.
Если мы считаем, что состояние вывода по умолчанию - LOW
, код должен учитывать, что ввод HIGH
, так что это будет первый оператор в нашем разделе loop()
. Функция для считывания статуса вывода - digitalRead()
. В качестве значения вы указываете пин-код, который нам интересен, и мы получим статус HIGH
или LOW
.
if (digitalRead(pin) == HIGH){
}
Время.
Теперь мы знаю, когда начинать время, поэтому пришло время подумать о том, как мы собираемся его принять. Мы можем написать это внутри оператора if или создать новую функцию, это зависит от того, как вы собираетесь использовать свой код. Давайте реализуем это непосредственно в операторе if. Мы можем просто добавить 1 к переменной в al oop, что-то вроде:
elapsedTime = 0;
for (int i = 0; i <= 255; i++){
elapsedTime = elapsedTime + 1;
}
Но мы хотим увеличивать единицу через определенное время, секунду. Мы можем сказать доске эй! подождите одну секунду после добавления одного . Достижение этой цели достигается путем ожидания одной секунды с функцией delay()
. Нам нужно указать, сколько, в данном случае, 1000
, потому что одна секунда составляет 1000 миллисекунд. Подробнее о функции, здесь . Теперь наш код выглядит следующим образом:
elapsedTime = 0;
for (int i = 0; i <= 255; i++){
elapsedTime = elapsedTime + 1;
delay(1000);
}
Более распространенный способ добавить следующий код: variable++
. Еще одно незначительное редактирование будет ждать одну секунду, прежде чем добавить одну, потому что, когда вы начинаете время, которое вы хотите сохранить 0, нет 1. Давайте перепишем эти строки:
elapsedTime = 0;
for (int i = 0; i <= 255; i++){
delay(1000);
elapsedTime = elapsedTime++;
}
Хватит тратить время, когда мы получаем другое input.
Теперь, вместо того, чтобы ждать это до 255 секунд, мы хотим выполнить эту операцию, пока не вернемся к нашему активированному состоянию нашего вывода (HIGH). В этом случае мы используем while
, что означает что-то вроде Эй, доска! выполняйте эту операцию до тех пор, пока что-то
while (digitalRead(pin) == LOW){
}
Теперь то, что мы пишем внутри этой функции, будет выполняться до тех пор, пока мы не получим ложное утверждение. Используя то, что мы написали ранее:
elapsedTime = 0;
while (digitalRead(pin) == LOW){
delay(1000);
elapsedTime = elapsedTime++;
}
Наконец, мы хотим начать подсчет, когда мы получим первый HIGH
ввод, поэтому мы заключаем его в первую строку кода:
elapsedTime = 0;
if (digitalRead(pin) == HIGH){
while (digitalRead(pin) == LOW){
delay(1000);
elapsedTime = elapsedTime++;
}
}
Все готово! Чтобы получить результат, вы можете распечатать результат, или делать все, что вы хотите. Вместо времени в секундах вы можете измерить любую единицу, просто измените значение внутри delay()
на любое другое значение. Например, если мы хотим измерить миллисекунды, это будет delay(1)
.