Как лучше считать время между 0 и 1 в миллисекундах

Прикрутил к ардуино датчик освещения. Когда свет горит - на дисплее 0, когда света нет - 1. Как вычислить и вывести время в миллисекундах между выключенным и включены светом?

// include the library code:
#include <LiquidCrystal.h> //дисплей

int ledPin = 13; //светодиод на 13 порту
int inPin = 2;   // на 2 входе
int val = 0;     // переменная для хранения значения


LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup()
{ 
    lcd.begin(16, 2); // устанавливаем количество столбцов и строк на ЖК-дисплее:
    //lcd.print("hello, world!");  // Выводим сообщение на ЖК-дисплей.
    Serial.begin(9600); //скорость передачи данных
    pinMode(ledPin, OUTPUT);
    pinMode(inPin, INPUT);
}

void loop()
{
    val = digitalRead(inPin); //считывет значение с 2го
    if (val == 0)
    {
        lcd.print (val);; //устанавливает значение на светодиод равное значению входа 5 вольт
        delay(1);
        lcd.clear();
    }
    lcd.print(val);
    delay(100);
    lcd.clear();
}

Ответы (1 шт):

Автор решения: vp_arth

Дела с Ардуинами не имел, вероятно пишу дичь)

int last_state = 0;
int val = 0;

uint32_t switch_time;
uint32_t duration_0;
uint32_t duration_1;

void loop() {
  val = digitalRead(inPin);
  if (last_state != val) { // Состояние изменилось, делаем замеры
    uint32_t now_time = millis();
    if (val == 0) {
      duration_0 = 0;
      duration_1 = now_time - switch_time;
      // lcd.print(duration_1);
    } else {
      duration_0 = now_time - switch_time;
      duration_1 = 0;
      lcd.print(duration_0);
    }
    switch_time = millis();
  }
  last_state = val;
  // ...
}

Скорее всего, лучше всё это вынести в обработчик прерывания а в основном цикле просто печатать волатильную переменную.

→ Ссылка