Китайский экран 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)
        

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

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

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