В лоб: Код (Text): unsigned long t1,t2,dt; while (!digitalRead(PIN_SENSE)); t1 = millis(); while (digitalRead(PIN_SENSE)); while (!digitalRead(PIN_SENSE)); t2 = millis(); while (digitalRead(PIN_SENSE)); dt = t2-t1; Serial.print("dt = "); Serial.println(dt); В затылок: Код (Text): #define STATE_WAIT_1_START 0 #define STATE_WAIT_1_END 1 #define STATE_WAIT_2_START 2 #define STATE_WAIT_2_END 3 #define STATE_DONE 4 unsigned long t1,t2,dt; byte st = STATE_WAIT_1_START; void check_signal() { switch (st) { case STATE_WAIT_1_START: { if (digitalRead(PIN_SENSE)) { t1 = millis(); st = STATE_WAIT_1_END; } break; } case STATE_WAIT_1_END: { if (!digitalRead(PIN_SENSE)) { st = STATE_WAIT_2_START; } break; } switch (st) { case STATE_WAIT_2_START: { if (digitalRead(PIN_SENSE)) { t2 = millis(); st = STATE_WAIT_2_END; } break; } case STATE_WAIT_2_END: { if (!digitalRead(PIN_SENSE)) { dt = t2 - t1; st = STATE_DONE; } break; } default: break; } } void loop() { check_signal() if (STATE_DONE==st) { Serial.print("dt = "); Serial.println(dt); st = STATE_WAIT_1_START; } }
Я пойму если тебе лень ответить но все же) можешь комментарии к коду написать? и как понять в лоб и в затылок?
В лоб - оно в лоб и есть. Ожидается начало импульса: while (!digitalRead(PIN_SENSE)); Т.е. ждет, пока с пина читается 0 (LOW). Фиксируется значение внутреннего счетчика времени: t1 = millis(); Ожидается завершение импульса: while (digitalRead(PIN_SENSE)); Т.е. ждет, пока с пина читается HIGH. Ожидается начало следующего импульса: while (!digitalRead(PIN_SENSE)); Фиксируется значение внутреннего счетчика времени в другую переменную: t2 = millis(); Ожидается завершение импульса (в свете задачи измерения длительности одиночного импульса действие не особо нужное, но чтобы можно было провести корректно измерение в следующий раз): while (digitalRead(PIN_SENSE)); Вычисляется разница между отсечками, которая и даст длительность импульса в миллисекундах. dt = t2-t1; В затылок - то же самое, только вид сбоку - на автомате с пятью состояниями (ожидание первого импульса, ожидание завершения первого импульса, ожидание второго импульса, ожидание завершения второго импульса, завершение измерения) и не блокирующее работу программы на время измерения. Есть, кстати, еще способ. Подходит только для измерения на пине, на котором можно повесить прерывание. Вывешивается означенное прерывание на пин по любому событию (FALLING, RISING, можно и CHANGE, но это необоснованно усложняет задачу, хотя дает дополнительный бонус). В обработчике прерывания фиксируем значение micros() или millis() (в зависимости от требуемой точности измерений) и определяем разницу с предыдущей засечкой, которую скидываем в какую-нибудь глобальную переменную (можно даже в массив, чтобы видеть неравномерность следования импульсов). В случае CHANGE придется также смотреть состояние пина, вызвавшего прерывание, чтобы вычислять разницу между одинаковыми событиями (появление или пропадание импульса). Вместе с тем появляется возможность измерять при помощи прерываний и длительность импульса.