![ESP8266 и MicroPython: часовник с OLED дисплей и NTP синхронизация](http://ardudevelop.eu/wp-content/uploads/2024/10/ESP8266-Часовник-с-OLED-дисплей-и-NTP-синхронизация-с-MicroPython.png)
Въведение
Тази статия разглежда как да създадете прост часовник с 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 проекти, където времето и датата са важни фактори. Описание на подобен проект може да намерите тук.