Рубрики
Без рубрики

Взломать приборную панель E-чернил

Я понял, что просил Google Assistant одинаковых вопросов снова и снова. Как то, что вылечено … Теги с WebDev, Python, Linux, учебником.

Я понял, что просил Google Assistant одинаковых вопросов снова и снова. Как Какая текущая погода? или Что на моем календаре на сегодня? Поэтому я построил небольшую приборную панель для моей малины PI, которую я мог бы проверить вместо этого.

Я купил Waveshare 2.7inch E-Paper Hat (B) за ~ 20 долларов. Эта версия поставляется с печатной платой, которая справа от промотов в систему ввода/вывода (GPIO) общего назначения Raspberry Pi. Вы также можете использовать включенные провода, чтобы избежать блокировки неиспользуемых пинов GPIO.

Я следовал инструкциям по установке из Waveshare Wiki и выстрелил один из главных программ Hello – есть Версии в C и Python Отказ Шаги, чтобы получить это, а также примерные программы, вполне доступны по сравнению с другими аппаратными аксессуарами PI Raspberry Pi.

Я начал собирать исходный код примеров Python, чтобы понять, как EPD-библиотека работает. Версия B Из этого экрана TRI-цветной, он может отображать белый, черный и красный, а разрешение 264×176. Примеры начинаются с очистки экрана (заполняя его белым), а затем создать два слоя Изображение объекты из Подушка библиотека Отказ Один из слоев – это черный контент, а другой слой является красным содержанием. Затем они передаются в функцию рендера EPD:: Дисплей Отказ

Я извлек и прокомментировал ключевые части Примеры/epd_2in7b_test.py Отказ

# initialize the EPD class
epd = epd2in7b.EPD()
epd.init()

# start with a clear (white) background
epd.Clear()

# define a simple font
font24 = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)

# create empty image objects/layers
HBlackimage = Image.new('1', (epd.height, epd.width), 255)
HRedimage = Image.new('1', (epd.height, epd.width), 255)

# render the black section
black_draw = ImageDraw.Draw(HBlackImage)
black_draw.text((1, 1), top_text, font=FONT_LARGER, fill=0)

# calculate the depth of the black section
top_depth = black_draw.textsize(top_text, font=FONT_LARGER)[1] + 5

# render the red section under the black section
red_draw = ImageDraw.Draw(HRedImage)
red_draw.text((1, top_depth), bottom_text, font=FONT_SMALLER, fill=0)

epd.display(epd.getbuffer(HBlackImage), epd.getbuffer(HRedImage))

Для прототипа я покажу нынешнюю погоду и некоторые новости заголовки из BBC. Открытая погода и Новости API Оба имеют щедрые свободные ярусы. Для каждой из этих функций я напишу функции, которые возвращают текст, который я могу создавать слои.

Я буду использовать отформатированные струны от Python 3.5 (в отличие от превосходных F-струны ), потому что это то, что Raspian (Операционная система Raspberry Pi по умолчанию) поставляется с.

Эта функция разговаривает с открытой погодой, используя ПЮБМ библиотека обертки.

def get_weather():
    '''
    Get the formatted weather description.
    E.g. `Richmond, GB: Clear sky`
    '''
    owm = pyowm.OWM(OPEN_WEATHER_KEY)
    observation = owm.weather_at_place(LOCATION)
    w = observation.get_weather()
    detailed = w.get_detailed_status().capitalize()

    temp_data = w.get_temperature('celsius')
    current_temp = str(temp_data["temp"])
    min_temp = str(temp_data["temp_min"])
    max_temp = str(temp_data["temp_max"])
    text = '{}: {}\n{}°C ({}°C - {}°C)'

    return text.format(LOCATION, detailed, current_temp, min_temp, max_temp) 

Новости API, к сожалению, не имеется современной доступной библиотеки Так что я использую Запросы Чтобы сделать HTTP Call и анализировать данные. Я могу отображать около трех заголовков (включая дополнительную обернутую линию для каждого). Текст должен быть вручную завернутый чтобы остановить его с экрана.

def get_news(limit=3):
    '''
    Get some news headlines from the BBC formatted in a list.
    E.g. `- Acclaimed Swedish author Per Olov Enquist dies
    - PM's return to work 'a boost for the country'
    - 'Myth that Sweden has not taken serious steps'`
    '''
    url = 'https://newsapi.org/v2/top-headlines?sources=bbc-news&apiKey={}'.format(NEWS_API_KEY)
    resp = requests.get(url=url)
    data = resp.json()
    articles = [article['title'] for article in data['articles'][:limit]]

    wrapper = textwrap.TextWrapper(width=33)
    text = ''
    for headline in articles:
        text += '- {}\n'.format(wrapper.fill(text=headline))
    return '{}\n'.format(text)

С этими двумя разделами текста я создаю слои изображения. Я хочу, чтобы погода была на черном цветном слое с немного большим шрифтом. Новости будут ниже красного слоя. Вот функция, которая принимает экземпляр класса EPD, а также два участка текста.

def show_text(epd, top_text='', bottom_text=''):
    '''
    Given an EPD instance, and sections of text, render the text.
    '''
    HBlackImage = Image.new('1', (epd2in7b.EPD_HEIGHT, epd2in7b.EPD_WIDTH), 255)
    HRedImage = Image.new('1', (epd2in7b.EPD_HEIGHT, epd2in7b.EPD_WIDTH), 255)

    # render the black section
    black_draw = ImageDraw.Draw(HBlackImage)
    black_draw.text((1, 1), top_text, font=FONT_LARGER, fill=0)

    # calculate the depth of the black section
    top_depth = black_draw.textsize(top_text, font=FONT_LARGER)[1] + 5

    # render the red section under the black section
    red_draw = ImageDraw.Draw(HRedImage)
    red_draw.text((1, top_depth), bottom_text, font=FONT_SMALLER, fill=0)

    epd.display(epd.getbuffer(HBlackImage), epd.getbuffer(HRedImage))

Объекты два изображения содержат простые данные и не «знают», какого цвета они. Они похожи на это при отображении битовой формата.

Обратите внимание на пространство, которое вторым слоем выходит для первого слоя, так что текст не пересекается.

Основная функция этой программы гарантирует, что мы отображаем только приборную панель в течение нескольких часов, когда кто-то будет проснуться. Я хочу избежать Призрачный о которой документация предупреждает о. Класс EPD, который передается на show_text Функция инициализируется здесь.

def main():
    try:
        epd = epd2in7b.EPD()
        logging.info("Init and Clear")
        epd.init()
        epd.Clear()


        show_text(epd, top_text=get_weather(), bottom_text=get_news())

        # leave the dashboard up for half an hour
        time.sleep(60*30)

        logging.info("Clear...")
        epd.init()
        epd.Clear()

    except IOError as e:
        logging.info(e)
        sys.exit()

    except KeyboardInterrupt:    
        logging.info("ctrl + c:")
        epd2in7b.epdconfig.module_exit()
        sys.exit()

while True:
    t = datetime.datetime.now()

    # rest the screen outside this range
    if 7 <= t.hour <= 22:
        # update the dashboard
        main()
    else:
        time.sleep(30)

Давайте увидимся в действии!

Я не уверен, я буду плоть этот прототип в проект с открытым исходным кодом Так что на данный момент полный исходный код находится в Гист Отказ

Последние мысли

Я не было вложить в нее время работать с четырьмя кнопками слева от экрана (они помечены ключом1, ключом2 и т. Д. На приведенной выше картинке) Но я думаю, что было бы полезно интегрировать их в воплощенную панель инструментов – они соединяются как стандартные кнопки GPIO.

Я узнал, что экраны E-чернил стоят инвестиций для меня, и я мог бы посмотреть на получение гораздо большей версии. Угол обзора – это как у Kindle И хотя это маленькое, это прекрасно смотреть и имеет более «реальный» чувствовать, чем экран ноутбука или смарт-часа.

Я с нетерпением жду, чтобы увидеть этот технологический прогресс и коммерческие приложения, которые возникают. Я видел, что целый рынок продуктов питания использовал их в магазине? В 2016 году Отказ Было бы неплохо иметь меньше светодиодов, глядя на меня всякий раз, когда я покиную дом!

Присоединяйтесь 250+ человек подписались на мой рассылка О программировании и личном росте!

Я чирикаю о коде @healecodes Отказ

Оригинал: “https://dev.to/healeycodes/hacking-together-an-e-ink-dashboard-1li9”