#include <Wire.h>
#include <SSD1306Ascii.h>
#include <SSD1306AsciiWire.h>
#define DATA_PIN 2
#define BUTTON_PIN 3
#define PWR_SWITCH_PIN 4
SSD1306AsciiWire oled;
void setup() {
pinMode(PWR_SWITCH_PIN, OUTPUT);
digitalWrite(PWR_SWITCH_PIN, LOW); // Включаем питание модуля, если нужно
pinMode(DATA_PIN, INPUT_PULLUP);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT); // Инициализация светодиода
Wire.begin();
Wire.setClock(400000L);
oled.begin(&Adafruit128x64, 0x3C);
oled.setFont(System5x7);
oled.clear();
oled.println(F("DCF77 POLLING TEST"));
oled.println(F("---------------------"));
}
void loop() {
// 1. Читаем состояние линии в реальном времени
bool currentState = digitalRead(DATA_PIN);
// 2. Сразу дергаем светодиод (инверсная логика: LOW на пине = HIGH на диоде)
digitalWrite(LED_BUILTIN, !currentState);
// Статические переменные для отслеживания изменений
static bool lastState = HIGH;
static unsigned long pulseStart = 0;
// 3. Ловим спад (начало импульса)
if (currentState == LOW && lastState == HIGH) {
pulseStart = millis();
}
// 4. Ловим фронт (конец импульса)
else if (currentState == HIGH && lastState == LOW) {
unsigned long ms = millis() - pulseStart;
// Выводим результаты на экран
oled.setCursor(0, 2);
oled.print(F("Dur: "));
oled.print(ms);
oled.print(F(" ms ")); // пробелы затирают старые символы
oled.setCursor(0, 3);
oled.print(F("Type: "));
if (ms >= 60 && ms <= 140) {
oled.print(F("0 (Short) "));
}
else if (ms >= 160 && ms <= 240) {
oled.print(F("1 (Long) "));
}
else if (ms >= 700 && ms <= 1500) {
oled.print(F("[M] (Minute) "));
}
else {
oled.print(F("ERROR "));
}
oled.clearToEOL();
}
// Запоминаем состояние для следующего прохода цикла
lastState = currentState;
}