Приложение Маяки Эстонии

Китайский экран 16x2 для Raspberry Pi

13 Апреля

Судя по всему, рынок "примочек" для Raspberry Pi достиг немалых масштабов, раз внимание на него обратили азиатские производители. Львиная доля их продукции - клоны европейских или американских разработок. Имеет ли смысл связываться с ними? Скорее да, чем нет. Если вы хотите финансово отблагодарить разработчика и простимулировать его к дальнейшему развитию, разумеется, лучше купить более дорогой, но оригинальный продукт. Ну а если же вами движет желание сэкономить, то имеет смысл обратить взор на азиатские товары, хотя и тут есть нюанс. Учитывая, что подавляющее большинство подобных товаров приходит вообще без сопроводительной документации, имеет смысл заранее поискать мануалы или готовые скрипты/библиотеки. Искать их нужно в описании товара или комментариях. В крайнем случае, можно связаться с продавцом. Логичнее было бы обратиться к производителю, но у noname-продуктов его не доищешься. Если необходимая документация есть и покупатели в комментариях подтверждают её актуальность - всё в порядке. В противном случае, работа с такой покупкой может превратиться в замысловатый квест.

Перейдём от общего к частному и рассмотрим плату расширения с текстовым экраном 16x2 и пятью кнопками от неизвестного азиатского производителя. Она имеет текстовой экран в две строки по 16 символов, RGB-светодиод и пять сенсорных кнопок. Есть также потенциометр для настройки контрастности экрана. Купил я её на banggood за $7.99 и это клон аналогичной платы от Adafruit, ценой в $19.95 (+ почтовые расходы). Китайская плата идёт сразу "готовой к употреблению", то есть в сборе. Ниже можно увидеть, как выглядят оригинальная плата и её китайский названный родственник:

Что же хорошего в этой плате, кроме цены? Ну, во-первых, она прекрасно подходит к такому корпусу, плотно фиксируясь в его специальных прорезях (с оригинальной платой так не получится).

А во-вторых, "родство" с Adafruit, которая всегда отличалась отличными мануалами и библиотеками для своих продуктов. К великому счастью, китайская плата оказалась полностью совместима с программным обеспечением Adafruit. Единственной аномалией оказался RGB-светодиод, который наотрез отказывался выдавать запрограммированные цвета. Оказалось, что в нём перепутаны каналы Blue и Green, то есть он получается RBG.

Немного о python-библиотеке от Adafruit. Она позволяет работать с экраном, светодиодом и кнопками. Так как экран текстовой, поддерживается только описанный в программном обеспечении набор символов и в данном случае это только буквы латиницы, цифры и основные знаки препинания. Также можно создать до девяти собственных символов. Ниже несколько полезных ссылок:

Вариантов использования такой платы расширения великое множество. Ниже для примера дан скрипт на python, который выполняет следующее:

  • получает данные о погоде в Таллинне с openweathermap.com в формате JSON
  • создаёт специальный символ для обозначения температуры
  • так как описание погоды на русском, конвертирует его в транслитерацию
  • выводит на экран название города, текущую температуру и описание погоды в транслитерации
  • обновляет данные каждые 10 минут, при обновлении светодиод мигает синим

Скрипт также можно  скачать.

screen16x2-weather.py
#!/usr/bin/python

import json
import urllib2
from time import sleep
import Adafruit_CharLCD as LCD

lcd = LCD.Adafruit_CharLCDPlate()
lcd.set_color(0, 0, 0)

lcd.create_char(1, [24,24,3,4,4,4,3,0])

cyrillic_translit = {
	u'\u0410': 'A', u'\u0430': 'a',
	u'\u0411': 'B', u'\u0431': 'b',
	u'\u0412': 'V', u'\u0432': 'v',
	u'\u0413': 'G', u'\u0433': 'g',
	u'\u0414': 'D', u'\u0434': 'd',
	u'\u0415': 'E', u'\u0435': 'e',
	u'\u0416': 'Zh', u'\u0436': 'zh',
	u'\u0417': 'Z', u'\u0437': 'z',
	u'\u0418': 'I', u'\u0438': 'i',
	u'\u0419': 'J', u'\u0439': 'j',
	u'\u041a': 'K', u'\u043a': 'k',
	u'\u041b': 'L', u'\u043b': 'l',
	u'\u041c': 'M', u'\u043c': 'm',
	u'\u041d': 'N', u'\u043d': 'n',
	u'\u041e': 'O', u'\u043e': 'o',
	u'\u041f': 'P', u'\u043f': 'p',
	u'\u0420': 'R', u'\u0440': 'r',
	u'\u0421': 'S', u'\u0441': 's',
	u'\u0422': 'T', u'\u0442': 't',
	u'\u0423': 'U', u'\u0443': 'u',
	u'\u0424': 'F', u'\u0444': 'f',
	u'\u0425': 'Kh', u'\u0445': 'kh',
	u'\u0426': 'Ts', u'\u0446': 'ts',
	u'\u0427': 'Ch', u'\u0447': 'ch',
	u'\u0428': 'Sh', u'\u0448': 'sh',
	u'\u0429': 'Shch', u'\u0449': 'shch',
	u'\u042a': '"', u'\u044a': '"',
	u'\u042b': 'Y', u'\u044b': 'y',
	u'\u042c': "'", u'\u044c': "'",
	u'\u042d': 'E', u'\u044d': 'e',
	u'\u042e': 'Ju', u'\u044e': 'ju',
	u'\u042f': 'Ja', u'\u044f': 'ja'
}

def transliterate(word, translit_table):
    converted_word = ''
    for char in word:
        transchar = ''
        if char in translit_table:
            transchar = translit_table[char]
        else:
            transchar = char
        converted_word += transchar
    return converted_word


while True:
	data = json.load(urllib2.urlopen('http://api.openweathermap.org/data/2.5/find?q=Tallinn&units=metric&lang=ru'))
	while True:
		lcd.set_color(0, 1, 0)
		sleep(0.1)
		lcd.set_color(0, 0, 0)
		break

	lcd.clear()
	lcd.message(data['list'][0]['name'] + " " + str(data['list'][0]['main']['temp']) + "\x01 \n" + transliterate(unicode(data['list'][0]['weather'][0]['description']), cyrillic_translit))

	sleep(600)
        

Не накомментили ещё. Би зэ фёст!

Оставить комментарий

Цитировать
в комментарии