#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Konfiguracja: LCD I2C 16x2 (Adres standardowy 0x27)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definicje pinow
const int pinSignal = 8; // Wejscie sygnału (z generatora)
const int pinBtn = 2; // Przycisk zmiany trybu
// Zmienne systemowe
bool modeAverage = false; // false = Tryb Chwilowy, true = Tryb Sredni
unsigned long lastUpdate = 0;
// Zmienne do obliczania sredniej
double sampleSum = 0;
int sampleCount = 0;
unsigned long avgStartTime = 0;
void setup() {
// Inicjalizacja sprzetu
lcd.init();
lcd.backlight();
pinMode(pinSignal, INPUT);
pinMode(pinBtn, INPUT_PULLUP);
// Ekran powitalny
lcd.setCursor(0,0);
lcd.print("CZESTOSCIOMIERZ");
lcd.setCursor(0,1);
lcd.print("Arduino Uno");
delay(1500);
lcd.clear();
}
void loop() {
// 1. Obsluga przycisku (zmiana trybu pracy)
if(digitalRead(pinBtn) == LOW) {
delay(50); // Debounce
if(digitalRead(pinBtn) == LOW) {
modeAverage = !modeAverage;
// Informacja na ekranie o zmianie
lcd.clear();
lcd.setCursor(0,0);
lcd.print(modeAverage ? "Tryb: SREDNI" : "Tryb: CHWILOWY");
delay(1000);
lcd.clear();
// Reset zmiennych pomiarowych
avgStartTime = millis();
sampleSum = 0;
sampleCount = 0;
// Czekaj na puszczenie przycisku
while(digitalRead(pinBtn) == LOW);
}
}
// 2. POMIAR SYGNALU (Logika glowna)
// pulseIn mierzy czas trwania impulsu w mikrosekundach
unsigned long highTime = pulseIn(pinSignal, HIGH, 100000); // Timeout 0.1s
unsigned long lowTime = pulseIn(pinSignal, LOW, 100000);
float frequency = 0;
unsigned long period = highTime + lowTime;
// Zabezpieczenie przed dzieleniem przez zero
if (period > 0) {
frequency = 1000000.0 / (float)period;
} else {
frequency = 0;
}
// 3. WYSWIETLANIE WYNIKOW
if (!modeAverage) {
// --- TRYB 1: Pomiar Chwilowy ---
// Odswiezanie co 500ms dla czytelnosci
if (millis() - lastUpdate > 500) {
lcd.setCursor(0, 0);
lcd.print("Freq: ");
lcd.print(frequency);
lcd.print(" Hz "); // Spacje czyszcza poprzednie znaki
lcd.setCursor(0, 1);
lcd.print("Tryb: Instant ");
lastUpdate = millis();
}
}
else {
// --- TRYB 2: Pomiar Sredni (zliczanie probek) ---
if (period > 0) {
sampleSum += frequency;
sampleCount++;
}
// Obliczanie czasu trwania pomiaru
unsigned long elapsedTime = (millis() - avgStartTime) / 1000;
lcd.setCursor(0, 0);
lcd.print("Czas: ");
lcd.print(elapsedTime);
lcd.print("s (n=");
lcd.print(sampleCount);
lcd.print(") ");
lcd.setCursor(0, 1);
if(sampleCount > 0) {
lcd.print("Avg: ");
lcd.print((float)(sampleSum / sampleCount));
lcd.print(" Hz ");
} else {
lcd.print("Czekam...");
}
}
}