#include <LiquidCrystal.h>

const int lcd_rs = 12, lcd_en = 11, lcd_d4 = 10, lcd_d5 = 9, lcd_d6 = 8, lcd_d7 = 7;
const int inputPin = A0;
const int numSamples = 10;
const unsigned long updateInterval = 1000;

unsigned long t0, t1, lastUpdate;
float frequencySum;
int sampleCount;

LiquidCrystal lcd(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7);

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);

  pinMode(inputPin, INPUT);

  lastUpdate = micros();
  frequencySum = 0;
  sampleCount = 0;
}

void loop() {
  t1 = micros();
  int state = digitalRead(inputPin);
  if (state == LOW) {
    t0 = t1;
  } else {
    unsigned long period = t1 - t0;
    float frequency = 1000000.0 / (float)period;
    frequencySum += frequency;
    sampleCount++;
    if (sampleCount >= numSamples) {
      sampleCount = 0;
      frequencySum /= numSamples;
      if (t1 - lastUpdate >= updateInterval * 1000) {
        lastUpdate = t1;
        lcd.setCursor(0, 0);
        lcd.print("Frequency:");
        lcd.setCursor(0, 1);
        lcd.print(frequency);
        lcd.print(" Hz");
        frequencySum = 0;
      }
    }
  }
}
ClockBreakout