Трекер коронавируса

21 апреля 2020

Статья


Мы живём в эпоху перемен. А самое ценное, в условиях быстро меняющейся обстановки - свежие данные, своевременная информация. К сожалению, сейчас весь мир находится под угрозой Коронавируса, данные по заболеванию публикуются и обновляются на нескольких ресурсах.

Но каждый раз заходить на сайт, выискивать информацию - зачем, мы же программисты. Создадим устройство, которое будет получать информацию и отображать на дисплее.


В качестве контроллера будем использовать ESP32 и LCD дисплей с I2C переходником. Кроме этого вам понадобятся соединительные провода, а если вы захотите сделать полностью автономное устройство - аккумулятор.

Подключение дисплея

Подключим дисплей к ESP, благодаря использованию переходника нам нужно только 4 контакта: два для питания и два для передачи данных по протоколу I2C.

Соединим контакты дисплея, с соответствующими контактам платы:

  • GND ---> GND
  • VCC ---> 5v
  • SDA ---> GPIO 4
  • SCL ---> GPIO 5


Программирование

Для программирования, будем использовать Micropython. Если вы ещё не знакомы с этим языком программирования - самое время прочитать уроки в нашем блоге.

Для управления экраном, необходимо добавить на ваше устройство файлы , esp8266_i2c_lcd.py и lcd_api.py их можно скачать из этого репозитория.

Программа для контроллера состоит из нескольких частей:

  1. Подключение контроллера к сети Wi-Fi
  2. Инициализация дисплея
  3. Получение данных
  4. Отображение их на дисплее

 

Функция подключения к 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()

 

Теперь у вас есть собственный трекер Коронавируса! Будьте здоровы и мойте руки!


В ближайшие дни статья будет расширена созданием трекера на базе Raspberry Pi


Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.


Поделиться: