#include <LiquidCrystal_I2C.h>
const int inputPin = 2;
const int outputPin = 13;
const int btnPlus = 3;
const int btnMinus = 4;
bool lastState = LOW;
unsigned long startTime = 0;
unsigned long pulseDuration = 3000;
bool measuring = false;
unsigned long lastDisplayUpdate = 0;
unsigned long displayInterval = 200; // Интервал обновления дисплея
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(inputPin, INPUT);
pinMode(outputPin, OUTPUT);
pinMode(btnPlus, INPUT_PULLUP);
pinMode(btnMinus, INPUT_PULLUP);
digitalWrite(outputPin, LOW); // Инверсия выхода
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ozhidanie...");
delay(1000);
}
void loop() {
bool currentState = digitalRead(inputPin);
if (digitalRead(btnPlus) == LOW) {
pulseDuration += 500;
delay(50);
}
if (digitalRead(btnMinus) == LOW && pulseDuration > 500) {
pulseDuration -= 500;
delay(50);
}
if (lastState == LOW && currentState == HIGH) {
startTime = millis();
measuring = true;
lastDisplayUpdate = 0; // Сбрасываем таймер экрана
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Izmerenie...");
}
if (measuring && millis() - lastDisplayUpdate >= displayInterval) {
lastDisplayUpdate = millis();
float duration = (millis() - startTime) / 1000.0;
lcd.setCursor(0, 1);
lcd.print("Vhod: ");
lcd.print(duration, 1);
lcd.print(" sec "); // Пробелы, чтобы затереть остатки
}
if (lastState == HIGH && currentState == LOW && measuring) {
measuring = false;
float finalDuration = (millis() - startTime) / 1000.0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Impuls: ");
lcd.print(finalDuration, 1);
lcd.print(" sec");
// Запуск выходного импульса
unsigned long outStart = millis();
digitalWrite(outputPin, HIGH); // Включаем выход
while (millis() - outStart < pulseDuration) {
if (millis() - lastDisplayUpdate >= 500) { // Обновляем экран раз в 500 мс
lastDisplayUpdate = millis();
lcd.setCursor(0, 1);
lcd.print("Vyhod: ");
lcd.print((pulseDuration - (millis() - outStart)) / 1000.0, 1);
lcd.print(" sec "); // Пробелы затирают старый текст
}
}
digitalWrite(outputPin, LOW); // Выключаем выход
lcd.setCursor(0, 1);
lcd.print("> Vyhod: ");
lcd.print(pulseDuration / 1000.0, 1);
lcd.print(" sec < ");
}
lastState = currentState;
}