Будильник для 4-значного дисплея

Источник:

Я использую dfrobot firebeetle 2 esp-c6, но вы можете использовать что угодно с Wi-Fi, 4-значный 7-сегментный дисплей MAX7219, аккумулятор 18650, кнопку, зуммер и переключатель для аккумулятора.

Аккумулятор подключается непосредственно к встроенному литий-ионному зарядному устройству на плате, но если у вас его нет, вы можете просто подключить его к контактам VIN и GND и зарядить с помощью внешней платы зарядки.

Распиновка:

Компоненты ЭСП
GPIO8 MAX7219 DIN
GPIO7 MAX7219 КЛК
GPIO6 MAX7219 CS
Зуммер GPIO5 (+)
Кнопка GPIO4 (одна сторона)
3,3 В MAX7219 ВКК
GND MAX7219 GND + Зуммер (-) + Кнопка (другая сторона)

#include
#include
#include

// Настройки Wi-Fi
const char* ssid = «WIFI-SSID»;
const char* пароль = «WIFI-PASS»;

// NTP-клиент (UTC+1: 3600 секунд)
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, «pool.ntp.org», 10800, 60000);

// MAX7219 Пины
#define DIN_PIN 8
#define CLK_PIN 7
#define CS_PIN 6

// Компоненты сигнализации
#define BUZZER_PIN 5
#define BUTTON_PIN 4
Bool AlarmTriggered = ложь;
Bool AlarmActive = ложь;
беззнаковый длинный последний сигнал = 0;
беззнаковый longlastDebounce = 0;
const int debounceDelay = 50;

byteverseSegments(оригинальный байт) {
return ((оригинал & 0x01) << 6) | // Бит 0 → Бит 6 (A↔G)
((оригинал & 0x02) << 4) | // Бит 1 → Бит 5 (B↔F)
((оригинал & 0x04) << 2) | // Бит 2 → Бит 4 (C↔E)
((оригинал & 0x08) << 0) | // Бит 3 → Бит 3 (D остается)
((оригинал & 0x10) >> 2) | // Бит 4 → Бит 2 (E↔C)
((оригинал & 0x20) >> 4) | // Бит 5 → Бит 1 (F↔B)
((исходный & 0x40) >> 6); // Бит 6 → Бит 0 (G↔A)
}

константный байт SEGMENT_MAP[10] = {
обратные сегменты(0x3F), // 0
обратные сегменты(0x06), // 1
обратные сегменты(0x5B), // 2
обратные сегменты(0x4F), // 3
обратные сегменты(0x66), // 4
обратные сегменты(0x6D), // 5
обратные сегменты(0x7D), // 6
обратные сегменты(0x07), // 7
обратные сегменты(0x7F), // 8
обратные сегменты(0x6F) // 9
};

void sendCommand (адрес uint8_t, данные uint8_t) {
digitalWrite(CS_PIN, LOW);
сдвигOut(DIN_PIN, CLK_PIN, MSBFIRST, адрес);
сдвигOut(DIN_PIN, CLK_PIN, MSBFIRST, данные);
digitalWrite(CS_PIN, ВЫСОКИЙ);
}

недействительный initMAX7219() {
pinMode (DIN_PIN, ВЫХОД);
pinMode (CLK_PIN, ВЫХОД);
pinMode (CS_PIN, ВЫХОД);
digitalWrite(CS_PIN, ВЫСОКИЙ);

sendCommand(0x0C, 0x01); // Включение питания
sendCommand(0x09, 0x00); // Нет декодирования
sendCommand(0x0A, 0x0F); // Максимальная яркость
sendCommand(0x0B, 0x03); // Сканируем 4 цифры
for(int i = 1; я <= 4; я++) sendCommand(i, 0x00); // Очистить
}

void displayTime(int часы, int минуты) {
sendCommand(4, SEGMENT_MAP[минут % 10]); // Крайняя правая цифра
sendCommand(3, SEGMENT_MAP[минуты / 10]);
sendCommand(2, SEGMENT_MAP[часов % 10]);
sendCommand(1, SEGMENT_MAP[часы/10]); // Крайняя левая цифра
}

недействительная настройка() {
Serial.begin(115200);
initMAX7219();

// Компоненты сигнализации
pinMode (BUZZER_PIN, ВЫХОД);
pinMode (BUTTON_PIN, INPUT_PULLUP);
digitalWrite (BUZZER_PIN, LOW);

WiFi.begin(ssid, пароль);
while(WiFi.status() != WL_CONNECTED) задержка(500);

timeClient.begin();
timeClient.update();
}

недействительный цикл() {
timeClient.update();
int часы = timeClient.getHours();
int минуты = timeClient.getMinutes();
Serial.print(часы);
Serial.println(минуты);
// Обновить отображение
displayTime(часы, минуты);

// Логика тревоги (6:00 утра)
if (!alarmTriggered && часы == 6 && минуты == 0) {
AlarmActive = правда;
AlarmTriggered = Истина;
Serial.println(«ТРЕВОГА АКТИВИРОВАНА!»);
}

// Обрабатываем активный сигнал тревоги
если (alarmActive) {
// Неблокирующий звуковой сигнал (500 мс вкл/выкл)
if (millis() — LastBeep >= 500) {
digitalWrite(BUZZER_PIN, !digitalRead(BUZZER_PIN));
LastBeep = миллис();
}

// Нажатие кнопки с устранением дребезга
если (digitalRead(BUTTON_PIN) == НИЗКИЙ &&
(millis() — LastDebounce) > debounceDelay) {
AlarmActive = ложь;
цифровая запись(

17:58
4
Нет комментариев. Ваш будет первым!

Ссылка появится после регистрации

Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.