Теперь вот пытаю Питон, в плату залился, диск стартует, изменять код там можно, библиотеки закидывать тоже, осталось какой нибудь тест туда закинуть, чтобы понять как и что и, далее видимо с языком знакомиться )))
Подключился терминалом, первые осмысленные сообщения пошли:
Подтяжка на выводах DSA и SCL не обнаружена, проверь схему подключения
(это я скетч с am2320 нашел)
Странно !!! Я тоже качал не BETA версию - моргает без вопросов и загрузки библиотек.
boot_out.txt
Adafruit CircuitPython 7.3.2 on 2022-07-20; Raspberry Pi Pico with rp2040
Board ID:raspberry_pi_pico
у простых людей простые неисправности у сложных - сложные, это я о себе, плата была на этом жеж чипе только от adafruit )))
Всё заработало!!!
Благодарю!!!
Ищи другой board - тот что по умолчанию МИНИМАЛИСТИЧЕН !
то-есть поднять SPI, I2C и т.д. всё что заявлено для этого процессора в Питоне нереально?
Да, с синглтонами на эту плату не АЙС, решение вроде есть, будем пробовать, посмотреть распиновку можно таким кодом:
# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries
#
# SPDX-License-Identifier: MIT
"""CircuitPython Essentials Pin Map Script"""
import microcontroller
import board
board_pins = []
for pin in dir(microcontroller.pin):
if isinstance(getattr(microcontroller.pin, pin), microcontroller.Pin):
pins = []
for alias in dir(board):
if getattr(board, alias) is getattr(microcontroller.pin, pin):
pins.append("board.{}".format(alias))
if len(pins) > 0:
board_pins.append(" ".join(pins))
for pins in sorted(board_pins):
print(pins)
Приехали и мои платы. Та что на 4 мб - при старте без скетча переключает цвета на Neopixel и потом моргает на 25 пине. Та что на 16 мб - просто включает Neopixel в синий цвет.
Это поведение заложено в загрузчик ? На флешках в режиме загрузчика никаких файлов .uf2 нет ...
Неопиксели некоторые горят синим, когда они не инициализированы, а питание подано. Скорее всего по умолчанию его просто никто не погасил
Дисплей заработал,пришлось пины поправить, код исправил на рабочий в посте выше, кстати, теперь всё что отображается в консоли гонит и на экран )))
непривычно однако
Добавил тестирование цвета, в моём дисплее цвета не инверсные, строка 63 скетча что ниже
чуток расширил тест:
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
"""
This test will initialize the display using displayio and draw a solid green
background, a smaller purple rectangle, and some yellow text.
"""
"""
// код для дисплея (TFT_GO) ESP8266
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <SPI.h>
#define TFT_CS D0
#define TFT_RST D3
#define TFT_DC D4
#define TFT_SCK D5 //HSPI SCK
#define TFT_SDA D7 //HSPI MOSI
#define TFT_LED D8 //HSPI CS
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
// для RP2040
#define TFT_CS GP5 - CS
#define TFT_RST GP6 - RESET
#define TFT_DC GP7 - A0
#define TFT_SCK GP2 - SCK
#define TFT_SDA GP3 - SDA (MOSI, TX)
#define TFT_LED Vout
#define TFT_VCC 3V3 - 3V3
#define TFT_GND GND - GND
"""
import time
import gc
import board
import busio
import terminalio
import displayio
from adafruit_display_text import label
from adafruit_display_shapes.circle import Circle
from adafruit_st7735r import ST7735R
# Release any resources currently in use for the displays
displayio.release_displays()
#I2C строка 19 // busio.I2C(SCL,SDA)
#i2c = busio.I2C(board.GP13, board.GP12)
# UART //busio.UART1(board.(TX), board.(RX))
uart1 = busio.UART(board.GP12, board.GP13)
# spi = board.SPI() // busio.SPI(SCK, TX(MOSI), RX(MISO))
spi = busio.SPI(board.GP2, board.GP3, board.GP4)
tft_cs = board.GP5
tft_rst = board.GP6
tft_dc = board.GP7
tft_lcd = board.GP8
display_bus = displayio.FourWire(
spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst
)
display = ST7735R(display_bus, width=160, height=128, rotation=90, bgr=True)
# Make the display context
splash = displayio.Group()
display.show(splash)
color_bitmap = displayio.Bitmap(160, 128, 1)
color_palette = displayio.Palette(1)
color_palette[0] = 0x00FF00 # Bright Green
bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
splash.append(bg_sprite)
# Draw a smaller inner rectangle
inner_bitmap = displayio.Bitmap(150, 118, 1)
inner_palette = displayio.Palette(1)
inner_palette[0] = 0xAA0088 # Purple
inner_sprite = displayio.TileGrid(inner_bitmap, pixel_shader=inner_palette, x=5, y=5)
splash.append(inner_sprite)
# Draw a label
text_group = displayio.Group(scale=2, x=11, y=64)
text = "Hello World!"
text_area = label.Label(terminalio.FONT, text=text, color=0xFFFF00)
text_group.append(text_area) # Subgroup for text scaling
splash.append(text_group)
time.sleep(5)
# Make the display context
splash = displayio.Group()
display.show(splash)
color_bitmap = displayio.Bitmap(160, 80, 1)
color_palette = displayio.Palette(1)
# write some text in each font color, rgb, cmyk
color_palette[0] = 0x111111 # light grey
text_group_left = displayio.Group(scale=1, x=0, y=6)
text_area_red = label.Label(terminalio.FONT, text="RED", color=0xFF0000)
text_area_green = label.Label(terminalio.FONT, text="\nGREEN", color=0x00FF00)
text_area_blue = label.Label(terminalio.FONT, text="\n\nBLUE", color=0x0000FF)
text_area_white = label.Label(terminalio.FONT, text="\n\n\nWHITE", color=0xFFFFFF)
text_group_left.append(text_area_red)
text_group_left.append(text_area_green)
text_group_left.append(text_area_blue)
text_group_left.append(text_area_white)
splash.append(text_group_left)
text_group_right = displayio.Group(scale=1, x=80, y=6)
text_area_cyan = label.Label(terminalio.FONT, text="CYAN", color=0x00FFFF)
text_group_right.append(text_area_cyan)
text_area_magenta = label.Label(terminalio.FONT, text="\nMAGENTA", color=0xFF00FF)
text_group_right.append(text_area_magenta)
text_area_yellow = label.Label(terminalio.FONT, text="\n\nYELLOW", color=0xFFFF00)
text_group_right.append(text_area_yellow)
text_area_black = label.Label(terminalio.FONT, text="\n\n\nBLACK", color=0x000000)
text_group_right.append(text_area_black)
splash.append(text_group_right)
time.sleep(5)
# Make the display context
main_group = displayio.Group()
# Make a background color fill
color_bitmap = displayio.Bitmap(display.width, display.height, 1)
color_palette = displayio.Palette(1)
color_palette[0] = 0xFFFFFF
bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
main_group.append(bg_sprite)
# Setting up the Circle starting position
posx = 50
posy = 50
# Define Circle characteristics
circle_radius = 20
circle = Circle(posx, posy, circle_radius, fill=0x00FF00, outline=0xFF00FF)
main_group.append(circle)
# Define Circle Animation Steps
delta_x = 2
delta_y = 2
# Showing the items on the screen
display.show(main_group)
while True:
if circle.y + circle_radius >= display.height - circle_radius:
delta_y = -1
if circle.x + circle_radius >= display.width - circle_radius:
delta_x = -1
if circle.x - circle_radius <= 0 - circle_radius:
delta_x = 1
if circle.y - circle_radius <= 0 - circle_radius:
delta_y = 1
circle.x = circle.x + delta_x
circle.y = circle.y + delta_y
time.sleep(0.02)
gc.collect()
# SPDX-FileCopyrightText: Copyright (c) 2021 Jose David M.
#
# SPDX-License-Identifier: Unlicense
"""
Simple test to use the internal led to turn it on and off using morse code
"""
import time
import board
from morsecode import Emitter
# Using Internal led
internal_led = Emitter(board.GP25)
MESSAGE = "Hugo AKA the Architect"
while True:
print(f"Sending {MESSAGE} to the internal led in 3 seconds")
time.sleep(3)
print("starting")
internal_led.outmorse(MESSAGE)
print("Message Ended")
А чего её выносить? Язык и язык. Более современный, чем С++, имеет больше вкусняшек, но идейно - такой же.
я тут пытаюсь с микропитоном разобраться, что-то не пойму, как саму программу на питоне внутрь залить, из командной строки функции отрабатывают, а дальше что??? непонятки
Разобрался и с microPython!
1. Устанавливаем IDE Thonny (sudo apt install thonny)
2. Устанавливаем micropython (sudo apt install micropython)
3. я еще какие-то плагины добавил отсюда
4. Запускаем Thonny, выбираем язык, далее Инструменты-интерпретатор - MicroPython (Rasberry Pi Pico)
5. Выбираем порт - Board in FS Mode Board CDC (/dev/ttyACM0)
Нажатие кнопки запустить текущий скрипт запускает его на выполнение...
Файл - сохранить как - можно выбрать сохранить локально или загрузить в железку
ЗЫ пока не разобрался как обеспечить автозапуск программы при пропадании питания или нажатия кнопки сброс - имя
программы должно быть main.py )))
Thonny можно пользоваться и для загрузки в железку под CircuitPython
(открываем файл на редактирование и просто сохраняем)
Молодец Сережа! Питон - это острие современного программирования. Недаром вся "БигДата" пишется только на Питоне. Что бы ни писал г-н Лилитко, но Питон совсем не тоже самое, что С++. Типизация иная. И, что самое важное, ОЧЕНЬ развитые средства функционального программирования! С ДжаваСкриптом можно сравнить разве что. Можно ли имитировать ФП на С++? Да конечно можно. На нем все написать можно. Но совсем иное, когда итераторы и генераторы являются синтаксической частью языка.
Поразгонял процессор! На 300 мегагерцах интерпретатор свалился, но программа продолжала выполняться. (консоль стала недоступна)
Восстанавливается перезагрузкой microPython...
Тебе не 14 лет! На фиг это не нужно, вредно и не профессионально.
пишут что можно до 400 гнать, при этом позиционируется 133 при технологии 40 нанометров, не маловато ли?
Ощутимого нагрева не заметил, тепловизором не смотрел...
Доступны вставки на ассембрере...то-есть "двухядерный Пентиум-133", в ассемблерном коде это же просто монстр...я так щетаю...
Доступны вставки на ассембрере...то-есть "двухядерный Пентиум-133", в ассемблерном коде это же просто монстр...я так щетаю...
Ой-ли!
Пентиум - суперскалярная архитектура. Насколько я помню, ARM по производительности на такт уступает даже 386 (заметно превосходя по производительности на Ватт). А у Пентиума - еще FPU.
Доступны вставки на ассембрере...то-есть "двухядерный Пентиум-133", в ассемблерном коде это же просто монстр...я так щетаю...
Ой-ли!
Пентиум - суперскалярная архитектура. Насколько я помню, ARM по производительности на такт уступает даже 386 (заметно превосходя по производительности на Ватт). А у Пентиума - еще FPU.
Молодец Сережа! Питон - это острие современного программирования. Недаром вся "БигДата" пишется только на Питоне.
бигдата ладно, на ардуине это не очень актуально. А вот с доступом к железу у него как? По мне раз SDK написано на Си++ - значит все остальное работает через "посредника". То есть дергать регистры из питона это все равно что работать через digitalWrite() - удобно и переносимо, но в сотни раз медленеее прямого доступа
Дак я и дал
получилось!
Теперь вот пытаю Питон, в плату залился, диск стартует, изменять код там можно, библиотеки закидывать тоже, осталось какой нибудь тест туда закинуть, чтобы понять как и что и, далее видимо с языком знакомиться )))
Подключился терминалом, первые осмысленные сообщения пошли:
Подтяжка на выводах DSA и SCL не обнаружена, проверь схему подключения
(это я скетч с am2320 нашел)
import board import neopixel_write import digitalio import random import time pin = digitalio.DigitalInOut(board.GP23) pin.direction = digitalio.Direction.OUTPUT while True: neopixel_write.neopixel_write(pin, bytearray([random.randint(0,63), random.randint(0,63), random.randint(0,63)])) time.sleep(random.random())для черных плат с WS2812 на пине 23
import board import neopixel_write import digitalio import random import time pin = digitalio.DigitalInOut(board.GP23) pin.direction = digitalio.Direction.OUTPUT while True: neopixel_write.neopixel_write(pin, bytearray([random.randint(0,63), random.randint(0,63), random.randint(0,63)])) time.sleep(random.random())строка 7, объект module не имеет аттрибута GP23
Я под CIRCUIT Python писал ...
Я под CIRCUIT Python писал ...
я его и залил, версия 7.3.2
Странно !!! Я тоже качал не BETA версию - моргает без вопросов и загрузки библиотек.
Странно !!! Я тоже качал не BETA версию - моргает без вопросов и загрузки библиотек.
у простых людей простые неисправности у сложных - сложные, это я о себе, плата была на этом жеж чипе только от adafruit )))
Всё заработало!!!
Благодарю!!!
кстати, цикл вешает вывод в компорт однако
Запущенная программа вешает. Ctrl-C развешивает.
А эти драйвера как ставить?
Смотрю пример подключения дисплея, пины не соответствуют нашей плате, то-есть все примеры придётся править?
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT """ This test will initialize the display using displayio and draw a solid green background, a smaller purple rectangle, and some yellow text. """ import board import terminalio import displayio from adafruit_display_text import label from adafruit_st7735r import ST7735R # Release any resources currently in use for the displays displayio.release_displays() spi = board.SPI() tft_cs = board.D5 tft_dc = board.D6 display_bus = displayio.FourWire( spi, command=tft_dc, chip_select=tft_cs, reset=board.D9 ) display = ST7735R(display_bus, width=160, height=128, rotation=90, bgr=True) # Make the display context splash = displayio.Group() display.show(splash) color_bitmap = displayio.Bitmap(160, 128, 1) color_palette = displayio.Palette(1) color_palette[0] = 0x00FF00 # Bright Green bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0) splash.append(bg_sprite) # Draw a smaller inner rectangle inner_bitmap = displayio.Bitmap(150, 118, 1) inner_palette = displayio.Palette(1) inner_palette[0] = 0xAA0088 # Purple inner_sprite = displayio.TileGrid(inner_bitmap, pixel_shader=inner_palette, x=5, y=5) splash.append(inner_sprite) # Draw a label text_group = displayio.Group(scale=2, x=11, y=64) text = "Hello World!" text_area = label.Label(terminalio.FONT, text=text, color=0xFFFF00) text_group.append(text_area) # Subgroup for text scaling splash.append(text_group) while True: passне вижу ни I2C ни SPI и т.д. и как это понимать?
Обзови в коде SPI = GP20 (GP20 для примера) и пользуй хоть в хвост хоть в гриву ...
В коде выше видимо какой то другой модуль board...
Обзови в коде SPI = GP20 (GP20 для примера) и пользуй хоть в хвост хоть в гриву ...
так не взлетает:
Ищи другой board - тот что по умолчанию МИНИМАЛИСТИЧЕН !
Ищи другой board - тот что по умолчанию МИНИМАЛИСТИЧЕН !
то-есть поднять SPI, I2C и т.д. всё что заявлено для этого процессора в Питоне нереально?
Да, с синглтонами на эту плату не АЙС, решение вроде есть, будем пробовать, посмотреть распиновку можно таким кодом:
# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries # # SPDX-License-Identifier: MIT """CircuitPython Essentials Pin Map Script""" import microcontroller import board board_pins = [] for pin in dir(microcontroller.pin): if isinstance(getattr(microcontroller.pin, pin), microcontroller.Pin): pins = [] for alias in dir(board): if getattr(board, alias) is getattr(microcontroller.pin, pin): pins.append("board.{}".format(alias)) if len(pins) > 0: board_pins.append(" ".join(pins)) for pins in sorted(board_pins): print(pins)Приехали и мои платы. Та что на 4 мб - при старте без скетча переключает цвета на Neopixel и потом моргает на 25 пине. Та что на 16 мб - просто включает Neopixel в синий цвет.
Это поведение заложено в загрузчик ? На флешках в режиме загрузчика никаких файлов .uf2 нет ...
Неопиксели некоторые горят синим, когда они не инициализированы, а питание подано. Скорее всего по умолчанию его просто никто не погасил
"на третий день глаз стал потихоньку открываться" из народного фольклора
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT """ This test will initialize the display using displayio and draw a solid green background, a smaller purple rectangle, and some yellow text. """ """ // код для дисплея (TFT_GO) ESP8266 #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 #include <SPI.h> #define TFT_CS D0 #define TFT_RST D3 #define TFT_DC D4 #define TFT_SCK D5 //HSPI SCK #define TFT_SDA D7 //HSPI MOSI #define TFT_LED D8 //HSPI CS Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // для RP2040 #define TFT_CS GP5 - CS #define TFT_RST GP6 - RESET #define TFT_DC GP7 - A0 #define TFT_SCK GP2 - SCK #define TFT_SDA GP3 - SDA (MOSI, TX) #define TFT_LED Vout #define TFT_VCC 3V3 - 3V3 #define TFT_GND GND - GND """ import board import busio import terminalio import displayio from adafruit_display_text import label from adafruit_st7735r import ST7735R # Release any resources currently in use for the displays displayio.release_displays() #I2C строка 19 // busio.I2C(SCL,SDA) #i2c = busio.I2C(board.GP13, board.GP12) # UART //busio.UART1(board.(TX), board.(RX)) uart1 = busio.UART(board.GP12, board.GP13) # spi = board.SPI() // busio.SPI(SCK, TX(MOSI), RX(MISO)) spi = busio.SPI(board.GP2, board.GP3, board.GP4) tft_cs = board.GP5 tft_dc = board.GP7 display_bus = displayio.FourWire( spi, command=tft_dc, chip_select=tft_cs, reset=board.GP6 ) """" display = ST7735R(display_bus, width=160, height=128, rotation=90, bgr=True) # Make the display context splash = displayio.Group() display.show(splash) color_bitmap = displayio.Bitmap(160, 128, 1) color_palette = displayio.Palette(1) color_palette[0] = 0x00FF00 # Bright Green bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0) splash.append(bg_sprite) # Draw a smaller inner rectangle inner_bitmap = displayio.Bitmap(150, 118, 1) inner_palette = displayio.Palette(1) inner_palette[0] = 0xAA0088 # Purple inner_sprite = displayio.TileGrid(inner_bitmap, pixel_shader=inner_palette, x=5, y=5) splash.append(inner_sprite) # Draw a label text_group = displayio.Group(scale=2, x=11, y=64) text = "Hello World!" text_area = label.Label(terminalio.FONT, text=text, color=0xFFFF00) text_group.append(text_area) # Subgroup for text scaling splash.append(text_group) while True: """ display = ST7735R( display_bus, width=160, height=80, colstart=24, rotation=90, bgr=True ) # Make the display context splash = displayio.Group() display.show(splash) color_bitmap = displayio.Bitmap(160, 80, 1) color_palette = displayio.Palette(1) # write some text in each font color, rgb, cmyk color_palette[0] = 0x111111 # light grey text_group_left = displayio.Group(scale=1, x=0, y=6) text_area_red = label.Label(terminalio.FONT, text="RED", color=0xFF0000) text_area_green = label.Label(terminalio.FONT, text="\nGREEN", color=0x00FF00) text_area_blue = label.Label(terminalio.FONT, text="\n\nBLUE", color=0x0000FF) text_area_white = label.Label(terminalio.FONT, text="\n\n\nWHITE", color=0xFFFFFF) text_group_left.append(text_area_red) text_group_left.append(text_area_green) text_group_left.append(text_area_blue) text_group_left.append(text_area_white) splash.append(text_group_left) text_group_right = displayio.Group(scale=1, x=80, y=6) text_area_cyan = label.Label(terminalio.FONT, text="CYAN", color=0x00FFFF) text_group_right.append(text_area_cyan) text_area_magenta = label.Label(terminalio.FONT, text="\nMAGENTA", color=0xFF00FF) text_group_right.append(text_area_magenta) text_area_yellow = label.Label(terminalio.FONT, text="\n\nYELLOW", color=0xFFFF00) text_group_right.append(text_area_yellow) text_area_black = label.Label(terminalio.FONT, text="\n\n\nBLACK", color=0x000000) text_group_right.append(text_area_black) splash.append(text_group_right) while True: passЗавелся дисплей ?
Завелся дисплей ?
Дисплей заработал,пришлось пины поправить, код исправил на рабочий в посте выше, кстати, теперь всё что отображается в консоли гонит и на экран )))
непривычно однако
Добавил тестирование цвета, в моём дисплее цвета не инверсные, строка 63 скетча что ниже
чуток расширил тест:
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT """ This test will initialize the display using displayio and draw a solid green background, a smaller purple rectangle, and some yellow text. """ """ // код для дисплея (TFT_GO) ESP8266 #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 #include <SPI.h> #define TFT_CS D0 #define TFT_RST D3 #define TFT_DC D4 #define TFT_SCK D5 //HSPI SCK #define TFT_SDA D7 //HSPI MOSI #define TFT_LED D8 //HSPI CS Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // для RP2040 #define TFT_CS GP5 - CS #define TFT_RST GP6 - RESET #define TFT_DC GP7 - A0 #define TFT_SCK GP2 - SCK #define TFT_SDA GP3 - SDA (MOSI, TX) #define TFT_LED Vout #define TFT_VCC 3V3 - 3V3 #define TFT_GND GND - GND """ import time import gc import board import busio import terminalio import displayio from adafruit_display_text import label from adafruit_display_shapes.circle import Circle from adafruit_st7735r import ST7735R # Release any resources currently in use for the displays displayio.release_displays() #I2C строка 19 // busio.I2C(SCL,SDA) #i2c = busio.I2C(board.GP13, board.GP12) # UART //busio.UART1(board.(TX), board.(RX)) uart1 = busio.UART(board.GP12, board.GP13) # spi = board.SPI() // busio.SPI(SCK, TX(MOSI), RX(MISO)) spi = busio.SPI(board.GP2, board.GP3, board.GP4) tft_cs = board.GP5 tft_rst = board.GP6 tft_dc = board.GP7 tft_lcd = board.GP8 display_bus = displayio.FourWire( spi, command=tft_dc, chip_select=tft_cs, reset=tft_rst ) display = ST7735R(display_bus, width=160, height=128, rotation=90, bgr=True) # Make the display context splash = displayio.Group() display.show(splash) color_bitmap = displayio.Bitmap(160, 128, 1) color_palette = displayio.Palette(1) color_palette[0] = 0x00FF00 # Bright Green bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0) splash.append(bg_sprite) # Draw a smaller inner rectangle inner_bitmap = displayio.Bitmap(150, 118, 1) inner_palette = displayio.Palette(1) inner_palette[0] = 0xAA0088 # Purple inner_sprite = displayio.TileGrid(inner_bitmap, pixel_shader=inner_palette, x=5, y=5) splash.append(inner_sprite) # Draw a label text_group = displayio.Group(scale=2, x=11, y=64) text = "Hello World!" text_area = label.Label(terminalio.FONT, text=text, color=0xFFFF00) text_group.append(text_area) # Subgroup for text scaling splash.append(text_group) time.sleep(5) # Make the display context splash = displayio.Group() display.show(splash) color_bitmap = displayio.Bitmap(160, 80, 1) color_palette = displayio.Palette(1) # write some text in each font color, rgb, cmyk color_palette[0] = 0x111111 # light grey text_group_left = displayio.Group(scale=1, x=0, y=6) text_area_red = label.Label(terminalio.FONT, text="RED", color=0xFF0000) text_area_green = label.Label(terminalio.FONT, text="\nGREEN", color=0x00FF00) text_area_blue = label.Label(terminalio.FONT, text="\n\nBLUE", color=0x0000FF) text_area_white = label.Label(terminalio.FONT, text="\n\n\nWHITE", color=0xFFFFFF) text_group_left.append(text_area_red) text_group_left.append(text_area_green) text_group_left.append(text_area_blue) text_group_left.append(text_area_white) splash.append(text_group_left) text_group_right = displayio.Group(scale=1, x=80, y=6) text_area_cyan = label.Label(terminalio.FONT, text="CYAN", color=0x00FFFF) text_group_right.append(text_area_cyan) text_area_magenta = label.Label(terminalio.FONT, text="\nMAGENTA", color=0xFF00FF) text_group_right.append(text_area_magenta) text_area_yellow = label.Label(terminalio.FONT, text="\n\nYELLOW", color=0xFFFF00) text_group_right.append(text_area_yellow) text_area_black = label.Label(terminalio.FONT, text="\n\n\nBLACK", color=0x000000) text_group_right.append(text_area_black) splash.append(text_group_right) time.sleep(5) # Make the display context main_group = displayio.Group() # Make a background color fill color_bitmap = displayio.Bitmap(display.width, display.height, 1) color_palette = displayio.Palette(1) color_palette[0] = 0xFFFFFF bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0) main_group.append(bg_sprite) # Setting up the Circle starting position posx = 50 posy = 50 # Define Circle characteristics circle_radius = 20 circle = Circle(posx, posy, circle_radius, fill=0x00FF00, outline=0xFF00FF) main_group.append(circle) # Define Circle Animation Steps delta_x = 2 delta_y = 2 # Showing the items on the screen display.show(main_group) while True: if circle.y + circle_radius >= display.height - circle_radius: delta_y = -1 if circle.x + circle_radius >= display.width - circle_radius: delta_x = -1 if circle.x - circle_radius <= 0 - circle_radius: delta_x = 1 if circle.y - circle_radius <= 0 - circle_radius: delta_y = 1 circle.x = circle.x + delta_x circle.y = circle.y + delta_y time.sleep(0.02) gc.collect()сканер I2C тогда будет выглядеть так:
import time import busio import board #I2C // busio.I2C(SCL,SDA) i2c = busio.I2C(board.GP13, board.GP12) while not i2c.try_lock(): pass print("Press Ctrl-C to exit program") try: while True: print( "I2C addresses found:", [hex(device_address) for device_address in i2c.scan()], ) time.sleep(5) except KeyboardInterrupt: pass finally: i2c.unlock()Есть и библиотека для передачи кодом морзе:
# SPDX-FileCopyrightText: Copyright (c) 2021 Jose David M. # # SPDX-License-Identifier: Unlicense """ Simple test to use the internal led to turn it on and off using morse code """ import time import board from morsecode import Emitter # Using Internal led internal_led = Emitter(board.GP25) MESSAGE = "Hugo AKA the Architect" while True: print(f"Sending {MESSAGE} to the internal led in 3 seconds") time.sleep(3) print("starting") internal_led.outmorse(MESSAGE) print("Message Ended")Два ядра ARM Cortex-M0+ с тактовой частотой 133 МГц (с возможностью разгона до более чем 400 МГц)
тему программирования на Питоне видимо желательно вынести отдельно, а то разрастётся жеж?
А чего её выносить? Язык и язык. Более современный, чем С++, имеет больше вкусняшек, но идейно - такой же.
Есть ли в этом встраиваемом питоне пошаговый отладчик? Если нет, то он нафиг не нужен.
А чего её выносить? Язык и язык. Более современный, чем С++, имеет больше вкусняшек, но идейно - такой же.
я тут пытаюсь с микропитоном разобраться, что-то не пойму, как саму программу на питоне внутрь залить, из командной строки функции отрабатывают, а дальше что??? непонятки
Тут пишут кое-что о микропитоне.
Тут пишут кое-что о микропитоне.
для начинающих CircuitPython будет попроще однако, а вот микропитон как-то глянулся как более близкий к С++
Встроенные модули:
>>> help("modules")
__future__ board onewireio touchio
__main__ builtins os traceback
_asyncio busio paralleldisplay ulab
_bleio collections pulseio ulab
_eve countio pwmio ulab.fft
adafruit_bus_device digitalio qrio ulab.linalg
adafruit_bus_device.i2c_device displayio rainbowio ulab.numpy
adafruit_bus_device.spi_device errno random ulab.scipy
adafruit_pixelbuf floppyio re ulab.scipy.linalg
aesio fontio rgbmatrix ulab.scipy.optimize
alarm framebufferio rotaryio ulab.scipy.signal
analogio gc rp2pio ulab.scipy.special
array getpass rtc ulab.utils
atexit gifio sdcardio usb_cdc
audiobusio imagecapture select usb_hid
audiocore io sharpdisplay usb_midi
audiomixer json storage uselect
audiomp3 keypad struct vectorio
audiopwmio math supervisor watchdog
binascii microcontroller synthio zlib
bitbangio micropython sys
bitmaptools msgpack terminalio
bitops neopixel_write time
Plus any modules on the filesystem
Распиновка:
Разобрался и с microPython!
1. Устанавливаем IDE Thonny (sudo apt install thonny)
2. Устанавливаем micropython (sudo apt install micropython)
3. я еще какие-то плагины добавил отсюда
4. Запускаем Thonny, выбираем язык, далее Инструменты-интерпретатор - MicroPython (Rasberry Pi Pico)
5. Выбираем порт - Board in FS Mode Board CDC (/dev/ttyACM0)
Нажатие кнопки запустить текущий скрипт запускает его на выполнение...
Файл - сохранить как - можно выбрать сохранить локально или загрузить в железку
ЗЫ
пока не разобралсякак обеспечить автозапуск программы при пропадании питания или нажатия кнопки сброс - имяпрограммы должно быть main.py )))
Thonny можно пользоваться и для загрузки в железку под CircuitPython
(открываем файл на редактирование и просто сохраняем)
PS монитор порта прямо в редакторе, удобно однако
Молодец Сережа! Питон - это острие современного программирования. Недаром вся "БигДата" пишется только на Питоне. Что бы ни писал г-н Лилитко, но Питон совсем не тоже самое, что С++. Типизация иная. И, что самое важное, ОЧЕНЬ развитые средства функционального программирования! С ДжаваСкриптом можно сравнить разве что. Можно ли имитировать ФП на С++? Да конечно можно. На нем все написать можно. Но совсем иное, когда итераторы и генераторы являются синтаксической частью языка.
Поразгонял процессор!
На 300 мегагерцах интерпретатор свалился, но программа продолжала выполняться. (консоль стала недоступна)
Восстанавливается перезагрузкой microPython...
по умолчанию частота 125 мегагерц
Поразгонял процессор!
Тебе не 14 лет! На фиг это не нужно, вредно и не профессионально.
Поразгонял процессор!
Тебе не 14 лет! На фиг это не нужно, вредно и не профессионально.
пишут что можно до 400 гнать, при этом позиционируется 133 при технологии 40 нанометров, не маловато ли?
Ощутимого нагрева не заметил, тепловизором не смотрел...
Доступны вставки на ассембрере...то-есть "двухядерный Пентиум-133", в ассемблерном коде это же просто монстр...я так щетаю...
Доступны вставки на ассембрере...то-есть "двухядерный Пентиум-133", в ассемблерном коде это же просто монстр...я так щетаю...
Пентиум - суперскалярная архитектура. Насколько я помню, ARM по производительности на такт уступает даже 386 (заметно превосходя по производительности на Ватт). А у Пентиума - еще FPU.
Доступны вставки на ассембрере...то-есть "двухядерный Пентиум-133", в ассемблерном коде это же просто монстр...я так щетаю...
Пентиум - суперскалярная архитектура. Насколько я помню, ARM по производительности на такт уступает даже 386 (заметно превосходя по производительности на Ватт). А у Пентиума - еще FPU.
эмулятор какого-нибудь Z80 в лёгкую жеж?
Z80, если мне не изменяет память, это 3.5 МГц при 8 разрядах и отсутствии даже аппаратного умножения.
Z80 https://pikabu.ru/story/yemulyator_zx_sectrum_na_rp2040_9251005
Z80 https://pikabu.ru/story/yemulyator_zx_sectrum_na_rp2040_9251005
я то по наитию, а тут всамделе )))
весь эмулятор всего 264 килобайта кстати
Z80 https://pikabu.ru/story/yemulyator_zx_sectrum_na_rp2040_9251005
Слезу пробил. :)
Z80 https://pikabu.ru/story/yemulyator_zx_sectrum_na_rp2040_9251005
Слезу пробил. :)
у меня лежит на столе еще один неоконченный роман, из набора, кнопки там были резиновые, чи допаять?
При работе на 252 МГц - гоняют два DVI монитора битбандингом !
Молодец Сережа! Питон - это острие современного программирования. Недаром вся "БигДата" пишется только на Питоне.
бигдата ладно, на ардуине это не очень актуально. А вот с доступом к железу у него как? По мне раз SDK написано на Си++ - значит все остальное работает через "посредника". То есть дергать регистры из питона это все равно что работать через digitalWrite() - удобно и переносимо, но в сотни раз медленеее прямого доступа
вся "БигДата" пишется только на Питоне
На первом месте в Big Data язык R. Это не умаляет достоинств питона, просто факт.
вся "БигДата" пишется только на Питоне
На первом месте в Big Data язык R. Это не умаляет достоинств питона, просто факт.
что мне позывной теперь менять на Rа? ну уж нет )))
PS Евгений Петрович! Пора внука привлекать поднимать тему...
RTC проверил, через полдня после отключения часики идут нормально, что там за батарейка такая???
Запустил дисплей ST7735 и под microPython, код ниже:
ЗЫ SPI c этим дисплеем работает на скорости до 60 мегагерц на шине
""" Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // для RP2040 #define TFT_CS GP5 - CS #define TFT_RST GP6 - RESET #define TFT_DC GP7 - A0 #define TFT_SCK GP2 - SCK #define TFT_SDA GP3 - SDA (MOSI, TX) #define TFT_LED Vout #define TFT_VCC 3V3 - 3V3 #define TFT_GND GND - GND """ from ST7735 import TFT from sysfont import sysfont from machine import SPI,Pin import time import math spi = SPI(0, baudrate=20000000, polarity=0, phase=0, sck=Pin(2), mosi=Pin(3), miso=None) tft=TFT(spi,7,6,5) tft.initr() tft.rgb(False) tft.rotation(3) def testlines(color): tft.fill(TFT.BLACK) for x in range(0, tft.size()[0], 6): tft.line((0,0),(x, tft.size()[1] - 1), color) for y in range(0, tft.size()[1], 6): tft.line((0,0),(tft.size()[0] - 1, y), color) tft.fill(TFT.BLACK) for x in range(0, tft.size()[0], 6): tft.line((tft.size()[0] - 1, 0), (x, tft.size()[1] - 1), color) for y in range(0, tft.size()[1], 6): tft.line((tft.size()[0] - 1, 0), (0, y), color) tft.fill(TFT.BLACK) for x in range(0, tft.size()[0], 6): tft.line((0, tft.size()[1] - 1), (x, 0), color) for y in range(0, tft.size()[1], 6): tft.line((0, tft.size()[1] - 1), (tft.size()[0] - 1,y), color) tft.fill(TFT.BLACK) for x in range(0, tft.size()[0], 6): tft.line((tft.size()[0] - 1, tft.size()[1] - 1), (x, 0), color) for y in range(0, tft.size()[1], 6): tft.line((tft.size()[0] - 1, tft.size()[1] - 1), (0, y), color) def testfastlines(color1, color2): tft.fill(TFT.BLACK) for y in range(0, tft.size()[1], 5): tft.hline((0,y), tft.size()[0], color1) for x in range(0, tft.size()[0], 5): tft.vline((x,0), tft.size()[1], color2) def testdrawrects(color): tft.fill(TFT.BLACK); for x in range(0,tft.size()[0],6): tft.rect((tft.size()[0]//2 - x//2, tft.size()[1]//2 - x/2), (x, x), color) def testfillrects(color1, color2): tft.fill(TFT.BLACK); for x in range(tft.size()[0],0,-6): tft.fillrect((tft.size()[0]//2 - x//2, tft.size()[1]//2 - x/2), (x, x), color1) tft.rect((tft.size()[0]//2 - x//2, tft.size()[1]//2 - x/2), (x, x), color2) def testfillcircles(radius, color): for x in range(radius, tft.size()[0], radius * 2): for y in range(radius, tft.size()[1], radius * 2): tft.fillcircle((x, y), radius, color) def testdrawcircles(radius, color): for x in range(0, tft.size()[0] + radius, radius * 2): for y in range(0, tft.size()[1] + radius, radius * 2): tft.circle((x, y), radius, color) def testtriangles(): tft.fill(TFT.BLACK); color = 0xF800 w = tft.size()[0] // 2 x = tft.size()[1] - 1 y = 0 z = tft.size()[0] for t in range(0, 15): tft.line((w, y), (y, x), color) tft.line((y, x), (z, x), color) tft.line((z, x), (w, y), color) x -= 4 y += 4 z -= 4 color += 100 def testroundrects(): tft.fill(TFT.BLACK); color = 100 for t in range(5): x = 0 y = 0 w = tft.size()[0] - 2 h = tft.size()[1] - 2 for i in range(17): tft.rect((x, y), (w, h), color) x += 2 y += 3 w -= 4 h -= 6 color += 1100 color += 100 def tftprinttest(): tft.fill(TFT.BLACK); v = 30 tft.text((0, v), "Hello World!", TFT.RED, sysfont, 1, nowrap=True) v += sysfont["Height"] tft.text((0, v), "Hello World!", TFT.YELLOW, sysfont, 2, nowrap=True) v += sysfont["Height"] * 2 tft.text((0, v), "Hello World!", TFT.GREEN, sysfont, 3, nowrap=True) v += sysfont["Height"] * 3 tft.text((0, v), str(1234.567), TFT.BLUE, sysfont, 4, nowrap=True) time.sleep_ms(1500) tft.fill(TFT.BLACK); v = 0 tft.text((0, v), "Hello World!", TFT.RED, sysfont) v += sysfont["Height"] tft.text((0, v), str(math.pi), TFT.GREEN, sysfont) v += sysfont["Height"] tft.text((0, v), " Want pi?", TFT.GREEN, sysfont) v += sysfont["Height"] * 2 tft.text((0, v), hex(8675309), TFT.GREEN, sysfont) v += sysfont["Height"] tft.text((0, v), " Print HEX!", TFT.GREEN, sysfont) v += sysfont["Height"] * 2 tft.text((0, v), "Sketch has been", TFT.WHITE, sysfont) v += sysfont["Height"] tft.text((0, v), "running for: ", TFT.WHITE, sysfont) v += sysfont["Height"] tft.text((0, v), str(time.ticks_ms() / 1000), TFT.PURPLE, sysfont) v += sysfont["Height"] tft.text((0, v), " seconds.", TFT.WHITE, sysfont) def test_main(): tft.fill(TFT.BLACK) tft.text((0, 0), "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", TFT.WHITE, sysfont, 1) time.sleep_ms(1000) tftprinttest() time.sleep_ms(4000) testlines(TFT.YELLOW) time.sleep_ms(500) testfastlines(TFT.RED, TFT.BLUE) time.sleep_ms(500) testdrawrects(TFT.GREEN) time.sleep_ms(500) testfillrects(TFT.YELLOW, TFT.PURPLE) time.sleep_ms(500) tft.fill(TFT.BLACK) testfillcircles(10, TFT.BLUE) testdrawcircles(10, TFT.WHITE) time.sleep_ms(500) testroundrects() time.sleep_ms(500) testtriangles() time.sleep_ms(500) test_main()HC-SR04 и ST7735, тестовый скетч:
from machine import Pin import utime import framebuf import math from ST7735 import TFT from sysfont import sysfont from machine import SPI,Pin import time WIDTH = 160 # tft display width HEIGHT = 128 # tft display height """ // для RP2040 #define TFT_CS GP5 - CS #define TFT_RST GP6 - RESET #define TFT_DC GP7 - A0 #define TFT_SCK GP2 - SCK #define TFT_SDA GP3 - SDA (MOSI, TX) #define TFT_LED Vout #define TFT_VCC 3V3 - 3V3 #define TFT_GND GND - GND """ spi = SPI(0, baudrate=60000000, polarity=0, phase=0, sck=Pin(2), mosi=Pin(3), miso=None) tft=TFT(spi,7,6,5) tft.initr() tft.rgb(True) tft.rotation(3) tft.fill(TFT.BLACK) tft.text((38, 30), "CTAPT:", TFT.YELLOW, sysfont, 3, nowrap=True) utime.sleep(3) """ oled = SSD1306_I2C(128, 64, i2c) oled.text("STechiezDIY !!!",5,5) oled.text("Pico",5,15) oled.text("HCSR04",5,25) oled.text("SSD1306",5,35) """ trigger = Pin(15, Pin.OUT) echo = Pin(14, Pin.IN) def get_distance(): trigger.low() utime.sleep_us(2) trigger.high() utime.sleep_us(5) trigger.low() while echo.value() == 0: signaloff = utime.ticks_us() while echo.value() == 1: signalon = utime.ticks_us() timepassed = signalon - signaloff distance = (timepassed * 0.0343) / 2 print("The distance from object is ",distance,"cm") return distance while True: tft.fill(TFT.BLACK); ret_val = get_distance() tft.text((12, 30), "Distance:", TFT.YELLOW, sysfont, 3, nowrap=True) tft.text((22, 60), str(ret_val) + " cm", TFT.YELLOW, sysfont, 2, nowrap=True) utime.sleep(1)Библиотеки:
ST7735
#driver for Sainsmart 1.8" TFT display ST7735 #Translated by Guy Carver from the ST7735 sample code. #Modirfied for micropython-esp32 by boochow import machine import time from math import sqrt #TFTRotations and TFTRGB are bits to set # on MADCTL to control display rotation/color layout #Looking at display with pins on top. #00 = upper left printing right #10 = does nothing (MADCTL_ML) #20 = upper left printing down (backwards) (Vertical flip) #40 = upper right printing left (backwards) (X Flip) #80 = lower left printing right (backwards) (Y Flip) #04 = (MADCTL_MH) #60 = 90 right rotation #C0 = 180 right rotation #A0 = 270 right rotation TFTRotations = [0x00, 0x60, 0xC0, 0xA0] TFTBGR = 0x08 #When set color is bgr else rgb. TFTRGB = 0x00 #@micropython.native def clamp( aValue, aMin, aMax ) : return max(aMin, min(aMax, aValue)) #@micropython.native def TFTColor( aR, aG, aB ) : '''Create a 16 bit rgb value from the given R,G,B from 0-255. This assumes rgb 565 layout and will be incorrect for bgr.''' return ((aR & 0xF8) << 8) | ((aG & 0xFC) << 3) | (aB >> 3) ScreenSize = (128, 160) class TFT(object) : """Sainsmart TFT 7735 display driver.""" NOP = 0x0 SWRESET = 0x01 RDDID = 0x04 RDDST = 0x09 SLPIN = 0x10 SLPOUT = 0x11 PTLON = 0x12 NORON = 0x13 INVOFF = 0x20 INVON = 0x21 DISPOFF = 0x28 DISPON = 0x29 CASET = 0x2A RASET = 0x2B RAMWR = 0x2C RAMRD = 0x2E VSCRDEF = 0x33 VSCSAD = 0x37 COLMOD = 0x3A MADCTL = 0x36 FRMCTR1 = 0xB1 FRMCTR2 = 0xB2 FRMCTR3 = 0xB3 INVCTR = 0xB4 DISSET5 = 0xB6 PWCTR1 = 0xC0 PWCTR2 = 0xC1 PWCTR3 = 0xC2 PWCTR4 = 0xC3 PWCTR5 = 0xC4 VMCTR1 = 0xC5 RDID1 = 0xDA RDID2 = 0xDB RDID3 = 0xDC RDID4 = 0xDD PWCTR6 = 0xFC GMCTRP1 = 0xE0 GMCTRN1 = 0xE1 BLACK = 0 RED = TFTColor(0xFF, 0x00, 0x00) MAROON = TFTColor(0x80, 0x00, 0x00) GREEN = TFTColor(0x00, 0xFF, 0x00) FOREST = TFTColor(0x00, 0x80, 0x80) BLUE = TFTColor(0x00, 0x00, 0xFF) NAVY = TFTColor(0x00, 0x00, 0x80) CYAN = TFTColor(0x00, 0xFF, 0xFF) YELLOW = TFTColor(0xFF, 0xFF, 0x00) PURPLE = TFTColor(0xFF, 0x00, 0xFF) WHITE = TFTColor(0xFF, 0xFF, 0xFF) GRAY = TFTColor(0x80, 0x80, 0x80) @staticmethod def color( aR, aG, aB ) : '''Create a 565 rgb TFTColor value''' return TFTColor(aR, aG, aB) def __init__( self, spi, aDC, aReset, aCS) : """aLoc SPI pin location is either 1 for 'X' or 2 for 'Y'. aDC is the DC pin and aReset is the reset pin.""" self._size = ScreenSize self._offset = bytearray([0,0]) self.rotate = 0 #Vertical with top toward pins. self._rgb = True #color order of rgb. self.tfa = 0 #top fixed area self.bfa = 0 #bottom fixed area self.dc = machine.Pin(aDC, machine.Pin.OUT, machine.Pin.PULL_DOWN) self.reset = machine.Pin(aReset, machine.Pin.OUT, machine.Pin.PULL_DOWN) self.cs = machine.Pin(aCS, machine.Pin.OUT, machine.Pin.PULL_DOWN) self.cs(1) self.spi = spi self.colorData = bytearray(2) self.windowLocData = bytearray(4) def size( self ) : return self._size # @micropython.native def on( self, aTF = True ) : '''Turn display on or off.''' self._writecommand(TFT.DISPON if aTF else TFT.DISPOFF) # @micropython.native def invertcolor( self, aBool ) : '''Invert the color data IE: Black = White.''' self._writecommand(TFT.INVON if aBool else TFT.INVOFF) # @micropython.native def rgb( self, aTF = True ) : '''True = rgb else bgr''' self._rgb = aTF self._setMADCTL() # @micropython.native def rotation( self, aRot ) : '''0 - 3. Starts vertical with top toward pins and rotates 90 deg clockwise each step.''' if (0 <= aRot < 4): rotchange = self.rotate ^ aRot self.rotate = aRot #If switching from vertical to horizontal swap x,y # (indicated by bit 0 changing). if (rotchange & 1): self._size =(self._size[1], self._size[0]) self._setMADCTL() # @micropython.native def pixel( self, aPos, aColor ) : '''Draw a pixel at the given position''' if 0 <= aPos[0] < self._size[0] and 0 <= aPos[1] < self._size[1]: self._setwindowpoint(aPos) self._pushcolor(aColor) # @micropython.native def text( self, aPos, aString, aColor, aFont, aSize = 1, nowrap = False ) : '''Draw a text at the given position. If the string reaches the end of the display it is wrapped to aPos[0] on the next line. aSize may be an integer which will size the font uniformly on w,h or a or any type that may be indexed with [0] or [1].''' if aFont == None: return #Make a size either from single value or 2 elements. if (type(aSize) == int) or (type(aSize) == float): wh = (aSize, aSize) else: wh = aSize px, py = aPos width = wh[0] * aFont["Width"] + 1 for c in aString: self.char((px, py), c, aColor, aFont, wh) px += width #We check > rather than >= to let the right (blank) edge of the # character print off the right of the screen. if px + width > self._size[0]: if nowrap: break else: py += aFont["Height"] * wh[1] + 1 px = aPos[0] # @micropython.native def char( self, aPos, aChar, aColor, aFont, aSizes ) : '''Draw a character at the given position using the given font and color. aSizes is a tuple with x, y as integer scales indicating the # of pixels to draw for each pixel in the character.''' if aFont == None: return startchar = aFont['Start'] endchar = aFont['End'] ci = ord(aChar) if (startchar <= ci <= endchar): fontw = aFont['Width'] fonth = aFont['Height'] ci = (ci - startchar) * fontw charA = aFont["Data"][ci:ci + fontw] px = aPos[0] if aSizes[0] <= 1 and aSizes[1] <= 1 : buf = bytearray(2 * fonth * fontw) for q in range(fontw) : c = charA[q] for r in range(fonth) : if c & 0x01 : pos = 2 * (r * fontw + q) buf[pos] = aColor >> 8 buf[pos + 1] = aColor & 0xff c >>= 1 self.image(aPos[0], aPos[1], aPos[0] + fontw - 1, aPos[1] + fonth - 1, buf) else: for c in charA : py = aPos[1] for r in range(fonth) : if c & 0x01 : self.fillrect((px, py), aSizes, aColor) py += aSizes[1] c >>= 1 px += aSizes[0] # @micropython.native def line( self, aStart, aEnd, aColor ) : '''Draws a line from aStart to aEnd in the given color. Vertical or horizontal lines are forwarded to vline and hline.''' if aStart[0] == aEnd[0]: #Make sure we use the smallest y. pnt = aEnd if (aEnd[1] < aStart[1]) else aStart self.vline(pnt, abs(aEnd[1] - aStart[1]) + 1, aColor) elif aStart[1] == aEnd[1]: #Make sure we use the smallest x. pnt = aEnd if aEnd[0] < aStart[0] else aStart self.hline(pnt, abs(aEnd[0] - aStart[0]) + 1, aColor) else: px, py = aStart ex, ey = aEnd dx = ex - px dy = ey - py inx = 1 if dx > 0 else -1 iny = 1 if dy > 0 else -1 dx = abs(dx) dy = abs(dy) if (dx >= dy): dy <<= 1 e = dy - dx dx <<= 1 while (px != ex): self.pixel((px, py), aColor) if (e >= 0): py += iny e -= dx e += dy px += inx else: dx <<= 1 e = dx - dy dy <<= 1 while (py != ey): self.pixel((px, py), aColor) if (e >= 0): px += inx e -= dy e += dx py += iny # @micropython.native def vline( self, aStart, aLen, aColor ) : '''Draw a vertical line from aStart for aLen. aLen may be negative.''' start = (clamp(aStart[0], 0, self._size[0]), clamp(aStart[1], 0, self._size[1])) stop = (start[0], clamp(start[1] + aLen, 0, self._size[1])) #Make sure smallest y 1st. if (stop[1] < start[1]): start, stop = stop, start self._setwindowloc(start, stop) self._setColor(aColor) self._draw(aLen) # @micropython.native def hline( self, aStart, aLen, aColor ) : '''Draw a horizontal line from aStart for aLen. aLen may be negative.''' start = (clamp(aStart[0], 0, self._size[0]), clamp(aStart[1], 0, self._size[1])) stop = (clamp(start[0] + aLen, 0, self._size[0]), start[1]) #Make sure smallest x 1st. if (stop[0] < start[0]): start, stop = stop, start self._setwindowloc(start, stop) self._setColor(aColor) self._draw(aLen) # @micropython.native def rect( self, aStart, aSize, aColor ) : '''Draw a hollow rectangle. aStart is the smallest coordinate corner and aSize is a tuple indicating width, height.''' self.hline(aStart, aSize[0], aColor) self.hline((aStart[0], aStart[1] + aSize[1] - 1), aSize[0], aColor) self.vline(aStart, aSize[1], aColor) self.vline((aStart[0] + aSize[0] - 1, aStart[1]), aSize[1], aColor) # @micropython.native def fillrect( self, aStart, aSize, aColor ) : '''Draw a filled rectangle. aStart is the smallest coordinate corner and aSize is a tuple indicating width, height.''' start = (clamp(aStart[0], 0, self._size[0]), clamp(aStart[1], 0, self._size[1])) end = (clamp(start[0] + aSize[0] - 1, 0, self._size[0]), clamp(start[1] + aSize[1] - 1, 0, self._size[1])) if (end[0] < start[0]): tmp = end[0] end = (start[0], end[1]) start = (tmp, start[1]) if (end[1] < start[1]): tmp = end[1] end = (end[0], start[1]) start = (start[0], tmp) self._setwindowloc(start, end) numPixels = (end[0] - start[0] + 1) * (end[1] - start[1] + 1) self._setColor(aColor) self._draw(numPixels) # @micropython.native def circle( self, aPos, aRadius, aColor ) : '''Draw a hollow circle with the given radius and color with aPos as center.''' self.colorData[0] = aColor >> 8 self.colorData[1] = aColor xend = int(0.7071 * aRadius) + 1 rsq = aRadius * aRadius for x in range(xend) : y = int(sqrt(rsq - x * x)) xp = aPos[0] + x yp = aPos[1] + y xn = aPos[0] - x yn = aPos[1] - y xyp = aPos[0] + y yxp = aPos[1] + x xyn = aPos[0] - y yxn = aPos[1] - x self._setwindowpoint((xp, yp)) self._writedata(self.colorData) self._setwindowpoint((xp, yn)) self._writedata(self.colorData) self._setwindowpoint((xn, yp)) self._writedata(self.colorData) self._setwindowpoint((xn, yn)) self._writedata(self.colorData) self._setwindowpoint((xyp, yxp)) self._writedata(self.colorData) self._setwindowpoint((xyp, yxn)) self._writedata(self.colorData) self._setwindowpoint((xyn, yxp)) self._writedata(self.colorData) self._setwindowpoint((xyn, yxn)) self._writedata(self.colorData) # @micropython.native def fillcircle( self, aPos, aRadius, aColor ) : '''Draw a filled circle with given radius and color with aPos as center''' rsq = aRadius * aRadius for x in range(aRadius) : y = int(sqrt(rsq - x * x)) y0 = aPos[1] - y ey = y0 + y * 2 y0 = clamp(y0, 0, self._size[1]) ln = abs(ey - y0) + 1; self.vline((aPos[0] + x, y0), ln, aColor) self.vline((aPos[0] - x, y0), ln, aColor) def fill( self, aColor = BLACK ) : '''Fill screen with the given color.''' self.fillrect((0, 0), self._size, aColor) def image( self, x0, y0, x1, y1, data ) : self._setwindowloc((x0, y0), (x1, y1)) self._writedata(data) def setvscroll(self, tfa, bfa) : ''' set vertical scroll area ''' self._writecommand(TFT.VSCRDEF) data2 = bytearray([0, tfa]) self._writedata(data2) data2[1] = 162 - tfa - bfa self._writedata(data2) data2[1] = bfa self._writedata(data2) self.tfa = tfa self.bfa = bfa def vscroll(self, value) : a = value + self.tfa if (a + self.bfa > 162) : a = 162 - self.bfa self._vscrolladdr(a) def _vscrolladdr(self, addr) : self._writecommand(TFT.VSCSAD) data2 = bytearray([addr >> 8, addr & 0xff]) self._writedata(data2) # @micropython.native def _setColor( self, aColor ) : self.colorData[0] = aColor >> 8 self.colorData[1] = aColor self.buf = bytes(self.colorData) * 32 # @micropython.native def _draw( self, aPixels ) : '''Send given color to the device aPixels times.''' self.dc(1) self.cs(0) for i in range(aPixels//32): self.spi.write(self.buf) rest = (int(aPixels) % 32) if rest > 0: buf2 = bytes(self.colorData) * rest self.spi.write(buf2) self.cs(1) # @micropython.native def _setwindowpoint( self, aPos ) : '''Set a single point for drawing a color to.''' x = self._offset[0] + int(aPos[0]) y = self._offset[1] + int(aPos[1]) self._writecommand(TFT.CASET) #Column address set. self.windowLocData[0] = self._offset[0] self.windowLocData[1] = x self.windowLocData[2] = self._offset[0] self.windowLocData[3] = x self._writedata(self.windowLocData) self._writecommand(TFT.RASET) #Row address set. self.windowLocData[0] = self._offset[1] self.windowLocData[1] = y self.windowLocData[2] = self._offset[1] self.windowLocData[3] = y self._writedata(self.windowLocData) self._writecommand(TFT.RAMWR) #Write to RAM. # @micropython.native def _setwindowloc( self, aPos0, aPos1 ) : '''Set a rectangular area for drawing a color to.''' self._writecommand(TFT.CASET) #Column address set. self.windowLocData[0] = self._offset[0] self.windowLocData[1] = self._offset[0] + int(aPos0[0]) self.windowLocData[2] = self._offset[0] self.windowLocData[3] = self._offset[0] + int(aPos1[0]) self._writedata(self.windowLocData) self._writecommand(TFT.RASET) #Row address set. self.windowLocData[0] = self._offset[1] self.windowLocData[1] = self._offset[1] + int(aPos0[1]) self.windowLocData[2] = self._offset[1] self.windowLocData[3] = self._offset[1] + int(aPos1[1]) self._writedata(self.windowLocData) self._writecommand(TFT.RAMWR) #Write to RAM. #@micropython.native def _writecommand( self, aCommand ) : '''Write given command to the device.''' self.dc(0) self.cs(0) self.spi.write(bytearray([aCommand])) self.cs(1) #@micropython.native def _writedata( self, aData ) : '''Write given data to the device. This may be either a single int or a bytearray of values.''' self.dc(1) self.cs(0) self.spi.write(aData) self.cs(1) #@micropython.native def _pushcolor( self, aColor ) : '''Push given color to the device.''' self.colorData[0] = aColor >> 8 self.colorData[1] = aColor self._writedata(self.colorData) #@micropython.native def _setMADCTL( self ) : '''Set screen rotation and RGB/BGR format.''' self._writecommand(TFT.MADCTL) rgb = TFTRGB if self._rgb else TFTBGR self._writedata(bytearray([TFTRotations[self.rotate] | rgb])) #@micropython.native def _reset( self ) : '''Reset the device.''' self.dc(0) self.reset(1) time.sleep_us(500) self.reset(0) time.sleep_us(500) self.reset(1) time.sleep_us(500) def initb( self ) : '''Initialize blue tab version.''' self._size = (ScreenSize[0] + 2, ScreenSize[1] + 1) self._reset() self._writecommand(TFT.SWRESET) #Software reset. time.sleep_us(50) self._writecommand(TFT.SLPOUT) #out of sleep mode. time.sleep_us(500) data1 = bytearray(1) self._writecommand(TFT.COLMOD) #Set color mode. data1[0] = 0x05 #16 bit color. self._writedata(data1) time.sleep_us(10) data3 = bytearray([0x00, 0x06, 0x03]) #fastest refresh, 6 lines front, 3 lines back. self._writecommand(TFT.FRMCTR1) #Frame rate control. self._writedata(data3) time.sleep_us(10) self._writecommand(TFT.MADCTL) data1[0] = 0x08 #row address/col address, bottom to top refresh self._writedata(data1) data2 = bytearray(2) self._writecommand(TFT.DISSET5) #Display settings data2[0] = 0x15 #1 clock cycle nonoverlap, 2 cycle gate rise, 3 cycle oscil, equalize data2[1] = 0x02 #fix on VTL self._writedata(data2) self._writecommand(TFT.INVCTR) #Display inversion control data1[0] = 0x00 #Line inversion. self._writedata(data1) self._writecommand(TFT.PWCTR1) #Power control data2[0] = 0x02 #GVDD = 4.7V data2[1] = 0x70 #1.0uA self._writedata(data2) time.sleep_us(10) self._writecommand(TFT.PWCTR2) #Power control data1[0] = 0x05 #VGH = 14.7V, VGL = -7.35V self._writedata(data1) self._writecommand(TFT.PWCTR3) #Power control data2[0] = 0x01 #Opamp current small data2[1] = 0x02 #Boost frequency self._writedata(data2) self._writecommand(TFT.VMCTR1) #Power control data2[0] = 0x3C #VCOMH = 4V data2[1] = 0x38 #VCOML = -1.1V self._writedata(data2) time.sleep_us(10) self._writecommand(TFT.PWCTR6) #Power control data2[0] = 0x11 data2[1] = 0x15 self._writedata(data2) #These different values don't seem to make a difference. # dataGMCTRP = bytearray([0x0f, 0x1a, 0x0f, 0x18, 0x2f, 0x28, 0x20, 0x22, 0x1f, # 0x1b, 0x23, 0x37, 0x00, 0x07, 0x02, 0x10]) dataGMCTRP = bytearray([0x02, 0x1c, 0x07, 0x12, 0x37, 0x32, 0x29, 0x2d, 0x29, 0x25, 0x2b, 0x39, 0x00, 0x01, 0x03, 0x10]) self._writecommand(TFT.GMCTRP1) self._writedata(dataGMCTRP) # dataGMCTRN = bytearray([0x0f, 0x1b, 0x0f, 0x17, 0x33, 0x2c, 0x29, 0x2e, 0x30, # 0x30, 0x39, 0x3f, 0x00, 0x07, 0x03, 0x10]) dataGMCTRN = bytearray([0x03, 0x1d, 0x07, 0x06, 0x2e, 0x2c, 0x29, 0x2d, 0x2e, 0x2e, 0x37, 0x3f, 0x00, 0x00, 0x02, 0x10]) self._writecommand(TFT.GMCTRN1) self._writedata(dataGMCTRN) time.sleep_us(10) self._writecommand(TFT.CASET) #Column address set. self.windowLocData[0] = 0x00 self.windowLocData[1] = 2 #Start at column 2 self.windowLocData[2] = 0x00 self.windowLocData[3] = self._size[0] - 1 self._writedata(self.windowLocData) self._writecommand(TFT.RASET) #Row address set. self.windowLocData[1] = 1 #Start at row 2. self.windowLocData[3] = self._size[1] - 1 self._writedata(self.windowLocData) self._writecommand(TFT.NORON) #Normal display on. time.sleep_us(10) self._writecommand(TFT.RAMWR) time.sleep_us(500) self._writecommand(TFT.DISPON) self.cs(1) time.sleep_us(500) def initr( self ) : '''Initialize a red tab version.''' self._reset() self._writecommand(TFT.SWRESET) #Software reset. time.sleep_us(150) self._writecommand(TFT.SLPOUT) #out of sleep mode. time.sleep_us(500) data3 = bytearray([0x01, 0x2C, 0x2D]) #fastest refresh, 6 lines front, 3 lines back. self._writecommand(TFT.FRMCTR1) #Frame rate control. self._writedata(data3) self._writecommand(TFT.FRMCTR2) #Frame rate control. self._writedata(data3) data6 = bytearray([0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d]) self._writecommand(TFT.FRMCTR3) #Frame rate control. self._writedata(data6) time.sleep_us(10) data1 = bytearray(1) self._writecommand(TFT.INVCTR) #Display inversion control data1[0] = 0x07 #Line inversion. self._writedata(data1) self._writecommand(TFT.PWCTR1) #Power control data3[0] = 0xA2 data3[1] = 0x02 data3[2] = 0x84 self._writedata(data3) self._writecommand(TFT.PWCTR2) #Power control data1[0] = 0xC5 #VGH = 14.7V, VGL = -7.35V self._writedata(data1) data2 = bytearray(2) self._writecommand(TFT.PWCTR3) #Power control data2[0] = 0x0A #Opamp current small data2[1] = 0x00 #Boost frequency self._writedata(data2) self._writecommand(TFT.PWCTR4) #Power control data2[0] = 0x8A #Opamp current small data2[1] = 0x2A #Boost frequency self._writedata(data2) self._writecommand(TFT.PWCTR5) #Power control data2[0] = 0x8A #Opamp current small data2[1] = 0xEE #Boost frequency self._writedata(data2) self._writecommand(TFT.VMCTR1) #Power control data1[0] = 0x0E self._writedata(data1) self._writecommand(TFT.INVOFF) self._writecommand(TFT.MADCTL) #Power control data1[0] = 0xC8 self._writedata(data1) self._writecommand(TFT.COLMOD) data1[0] = 0x05 self._writedata(data1) self._writecommand(TFT.CASET) #Column address set. self.windowLocData[0] = 0x00 self.windowLocData[1] = 0x00 self.windowLocData[2] = 0x00 self.windowLocData[3] = self._size[0] - 1 self._writedata(self.windowLocData) self._writecommand(TFT.RASET) #Row address set. self.windowLocData[3] = self._size[1] - 1 self._writedata(self.windowLocData) dataGMCTRP = bytearray([0x0f, 0x1a, 0x0f, 0x18, 0x2f, 0x28, 0x20, 0x22, 0x1f, 0x1b, 0x23, 0x37, 0x00, 0x07, 0x02, 0x10]) self._writecommand(TFT.GMCTRP1) self._writedata(dataGMCTRP) dataGMCTRN = bytearray([0x0f, 0x1b, 0x0f, 0x17, 0x33, 0x2c, 0x29, 0x2e, 0x30, 0x30, 0x39, 0x3f, 0x00, 0x07, 0x03, 0x10]) self._writecommand(TFT.GMCTRN1) self._writedata(dataGMCTRN) time.sleep_us(10) self._writecommand(TFT.DISPON) time.sleep_us(100) self._writecommand(TFT.NORON) #Normal display on. time.sleep_us(10) self.cs(1) def initb2( self ) : '''Initialize another blue tab version.''' self._size = (ScreenSize[0] + 2, ScreenSize[1] + 1) self._offset[0] = 2 self._offset[1] = 1 self._reset() self._writecommand(TFT.SWRESET) #Software reset. time.sleep_us(50) self._writecommand(TFT.SLPOUT) #out of sleep mode. time.sleep_us(500) data3 = bytearray([0x01, 0x2C, 0x2D]) # self._writecommand(TFT.FRMCTR1) #Frame rate control. self._writedata(data3) time.sleep_us(10) self._writecommand(TFT.FRMCTR2) #Frame rate control. self._writedata(data3) time.sleep_us(10) self._writecommand(TFT.FRMCTR3) #Frame rate control. self._writedata(data3) time.sleep_us(10) self._writecommand(TFT.INVCTR) #Display inversion control data1 = bytearray(1) # data1[0] = 0x07 self._writedata(data1) self._writecommand(TFT.PWCTR1) #Power control data3[0] = 0xA2 # data3[1] = 0x02 # data3[2] = 0x84 # self._writedata(data3) time.sleep_us(10) self._writecommand(TFT.PWCTR2) #Power control data1[0] = 0xC5 # self._writedata(data1) self._writecommand(TFT.PWCTR3) #Power control data2 = bytearray(2) data2[0] = 0x0A # data2[1] = 0x00 # self._writedata(data2) self._writecommand(TFT.PWCTR4) #Power control data2[0] = 0x8A # data2[1] = 0x2A # self._writedata(data2) self._writecommand(TFT.PWCTR5) #Power control data2[0] = 0x8A # data2[1] = 0xEE # self._writedata(data2) self._writecommand(TFT.VMCTR1) #Power control data1[0] = 0x0E # self._writedata(data1) time.sleep_us(10) self._writecommand(TFT.MADCTL) data1[0] = 0xC8 #row address/col address, bottom to top refresh self._writedata(data1) #These different values don't seem to make a difference. # dataGMCTRP = bytearray([0x0f, 0x1a, 0x0f, 0x18, 0x2f, 0x28, 0x20, 0x22, 0x1f, # 0x1b, 0x23, 0x37, 0x00, 0x07, 0x02, 0x10]) dataGMCTRP = bytearray([0x02, 0x1c, 0x07, 0x12, 0x37, 0x32, 0x29, 0x2d, 0x29, 0x25, 0x2b, 0x39, 0x00, 0x01, 0x03, 0x10]) self._writecommand(TFT.GMCTRP1) self._writedata(dataGMCTRP) # dataGMCTRN = bytearray([0x0f, 0x1b, 0x0f, 0x17, 0x33, 0x2c, 0x29, 0x2e, 0x30, # 0x30, 0x39, 0x3f, 0x00, 0x07, 0x03, 0x10]) dataGMCTRN = bytearray([0x03, 0x1d, 0x07, 0x06, 0x2e, 0x2c, 0x29, 0x2d, 0x2e, 0x2e, 0x37, 0x3f, 0x00, 0x00, 0x02, 0x10]) self._writecommand(TFT.GMCTRN1) self._writedata(dataGMCTRN) time.sleep_us(10) self._writecommand(TFT.CASET) #Column address set. self.windowLocData[0] = 0x00 self.windowLocData[1] = 0x02 #Start at column 2 self.windowLocData[2] = 0x00 self.windowLocData[3] = self._size[0] - 1 self._writedata(self.windowLocData) self._writecommand(TFT.RASET) #Row address set. self.windowLocData[1] = 0x01 #Start at row 2. self.windowLocData[3] = self._size[1] - 1 self._writedata(self.windowLocData) data1 = bytearray(1) self._writecommand(TFT.COLMOD) #Set color mode. data1[0] = 0x05 #16 bit color. self._writedata(data1) time.sleep_us(10) self._writecommand(TFT.NORON) #Normal display on. time.sleep_us(10) self._writecommand(TFT.RAMWR) time.sleep_us(500) self._writecommand(TFT.DISPON) self.cs(1) time.sleep_us(500) #@micropython.native def initg( self ) : '''Initialize a green tab version.''' self._reset() self._writecommand(TFT.SWRESET) #Software reset. time.sleep_us(150) self._writecommand(TFT.SLPOUT) #out of sleep mode. time.sleep_us(255) data3 = bytearray([0x01, 0x2C, 0x2D]) #fastest refresh, 6 lines front, 3 lines back. self._writecommand(TFT.FRMCTR1) #Frame rate control. self._writedata(data3) self._writecommand(TFT.FRMCTR2) #Frame rate control. self._writedata(data3) data6 = bytearray([0x01, 0x2c, 0x2d, 0x01, 0x2c, 0x2d]) self._writecommand(TFT.FRMCTR3) #Frame rate control. self._writedata(data6) time.sleep_us(10) self._writecommand(TFT.INVCTR) #Display inversion control self._writedata(bytearray([0x07])) self._writecommand(TFT.PWCTR1) #Power control data3[0] = 0xA2 data3[1] = 0x02 data3[2] = 0x84 self._writedata(data3) self._writecommand(TFT.PWCTR2) #Power control self._writedata(bytearray([0xC5])) data2 = bytearray(2) self._writecommand(TFT.PWCTR3) #Power control data2[0] = 0x0A #Opamp current small data2[1] = 0x00 #Boost frequency self._writedata(data2) self._writecommand(TFT.PWCTR4) #Power control data2[0] = 0x8A #Opamp current small data2[1] = 0x2A #Boost frequency self._writedata(data2) self._writecommand(TFT.PWCTR5) #Power control data2[0] = 0x8A #Opamp current small data2[1] = 0xEE #Boost frequency self._writedata(data2) self._writecommand(TFT.VMCTR1) #Power control self._writedata(bytearray([0x0E])) self._writecommand(TFT.INVOFF) self._setMADCTL() self._writecommand(TFT.COLMOD) self._writedata(bytearray([0x05])) self._writecommand(TFT.CASET) #Column address set. self.windowLocData[0] = 0x00 self.windowLocData[1] = 0x01 #Start at row/column 1. self.windowLocData[2] = 0x00 self.windowLocData[3] = self._size[0] - 1 self._writedata(self.windowLocData) self._writecommand(TFT.RASET) #Row address set. self.windowLocData[3] = self._size[1] - 1 self._writedata(self.windowLocData) dataGMCTRP = bytearray([0x02, 0x1c, 0x07, 0x12, 0x37, 0x32, 0x29, 0x2d, 0x29, 0x25, 0x2b, 0x39, 0x00, 0x01, 0x03, 0x10]) self._writecommand(TFT.GMCTRP1) self._writedata(dataGMCTRP) dataGMCTRN = bytearray([0x03, 0x1d, 0x07, 0x06, 0x2e, 0x2c, 0x29, 0x2d, 0x2e, 0x2e, 0x37, 0x3f, 0x00, 0x00, 0x02, 0x10]) self._writecommand(TFT.GMCTRN1) self._writedata(dataGMCTRN) self._writecommand(TFT.NORON) #Normal display on. time.sleep_us(10) self._writecommand(TFT.DISPON) time.sleep_us(100) self.cs(1) def maker( ) : t = TFT(1, "X1", "X2") print("Initializing") t.initr() t.fill(0) return t def makeb( ) : t = TFT(1, "X1", "X2") print("Initializing") t.initb() t.fill(0) return t def makeg( ) : t = TFT(1, "X1", "X2") print("Initializing") t.initg() t.fill(0) return tsysfont.py
#Font used for ST7735 display. #Each character uses 5 bytes. #index using ASCII value * 5. #Each byte contains a column of pixels. #The character may be 8 pixels high and 5 wide. sysfont = {"Width": 5, "Height": 8, "Start": 0, "End": 254, "Data": bytearray([ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 0x18, 0x3C, 0x18, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x18, 0x24, 0x18, 0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x26, 0x29, 0x79, 0x29, 0x26, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x14, 0x22, 0x7F, 0x22, 0x14, 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, 0x66, 0x89, 0x95, 0x6A, 0x60, 0x60, 0x60, 0x60, 0x60, 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x08, 0x04, 0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x20, 0x10, 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x30, 0x38, 0x3E, 0x38, 0x30, 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x23, 0x13, 0x08, 0x64, 0x62, 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x80, 0x70, 0x30, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x72, 0x49, 0x49, 0x49, 0x46, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x41, 0x21, 0x11, 0x09, 0x07, 0x36, 0x49, 0x49, 0x49, 0x36, 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, 0x08, 0x14, 0x22, 0x41, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x41, 0x22, 0x14, 0x08, 0x02, 0x01, 0x59, 0x09, 0x06, 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x3E, 0x41, 0x41, 0x51, 0x73, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x26, 0x49, 0x49, 0x49, 0x32, 0x03, 0x01, 0x7F, 0x01, 0x03, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08, 0x14, 0x63, 0x03, 0x04, 0x78, 0x04, 0x03, 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x41, 0x41, 0x41, 0x7F, 0x04, 0x02, 0x01, 0x02, 0x04, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x03, 0x07, 0x08, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x7F, 0x28, 0x44, 0x44, 0x38, 0x38, 0x44, 0x44, 0x44, 0x28, 0x38, 0x44, 0x44, 0x28, 0x7F, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x7C, 0x08, 0x04, 0x04, 0x78, 0x38, 0x44, 0x44, 0x44, 0x38, 0xFC, 0x18, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x18, 0xFC, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x48, 0x54, 0x54, 0x54, 0x24, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x44, 0x28, 0x10, 0x28, 0x44, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x41, 0x36, 0x08, 0x00, 0x02, 0x01, 0x02, 0x04, 0x02, 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x1E, 0xA1, 0xA1, 0x61, 0x12, 0x3A, 0x40, 0x40, 0x20, 0x7A, 0x38, 0x54, 0x54, 0x55, 0x59, 0x21, 0x55, 0x55, 0x79, 0x41, 0x21, 0x54, 0x54, 0x78, 0x41, 0x21, 0x55, 0x54, 0x78, 0x40, 0x20, 0x54, 0x55, 0x79, 0x40, 0x0C, 0x1E, 0x52, 0x72, 0x12, 0x39, 0x55, 0x55, 0x55, 0x59, 0x39, 0x54, 0x54, 0x54, 0x59, 0x39, 0x55, 0x54, 0x54, 0x58, 0x00, 0x00, 0x45, 0x7C, 0x41, 0x00, 0x02, 0x45, 0x7D, 0x42, 0x00, 0x01, 0x45, 0x7C, 0x40, 0xF0, 0x29, 0x24, 0x29, 0xF0, 0xF0, 0x28, 0x25, 0x28, 0xF0, 0x7C, 0x54, 0x55, 0x45, 0x00, 0x20, 0x54, 0x54, 0x7C, 0x54, 0x7C, 0x0A, 0x09, 0x7F, 0x49, 0x32, 0x49, 0x49, 0x49, 0x32, 0x32, 0x48, 0x48, 0x48, 0x32, 0x32, 0x4A, 0x48, 0x48, 0x30, 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x3A, 0x42, 0x40, 0x20, 0x78, 0x00, 0x9D, 0xA0, 0xA0, 0x7D, 0x39, 0x44, 0x44, 0x44, 0x39, 0x3D, 0x40, 0x40, 0x40, 0x3D, 0x3C, 0x24, 0xFF, 0x24, 0x24, 0x48, 0x7E, 0x49, 0x43, 0x66, 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 0xFF, 0x09, 0x29, 0xF6, 0x20, 0xC0, 0x88, 0x7E, 0x09, 0x03, 0x20, 0x54, 0x54, 0x79, 0x41, 0x00, 0x00, 0x44, 0x7D, 0x41, 0x30, 0x48, 0x48, 0x4A, 0x32, 0x38, 0x40, 0x40, 0x22, 0x7A, 0x00, 0x7A, 0x0A, 0x0A, 0x72, 0x7D, 0x0D, 0x19, 0x31, 0x7D, 0x26, 0x29, 0x29, 0x2F, 0x28, 0x26, 0x29, 0x29, 0x29, 0x26, 0x30, 0x48, 0x4D, 0x40, 0x20, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x38, 0x2F, 0x10, 0xC8, 0xAC, 0xBA, 0x2F, 0x10, 0x28, 0x34, 0xFA, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x08, 0x14, 0x2A, 0x14, 0x22, 0x22, 0x14, 0x2A, 0x14, 0x08, 0xAA, 0x00, 0x55, 0x00, 0xAA, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x14, 0x14, 0x14, 0xFF, 0x00, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x14, 0x14, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x14, 0x14, 0xF4, 0x04, 0xFC, 0x14, 0x14, 0x17, 0x10, 0x1F, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0x1F, 0x00, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10, 0x10, 0xF0, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x14, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0x10, 0x17, 0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, 0x17, 0x10, 0x17, 0x14, 0x14, 0xF4, 0x04, 0xF4, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14, 0x17, 0x14, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0xF4, 0x14, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x00, 0x00, 0x1F, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x14, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x00, 0x00, 0xF0, 0x10, 0xF0, 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x14, 0x14, 0x14, 0xFF, 0x14, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x38, 0x44, 0x44, 0x38, 0x44, 0x7C, 0x2A, 0x2A, 0x3E, 0x14, 0x7E, 0x02, 0x02, 0x06, 0x06, 0x02, 0x7E, 0x02, 0x7E, 0x02, 0x63, 0x55, 0x49, 0x41, 0x63, 0x38, 0x44, 0x44, 0x3C, 0x04, 0x40, 0x7E, 0x20, 0x1E, 0x20, 0x06, 0x02, 0x7E, 0x02, 0x02, 0x99, 0xA5, 0xE7, 0xA5, 0x99, 0x1C, 0x2A, 0x49, 0x2A, 0x1C, 0x4C, 0x72, 0x01, 0x72, 0x4C, 0x30, 0x4A, 0x4D, 0x4D, 0x30, 0x30, 0x48, 0x78, 0x48, 0x30, 0xBC, 0x62, 0x5A, 0x46, 0x3D, 0x3E, 0x49, 0x49, 0x49, 0x00, 0x7E, 0x01, 0x01, 0x01, 0x7E, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x44, 0x44, 0x5F, 0x44, 0x44, 0x40, 0x51, 0x4A, 0x44, 0x40, 0x40, 0x44, 0x4A, 0x51, 0x40, 0x00, 0x00, 0xFF, 0x01, 0x03, 0xE0, 0x80, 0xFF, 0x00, 0x00, 0x08, 0x08, 0x6B, 0x6B, 0x08, 0x36, 0x12, 0x36, 0x24, 0x36, 0x06, 0x0F, 0x09, 0x0F, 0x06, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x30, 0x40, 0xFF, 0x01, 0x01, 0x00, 0x1F, 0x01, 0x01, 0x1E, 0x00, 0x19, 0x1D, 0x17, 0x12, 0x00, 0x3C, 0x3C, 0x3C, 0x3C ])}ну все, пропала ветка