Найти тему
Amperkot.ru

Трекер Коронавируса с ESP32, Raspberry Pi (DIY COVID-19 Tracker)

Оглавление


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

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

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

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

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

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

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

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

Для программирования, будем использовать 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()

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