Мы живём в эпоху перемен. А самое ценное, в условиях быстро меняющейся обстановки - свежие данные, своевременная информация. К сожалению, сейчас весь мир находится под угрозой Коронавируса, данные по заболеванию публикуются и обновляются на нескольких ресурсах.
Но каждый раз заходить на сайт, выискивать информацию - зачем, мы же программисты. Создадим устройство, которое будет получать информацию и отображать на дисплее.
В качестве контроллера будем использовать ESP32 и LCD дисплей с I2C переходником. Кроме этого вам понадобятся соединительные провода, а если вы захотите сделать полностью автономное устройство - аккумулятор.
Подключение дисплея
Подключим дисплей к ESP, благодаря использованию переходника нам нужно только 4 контакта: два для питания и два для передачи данных по протоколу I2C.
Соединим контакты дисплея, с соответствующими контактам платы:
- GND ---> GND
- VCC ---> 5v
- SDA ---> GPIO 4
- SCL ---> GPIO 5
Программирование
Для программирования, будем использовать Micropython. Если вы ещё не знакомы с этим языком программирования - самое время прочитать уроки в нашем блоге.
Для управления экраном, необходимо добавить на ваше устройство файлы , esp8266_i2c_lcd.py и lcd_api.py их можно скачать из этого репозитория.
Программа для контроллера состоит из нескольких частей:
- Подключение контроллера к сети Wi-Fi
- Инициализация дисплея
- Получение данных
- Отображение их на дисплее
Функция подключения к Wi-Fi уже рассматривалась в четвёртом уроке, так что не будет заострять на ней внимание.
Рассмотрим как инициализировать дисплей:
from machine import I2C, Pin
from esp8266_i2c_lcd import I2cLcd
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000) # Инициализация
I2Clcd = I2cLcd(i2c, 0x27, 2, 16) # Подключение экрана: протокол, адрес, количество строк и количество символов
В прошлых уроках мы уже получали данные через различные API, для данного проекта API пришлось создавать самостоятельно. API доступно по адресу https://amperkot.ru/_public-api/coronavirus/, для того чтобы узнать состояние, например в России, необходимо отправить запрос GET, вида: https://amperkot.ru/_public-api/coronavirus/russia.
Сервер вернёт ответ в формате JSON, удобном для обработки:
- {
"name": "Russia",
"confirmed": 658,
"changes": "163",
"percentage_day_change": "32.92",
"deceased": 3,
"changes_today": "2",
"percentage_death_changes": "200",
"recovered": 29,
"serious": 0
}
Не все поля из JSON будут использоваться в нашем проекте, нам понадобятся только confirmed,deceased,recovered,serious и name. Это позволит отобразить число заболевших, умерших, поправившихся и находящихся в тяжёлом состоянии жителей соответствующей страны.
Напишем функции, которые будет отправлять запрос на сервер, обрабатывать ответ, выбирая только необходимые параметры и отображать его на дисплее в красивой, отцентрированной форме. Важно не забыть импортировать библиотеки для запросов и работы с JSON.
- import urequests as requests
import json
def load_data(country = 'total',host = 'https://amperkot.ru/_public-api/coronavirus/{}'):
'''
Получение информации через API
'''
data = requests.get(host.format(country))
return cleard(json.loads(data.text))
def cleard(data):
# Вывод только необходимой информации
return {k:data[k] for k in ['confirmed','deceased','recovered','serious','name']}
def show_data(data):
'''
Отображение информации о состоянии страны
'''
global lcd
lcd.putstr(pretty_show(data['name']))
sleep_ms(5000)
for key in ['confirmed','deceased','recovered','serious']:
lcd.clear()
st = '{}\n{}'.format(pretty_show(key),pretty_show(data[key]))
lcd.putstr(st)
sleep_ms(3000)
def pretty_show(data):
'''
Функция, выводящее содержимое по центру строки
'''
if isinstance(data,str):
x = (16 - len(data))//2
return ' '*x + data[0].upper() + data[1:]
elif isinstance(data,int):
return '{:^16d}'.format(data)
else:
return data
Теперь необходимо зациклить получение информации, для этого воспользуемся бесконечным итератором.
- def cycle(iterable):
'''
Бесконечный генератор
'''
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
for element in saved:
yield element
for country in cycle(['total','russia']): # Список стран
'''
Основной цикл
'''
show_data(load_data(country))
lcd.clear()
Теперь у вас есть собственный трекер Коронавируса! Будьте здоровы и мойте руки!