ESP8266 и MicroPython: часовник с OLED дисплей и NTP синхронизация

ESP8266 и MicroPython: часовник с OLED дисплей и NTP синхронизация

Въведение

Тази статия разглежда как да създадете прост часовник с ESP8266, OLED дисплей и MicroPython, който автоматично сверява времето чрез NTP (Network Time Protocol). Този проект е чудесен начин за обучение по работа с мрежови модули и дисплеи чрез MicroPython.

Описание на компонентите

  • ESP8266: Микроконтролер с Wi-Fi свързаност, който ще се свърже с интернет за NTP синхронизация.
  • OLED дисплей: Използван за визуализиране на часа и датата.
  • NTP сървър: Синхронизира часа, за да гарантира, че часовникът винаги показва точно време.

За този пример сме използвали ESP8266 с вграден SSD1306 OLED дисплей на борда. За да свалите библиотеката за потдръжка, и как се работи с ssd1306 OLED дисплея посетете нашата страница: Работа с OLED дисплей и ESP8266 с MicroPython

За да се запознаете с спецификациите на използваната от нас платформа ESP8266 с OLED на платката, посетете нашето ревю за нея: ESP8266 с OLED дисплей. А ако все още нямате инсталиран MicroPython на вашата ESP8266 платформа, разберете как става това в нашата статия: Как да инсталирате MicroPython на ESP8266.

КОД

import network
import ntptime
import time
from time import sleep
from machine import I2C, Pin
import ssd1306

# Инициализация на OLED дисплей
i2c = I2C(scl=Pin(4), sda=Pin(5), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c, 0x3c)
oled.fill(0)

# Свързване към Wi-Fi
try:
    sta_if = network.WLAN(network.STA_IF)
    sta_if.active(True)
    sta_if.connect("xxxxxxxxxx", "xxxxxxxxxxxx") # заменете с вашето WiFi име и парола
    sleep(1)
    if sta_if.isconnected():
        print("Connected:", sta_if.ifconfig())
except:
    print("Cannot connect to WiFi")
    machine.reset()

# Извеждане на IP адрес на екрана
ip = sta_if.ifconfig()[0]
oled.text(ip, 7, 30, 1)
oled.show()
sleep(1)
oled.fill(0)

# Настройки за NTP синхронизация
UTC_OFFSET = 2 * 60 * 60  # часова зона
sync_interval = 3600  # синхронизация веднъж на час (в секунди)
last_sync = time.time()  # времето на последна синхронизация

# Основен цикъл за показване на час и дата
while True:
    if time.time() - last_sync > sync_interval:
        try:
            ntptime.settime()
            last_sync = time.time()
        except:
            print("NTP sync error")

    # Изчисляване на текущото време с добавка на часовата зона
    time_now = time.localtime(time.time() + UTC_OFFSET)
    year, month, day, hour, minute, second = time_now[:6]

    # Извеждане на OLED
    oled.fill(0)
    oled.rect(0, 0, 128, 64, 1)
    oled.text(f"{year}:{month:02}:{day:02}", 30, 15, 1)
    oled.text(f"{hour:02}:{minute:02}:{second:02}", 35, 35, 1)
    oled.show()
    sleep(1)

Описание на кода

Импортиране на модули:

import network
import ntptime
import time
from time import sleep
from machine import I2C, Pin
import ssd1306

network за Wi-Fi свързаност, ntptime за NTP синхронизация, time за работа с време, machine за контрол на хардуерни пинове, ssd1306 за OLED дисплей.

Инициализация на OLED дисплея:

# Инициализация на OLED дисплей
i2c = I2C(scl=Pin(4), sda=Pin(5), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c, 0x3c)
oled.fill(0)

OLED дисплеят се настройва чрез I2C интерфейса, свързан към пиновете SCL (Pin 4) и SDA (Pin 5). Създава се празен екран с oled.fill(0).

Свързване към Wi-Fi:

# Свързване към Wi-Fi
try:
    sta_if = network.WLAN(network.STA_IF)
    sta_if.active(True)
    sta_if.connect("xxxxxxxxxx", "xxxxxxxxxx")  # заменете с вашето WiFi име и парола
    sleep(1)
    if sta_if.isconnected():
        print("Connected:", sta_if.ifconfig())
except:
    print("Cannot connect to WiFi")
    machine.reset()

Чрез network.WLAN се активира STA интерфейса и ESP8266 се свързва към зададената Wi-Fi мрежа. Ако няма връзка, ESP8266 се рестартира.

Показване на IP адрес:

# Извеждане на IP адрес на екрана
ip = sta_if.ifconfig()[0]
oled.text(ip, 7, 30, 1)
oled.show()
sleep(1)
oled.fill(0)

IP адресът се визуализира на OLED дисплея, за да се уверите, че устройството е свързано към мрежата.

Настройки за NTP синхронизация:

# Настройки за NTP синхронизация
UTC_OFFSET = 2 * 60 * 60  # часова зона
sync_interval = 3600  # синхронизация веднъж на час (в секунди)
last_sync = time.time()  # времето на последна синхронизация

Часовата зона се настройва с UTC_OFFSET, а интервалът за синхронизация е зададен на 1 час. ntptime.settime() актуализира системния часовник.

Основен цикъл за показване на час и дата:

# Основен цикъл за показване на час и дата
while True:
    if time.time() - last_sync > sync_interval:
        try:
            ntptime.settime()
            last_sync = time.time()
        except:
            print("NTP sync error")

    # Изчисляване на текущото време с добавка на часовата зона
    time_now = time.localtime(time.time() + UTC_OFFSET)
    year, month, day, hour, minute, second = time_now[:6]

    # Извеждане на OLED
    oled.fill(0)
    oled.rect(0, 0, 128, 64, 1)
    oled.text(f"{year}:{month:02}:{day:02}", 30, 15, 1)
    oled.text(f"{hour:02}:{minute:02}:{second:02}", 35, 35, 1)
    oled.show()
    sleep(1)

На всяка секунда се показват текущата дата и час, като данните се обновяват на OLED дисплея. Границите на екрана се обозначават с oled.rect, а датата и часът се форматират и изобразяват в реално време.

Заключение

С този проект показахме как да създадем часовник с ESP8266, OLED дисплей и NTP синхронизация чрез MicroPython. Това приложение е полезно за разработка на IoT проекти, където времето и датата са важни фактори. Описание на подобен проект може да намерите тук.

Translate »